Optical Proximity Correction (OPC)
Optical proximity correction (OPC) is a photolithography enhancement technique commonly used to compensate for image errors due to diffraction or process effects. The need for OPC is seen mainly in the making of semiconductor devices and is due to the limitations of light to resolve ever-finer details of patterns on the photo masks that are used to etch semiconductor passivation layers and create the building blocks of the transistors and other elements that make up integrated circuits. These projected images appear with irregularities such as rounded corners and with trace widths that are narrower than designed. Such distortions would significantly alter the electrical properties of what was being fabricated if there was no way to compensate for the diffraction effects. OPC anticipates the irregularities of shape and size and applies corrective compensation to the photo mask images, which then produce a light beam that more closely approximates the intended shapes.
OPC in the LayoutEditor
The LayoutEditor includes all necessary features to perform a simple manual OPC. For the modification you can use the functions ModifyCorners and Sizeadjust. A OPC is always specific to a technology and each layer had to be corrected in a different way. A good way to implement is to use a macro for this task. An example of a OPC-macro for two layers is attached.
For a complex OPC with all its effects a special OPC tool is recommended. e.g. GenISys' LayoutBeamer
Example for a OPC Macro
1 #!/usr/bin/layout
2 #name=Macro: opc-demo
3 #help=Example for a OPC
4
5
6 int main(){
7 // flatt all
8 layout->drawing->selectAll();
9 layout->drawing->flatAll();
10 layout->drawing->deselectAll();
11
12 // process layer 46:
13 // merge to layer 8
14 layout->drawing->activeLayer=46;
15 layout->drawing->selectActiveLayer();
16 layout->booleanTool->setA();
17 layout->booleanTool->setB();
18 layout->drawing->activeLayer=8;
19 layout->booleanTool->aPlusB();
20 //adjust structures
21 layout->drawing->currentCell->sizeadjustSelect(-30);
22 layout->drawing->currentCell->modifyCornersSelect( 50, 2.5 );
23
24 // process layer 43:
25 // merge to layer 9
26 layout->drawing->activeLayer=43;
27 layout->drawing->selectActiveLayer();
28 layout->booleanTool->setA();
29 layout->booleanTool->setB();
30 layout->drawing->activeLayer=9;
31 layout->booleanTool->aPlusB();
32 //adjust structures
33 layout->drawing->currentCell->sizeadjustSelect(-15);
34 layout->drawing->currentCell->modifyCornersSelect( 80, 1.8 );
35
36 }