There are actually many varieties of and methods for making these. They are often made of gate arrays, which are made up of blocks that perform different logic functions. One designs in software some circuit that performs a desired function, and then the circuit is implemented by selection of gate configuration (by making, or destroying connections) at manufacture time. Here's a Wikipedia article.