MOSIS Library
MOSIS provides access to fabrication of prototype and low-volume production quantities of integrated circuits for different processes. A scalable CMOS design rule set is provided for all processes. More exact it is a group of different design rule sets. To make it easier to use these design rules with the LayoutEditor, a template for the different MOSIS design rules is shipped with the LayoutEditor. This library will help you to understand the LayoutEditor libraries and help you to get your own CMOS library running. Don't use this library out off the box for a real layout.
Setup
Following setup steps had to be done:
- edit the 'constants.layout' file and enter your process. (number of metal layers, std cell library file, etc.)
- there are three basic set of rules in the MOSIS-SCMOS (scmos, subm, deep) copy the required file to 'rules.layout'
- download and save the std. cell library file and pad library file to the 'mosisSCMOS' folder
- execute the layer setup macro (mainmenu/utilities/macro/mosisSCMOS)
- review and extend the library to your requirements.
Library
Macros
3dView.layout
1 #!/usr/bin/layout
2 #name=3d view
3 #help=3d view of all layers until metal 3
4
5 #include "../../../../../library/mosisSCMOS/library.layout"
6
7 int main(){
8 layout->view3dTool->clearModel();
9 if (layers::num[45].visible) {
10 layout->booleanTool->addLayerA(43); //active
11 layout->booleanTool->addLayerB(46); //poly
12 layout->booleanTool->performAMinusB();
13 layout->booleanTool->setResultToA();
14 layout->booleanTool->addLayerB(45); //n
15 layout->booleanTool->performAMultiB();
16 layout->view3dTool->slantBlockToModel(-1,45,-100,0,0,100);//n implant
17 }
18 if (layers::num[44].visible) {
19 layout->booleanTool->addLayerA(43);
20 layout->booleanTool->addLayerB(46);
21 layout->booleanTool->performAMinusB();
22 layout->booleanTool->setResultToA();
23 layout->booleanTool->addLayerB(44); //p
24 layout->booleanTool->performAMultiB();
25 layout->view3dTool->slantBlockToModel(-1,44,-100,0,0,100);// p implant
26 }
27 if (layers::num[48].visible){
28 layout->booleanTool->addLayerA(43);
29 layout->booleanTool->addLayerB(48); //con
30 layout->booleanTool->performAMinusB();
31 layout->view3dTool->blockToModel(-1,238,0,80);
32 layout->booleanTool->addLayerA(48);
33 layout->booleanTool->addLayerB(43);
34 layout->booleanTool->performAMultiB();
35 layout->view3dTool->slantBlockToModel(-1,48,0,1000,-100,-50); // contact
36 }
37 if (layers::num[46].visible){
38 layout->booleanTool->addLayerA(46);
39 layout->booleanTool->addLayerB(43);
40 layout->booleanTool->performAMultiB();
41 layout->view3dTool->slantBlockToModel(-1,46,80,480,-70,0); // poly
42 layout->booleanTool->addLayerA(46);
43 layout->booleanTool->addLayerB(43);
44 layout->booleanTool->performAMinusB();
45 layout->view3dTool->slantBlockToModel(-1,46,300,700,10,80); //poly
46 }
47
48 if (layers::num[48].visible) {
49 layout->booleanTool->addLayerA(10);
50 layout->booleanTool->addLayerB(46);
51 layout->booleanTool->performAMultiB();
52 layout->view3dTool->slantBlockToModel(-1,48,700,1000,-100,-50); //contact
53 }
54 if (layers::num[49].visible) layout->view3dTool->slantBlockToModel(49,49,1000,1700,-100,0); //metal1
55 if (layers::num[50].visible) layout->view3dTool->slantBlockToModel(50,50,1700,2400,-100,0);
56 if (layers::num[51].visible) layout->view3dTool->slantBlockToModel(51,51,2400,3100,-100,0); //metal2
57 if (layers::num[61].visible) layout->view3dTool->blockToModel(61,61,3100,3800);
58 if (layers::num[62].visible) layout->view3dTool->blockToModel(62,62,3800,4800); //metal 3
59 if ( metalLayer() >3 ) {
60 if (layers::num[30].visible) layout->view3dTool->blockToModel(30,30,4800,5800);
61 if (layers::num[31].visible) layout->view3dTool->blockToModel(31,31,5800,7000); //metal 4
62 }
63 if ( metalLayer() >4 ) {
64 if (layers::num[19].visible) layout->view3dTool->blockToModel(18,18,7000,8200);
65 if (layers::num[19].visible) layout->view3dTool->blockToModel(19,19,8200,9400); //metal 5
66 }
67 if ( metalLayer() > 5 ) {
68 if (layers::num[20].visible) layout->view3dTool->blockToModel(20,20,9400,10600);
69 if (layers::num[21].visible) layout->view3dTool->blockToModel(21,21,10600,11800); //metal 6
70 }
71 layout->view3dTool->trigger3dRenderModel();
72 }
73
drc.layout
1 #!/usr/bin/layout
2 #name=DRC (partial)
3 #help=runs some DRCs checks as example
4
5 #include "../../../../../library/mosisSCMOS/library.layout"
6
7
8 int main(){
9 layout->drcTool->ruleName= "Poly: minimum size (rule 3.1)";
10 layout->drcTool->minimumSize(rule("3.1"),46,true);
11 layout->drcTool->ruleName= "Poly: minimum distance (rule 3.2)";
12 layout->drcTool->minimumElementDistance(rule("3.2"),46,true);
13 layout->drcTool->ruleName= "Poly extension past active (rule 3.3)";
14 layout->drcTool->minimumEnclosure(rule("3.3"),46,43);
15 layout->drcTool->ruleName= "Poly extension past poly on active (rule 3.4)";
16 layout->drcTool->minimumEnclosure(rule("3.4"),43,46);
17
18 layout->drcTool->ruleName= "Metal1: minimum size (rule 7.1)";
19 layout->drcTool->minimumSize(rule("7.1"),49,true);
20 layout->drcTool->ruleName= "Metal1: minimum distance (rule 7.2)";
21 layout->drcTool->minimumElementDistance(rule("7.2"),49,true);
22
23 }
setProcess.layout
1 #!/usr/bin/layout
2 #name=process setup
3 #help=information on the process setup
4
5 #include "../../../../../library/mosisSCMOS/library.layout"
6
7 int main(){
8 string s;
9 s="The setup uses '"+processname()+"'\n\n";
10 s+="To change the setup edit the file\n";
11 s+="'mosisSCMOS/constants.layout' and\n";
12 s+="copy the correct rules file to\n";
13 s+="'mosisSCMOS/rules.layout\n";
14 s+="\n";
15 s+="Attention: \n";
16 s+="The mosisSCMOS library is an example only!\n";
17 s+="Don't use it on a real IC design without\n";
18 s+="adapting it to the process you use!\n";
19 s+="There is no warranty for this library!\n";
20 layout->showMessage("Process Info",s);
21 }
setupLayer.layout
1 #!/usr/bin/layout
2 #name=layer setup SCMOS
3 #help=layer setup macro for mosis scalable cmos processes. set process before calling this macro.
4
5 #include "../../../../../library/mosisSCMOS/library.layout"
6
7 int main(){
8 setup::defaultTextWidth= 500;
9 setup::gdsAutoMapDatatypes=false;
10 setup::oasisAutoMapDatatypes=false;
11 setup::paintEngine=1;
12 setup::gdsMapLayer=false;
13 setup::oasisMapLayer=false;
14 setup::autoDisableUnusedLayers=false;
15 layers::disableAllLayer();
16 layers::num[25].enable();
17 layers::num[25].name="CONTACT";
18 layers::num[25].setStyle(7);
19 layers::num[25].setColor(184,184,184);
20 layers::num[25].shortkey="c";
21 layers::num[26].enable();
22 layers::num[26].name="PADS";
23 layers::num[26].setStyle(26);
24 layers::num[26].setColor(38,110,192);
25 layers::num[26].shortkey="Ctrl+p";
26 if (useCaps()) layers::num[28].enable();
27 layers::num[28].name="POLY_CAP1";
28 layers::num[28].setStyle(8);
29 layers::num[28].setColor(214,110,19);
30 layers::num[28].shortkey="a";
31 if (useCaps()) layers::num[29].enable();
32 layers::num[29].name="SILICIDE_BLOCK";
33 layers::num[29].setStyle(0);
34 layers::num[29].setColor(31,233,159);
35 layers::num[29].shortkey="0";
36 if (metalLayer() >3) layers::num[30].enable();
37 layers::num[30].name="VIA3";
38 layers::num[30].setStyle(1);
39 layers::num[30].setColor(197,206,210);
40 layers::num[30].shortkey="1";
41 if (metalLayer() >3) layers::num[31].enable();
42 layers::num[31].name="METAL4";
43 layers::num[31].setStyle(2);
44 layers::num[31].setColor(187,130,37);
45 layers::num[31].shortkey="Ctrl+2";
46 if (metalLayer() >4) layers::num[32].enable();
47 layers::num[32].name="VIA4";
48 layers::num[32].setStyle(3);
49 layers::num[32].setColor(51,164,10);
50 layers::num[32].shortkey="2";
51 if (metalLayer() >4) layers::num[33].enable();
52 layers::num[33].name="METAL5";
53 layers::num[33].setStyle(4);
54 layers::num[33].setColor(37,141,125);
55 layers::num[33].shortkey="Ctrl+3";
56 if (useCaps())layers::num[34].enable();
57 layers::num[34].name="HI_RES_IMPLANT";
58 layers::num[34].setStyle(5);
59 layers::num[34].setColor(30,37,228);
60 layers::num[34].shortkey="3";
61 if (useCaps()) layers::num[35].enable();
62 layers::num[35].name="CAP_TOP_METAL";
63 layers::num[35].setStyle(6);
64 layers::num[35].setColor(205,182,68);
65 layers::num[35].shortkey="Ctrl+4";
66 if (metalLayer() >5) layers::num[36].enable();
67 layers::num[36].name="VIA5";
68 layers::num[36].setStyle(7);
69 layers::num[36].setColor(43,182,36);
70 layers::num[36].shortkey="4";
71 if (metalLayer() >5) layers::num[37].enable();
72 layers::num[37].name="METAL6";
73 layers::num[37].setStyle(8);
74 layers::num[37].setColor(10,149,159);
75 layers::num[37].shortkey="Ctrl+5";
76 layers::num[38].enable();
77 layers::num[38].name="DEEP_N_WELL";
78 layers::num[38].setStyle(9);
79 layers::num[38].setColor(54,36,136);
80 layers::num[41].enable();
81 layers::num[41].name="P_WELL";
82 layers::num[41].setStyle(1);
83 layers::num[41].setColor(177,24,44);
84 layers::num[42].enable();
85 layers::num[42].name="N_WELL";
86 layers::num[42].setStyle(1);
87 layers::num[42].setColor(30,26,154);
88 layers::num[43].enable();
89 layers::num[43].name="ACTIVE";
90 layers::num[43].setStyle(9);
91 layers::num[43].setColor(77,131,76);
92 layers::num[44].enable();
93 layers::num[44].name="P_PLUS_SELECT";
94 layers::num[44].setStyle(8);
95 layers::num[44].setColor(162,133,99);
96 layers::num[45].enable();
97 layers::num[45].name="N_PLUS_SELECT";
98 layers::num[45].setStyle(8);
99 layers::num[45].setColor(214,96,208);
100 layers::num[46].enable();
101 layers::num[46].name="POLY";
102 layers::num[46].setStyle(5);
103 layers::num[46].setColor(139,63,63);
104 layers::num[46].shortkey="p";
105 layers::num[47].enable();
106 layers::num[47].name="POLY_CONTACT";
107 layers::num[47].setStyle(5);
108 layers::num[47].setColor(195,207,204);
109 layers::num[48].enable();
110 layers::num[48].name="ACTIVE_CONTACT";
111 layers::num[48].setStyle(5);
112 layers::num[48].setColor(218,229,236);
113 layers::num[49].enable();
114 layers::num[49].name="METAL1";
115 layers::num[49].setStyle(8);
116 layers::num[49].setColor(72,87,213);
117 layers::num[49].shortkey="a";
118 layers::num[50].enable();
119 layers::num[50].name="VIA";
120 layers::num[50].setStyle(2);
121 layers::num[50].setColor(178,190,190);
122 layers::num[50].shortkey="v";
123 layers::num[51].enable();
124 layers::num[51].name="METAL2";
125 layers::num[51].setStyle(7);
126 layers::num[51].setColor(81,195,212);
127 layers::num[51].shortkey="Ctrl+2";
128 layers::num[52].enable();
129 layers::num[52].name="GLASS";
130 layers::num[52].setStyle(23);
131 layers::num[52].setColor(9,144,119);
132 if (poly2()) layers::num[55].enable();
133 layers::num[55].name="POLY2_CONTACT";
134 layers::num[55].setStyle(7);
135 layers::num[55].setColor(167,185,182);
136 if (poly2()) layers::num[56].enable();
137 layers::num[56].name="POLY2";
138 layers::num[56].setStyle(7);
139 layers::num[56].setColor(147,162,154);
140 if (useCaps()) layers::num[58].enable();
141 layers::num[58].name="PBASE";
142 layers::num[58].setStyle(5);
143 layers::num[58].setColor(226,23,209);
144 if (useCaps()) layers::num[59].enable();
145 layers::num[59].name="CAP_WELL";
146 layers::num[59].setStyle(0);
147 layers::num[59].setColor(132,132,132);
148 layers::num[60].enable();
149 layers::num[60].name="THICK_ACTIVE";
150 layers::num[60].setStyle(2);
151 layers::num[60].setColor(60,150,180);
152 layers::num[60].shortkey="b";
153 layers::num[61].enable();
154 layers::num[61].name="VIA2";
155 layers::num[61].setStyle(3);
156 layers::num[61].setColor(189,198,191);
157 layers::num[62].enable();
158 layers::num[62].name="METAL3";
159 layers::num[62].setStyle(4);
160 layers::num[62].setColor(172,165,62);
161 layers::num[64].enable();
162 layers::num[64].name="Comments";
163 layers::num[64].setStyle(6);
164 layers::num[64].setColor(26,118,198);
165 layout->netlistTool->technologyLayerRemoveAll();
166 layout->netlistTool->libraryRemoveAll();
167 layout->netlistTool->technologyLayerAdd(46,2); //poly
168 layout->netlistTool->technologyLayerSetParameter(46,0,0);
169 layout->netlistTool->technologyLayerSetParameter(46,1,rule("3.1"));//width
170 layout->netlistTool->technologyLayerSetParameter(46,2,rule("3.2"));//space
171 layout->netlistTool->technologyLayerAdd(47,1); // via
172 layout->netlistTool->technologyLayerSetParameter(47,0,1);
173 layout->netlistTool->technologyLayerSetParameter(47,1,rule("5.1"));//via size
174 layout->netlistTool->technologyLayerSetParameter(47,2,rule("5.3"));//via space
175 layout->netlistTool->technologyLayerSetParameter(47,3,rule("5.2"));// edge lower
176 layout->netlistTool->technologyLayerSetParameter(47,4,rule("8.3"));// edge upper
177 layout->netlistTool->technologyLayerSetParameter(47,5,0);//via shape
178 layout->netlistTool->technologyLayerAdd(49,2); //metall 1
179 layout->netlistTool->technologyLayerSetParameter(49,0,2);
180 layout->netlistTool->technologyLayerSetParameter(49,1,rule("7.1"));
181 layout->netlistTool->technologyLayerSetParameter(49,2,rule("7.2"));
182 layout->netlistTool->technologyLayerAdd(50,1); // via1
183 layout->netlistTool->technologyLayerSetParameter(50,0,3);
184 layout->netlistTool->technologyLayerSetParameter(50,1,rule("8.1"));//via size
185 layout->netlistTool->technologyLayerSetParameter(50,2,rule("8.2"));//via space
186 layout->netlistTool->technologyLayerSetParameter(50,3,rule("8.3"));// edge lower
187 layout->netlistTool->technologyLayerSetParameter(50,4,rule("9.3"));// edge upper
188 layout->netlistTool->technologyLayerSetParameter(50,5,0);//via shape
189 layout->netlistTool->technologyLayerAdd(51,2); //metall 2
190 layout->netlistTool->technologyLayerSetParameter(51,0,4);
191 layout->netlistTool->technologyLayerSetParameter(51,1,rule("9.1"));//width
192 layout->netlistTool->technologyLayerSetParameter(51,2,rule("9.2"));//space
193 layout->netlistTool->technologyLayerAdd(61,1);
194 layout->netlistTool->technologyLayerSetParameter(61,0,5);
195 layout->netlistTool->technologyLayerSetParameter(61,1,rule("14.1"));//via size
196 layout->netlistTool->technologyLayerSetParameter(61,2,rule("14.2"));//via space
197 layout->netlistTool->technologyLayerSetParameter(61,3,rule("14.3"));// edge lower
198 layout->netlistTool->technologyLayerSetParameter(61,4,rule("15.3"));// edge upper
199 layout->netlistTool->technologyLayerSetParameter(61,5,0);//via shape
200 layout->netlistTool->technologyLayerAdd(62,2); //metall 3
201 layout->netlistTool->technologyLayerSetParameter(62,0,6);
202 layout->netlistTool->technologyLayerSetParameter(62,1,rule("15.1"));//width
203 layout->netlistTool->technologyLayerSetParameter(62,2,rule("15.2"));//space
204 if (metalLayer() >3) {
205 layout->netlistTool->technologyLayerAdd(30,1);
206 layout->netlistTool->technologyLayerSetParameter(30,0,7);
207 layout->netlistTool->technologyLayerSetParameter(30,1,rule("21.1"));//via size
208 layout->netlistTool->technologyLayerSetParameter(30,2,rule("21.2"));//via space
209 layout->netlistTool->technologyLayerSetParameter(30,3,rule("21.3"));// edge lower
210 layout->netlistTool->technologyLayerSetParameter(30,4,rule("22.3"));// edge upper
211 layout->netlistTool->technologyLayerSetParameter(30,5,0);//via shape
212 layout->netlistTool->technologyLayerAdd(31,2); //metall 4
213 layout->netlistTool->technologyLayerSetParameter(31,0,8);
214 layout->netlistTool->technologyLayerSetParameter(31,1,rule("22.1"));//width
215 layout->netlistTool->technologyLayerSetParameter(31,2,rule("22.2"));//space
216 }
217 if (metalLayer() >4) {
218 layout->netlistTool->technologyLayerAdd(32,1);
219 layout->netlistTool->technologyLayerSetParameter(32,0,9);
220 layout->netlistTool->technologyLayerSetParameter(32,1,rule("25.1"));//via size
221 layout->netlistTool->technologyLayerSetParameter(32,2,rule("25.2"));//via space
222 layout->netlistTool->technologyLayerSetParameter(32,3,rule("25.3"));// edge lower
223 layout->netlistTool->technologyLayerSetParameter(32,4,rule("26.3"));// edge upper
224 layout->netlistTool->technologyLayerSetParameter(32,5,0);//via shape
225 layout->netlistTool->technologyLayerAdd(33,2); //metall 5
226 layout->netlistTool->technologyLayerSetParameter(33,0,10);
227 layout->netlistTool->technologyLayerSetParameter(33,1,rule("26.1"));//width
228 layout->netlistTool->technologyLayerSetParameter(33,2,rule("26.2"));//space
229 }
230 if (metalLayer() >5) {
231 layout->netlistTool->technologyLayerAdd(36,1);
232 layout->netlistTool->technologyLayerSetParameter(36,0,11);
233 layout->netlistTool->technologyLayerSetParameter(36,1,rule("29.1"));//via size
234 layout->netlistTool->technologyLayerSetParameter(36,2,rule("29.2"));//via space
235 layout->netlistTool->technologyLayerSetParameter(36,3,rule("29.3"));// edge lower
236 layout->netlistTool->technologyLayerSetParameter(36,4,rule("30.3"));// edge upper
237 layout->netlistTool->technologyLayerSetParameter(36,5,0);//via shape
238 layout->netlistTool->technologyLayerAdd(37,2); //metall 6
239 layout->netlistTool->technologyLayerSetParameter(37,0,12);
240 layout->netlistTool->technologyLayerSetParameter(37,1,rule("30.1"));//width
241 layout->netlistTool->technologyLayerSetParameter(37,2,rule("30.2"));//space
242 }
243 }