1 /* -*- tab-width: 4 -*-
2 *
3 * Electric(tm) VLSI Design System
4 *
5 * File: romgen.java
6 * User interface tool: main module
7 * Written by: David Harris (David_Harris@hmc.edu)
8 * Based on code developed by Frank Lee <chlee@hmc.edu> and Jason Imada <jimada@hmc.edu>
9 *
10 * Copyright (c) 2003 Static Free Software.
11 *
12 * Electric(tm) is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
16 *
17 * Electric(tm) is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with Electric(tm); see the file COPYING. If not, write to
24 * the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
25 * Boston, Mass 02111-1307, USA.
26 *
27 * Static Free Software
28 * 4119 Alpine Road
29 * Portola Valley, California 94028
30 * info@staticfreesoft.com
31 */
32
33 /*
34 * The romgen.java code creates layout for a pseudo-nMOS ROM array in Electric.
35 *
36 * To compile romgen.java, place the file in the
37 * lib/java subdirectory of your Electric install directory and
38 * compile it with:
39 *
40 * javac romgen.java
41 *
42 * to produce the romgen.class file in the same subdirectory.
43 * Note that this should be done automatically by the "Makefile".
44 *
45 * The ROM generator can be invoked from inside of Electric with the
46 * "Tools / Generator / ROM..." command. You can also invoke it
47 * directly in the Java interpreter by typing:
48 * romgen.main("romtable.txt", "rom", 600)
49 * where "romtable.txt" is the name of the personality file, "rom"
50 * is the prefix for cell names that will be generated, and 600 is
51 * the feature size (twice lambda) measured in nanometers.
52 *
53 * The personality file has this format:
54 * The first line lists the degree of folding. For example,
55 * a 256-word x 10-bit ROM with a folding degree of 4 will
56 * be implemented as a 64 x 40 array with 4:1 column multiplexers
57 * to return 10 bits of data while occupying more of a square form
58 * factor. The number of words and degree of folding should be
59 * powers of 2. The remaining lines of the file list the contents
60 * of each word. The parser is pretty picky. There should
61 * be a carriage return after the list word, but no other blank
62 * lines in the file.
63 *
64 * The tool may be slow, especially for large ROMs. When done, there may be some
65 * extraneous and bad pins left over; using "Edit / Cleanup Cell / Cleanup
66 * Pins Everywhere" and "Info / Check and Repair Libraries" will fix these
67 * (though this isn't strictly necessary).
68 *
69 * The ROMs produced should pass DRC and ERC and simulate with IRSIM. One
70 * was successfully fabricated Spring of 2002 by Genevieve Breed and Matthew
71 * Erler in the MOSIS 0.6 micron AMI process.
72 *
73 * Happy Hacking!
74 */
75
76 /* libraries */
77 import java.io.*;
78 import COM.staticfreesoft.*;
79
80 public class romgen {
81
82 public static int globalbits;
83 public static int folds;
84 public static int lambda = (int) (0.3*2000);
85
86 //constants for setting export type
87 final static public int STATEBITS = 036000000000;
88 final static public int INPORT = 020000000000;
89 final static public int OUTPORT = 022000000000;
90 final static public int BIDIRPORT = 024000000000;
91 final static public int PWRPORT = 026000000000;
92 final static public int GNDPORT = 030000000000;
93
94 ///////////////////romarraygen start
romarraygen(String romfile)95 public static int[][] romarraygen(String romfile) {
96 boolean end = false;
97 int[][] returnarray = new int[1][1];
98 //romfile = romfile+".txt";
99
100 try {
101 BufferedReader in = new BufferedReader(new FileReader(romfile));
102 try {
103 int w = -1;
104 int bits = 0;
105 StringBuffer sb;
106 StringBuffer allfile = new StringBuffer();
107 while (!end) {
108 w++;
109 String temp = in.readLine();
110 if (temp == null) {
111 end = true;
112 }
113 else {
114 sb = new StringBuffer(temp);
115 if (w==1) {
116 bits = sb.length();
117 }
118 if (w==0) {
119 folds = Integer.parseInt(temp,10);
120 }
121 else {
122 allfile.append(sb);
123 }
124 }
125 }
126 w--;
127 //set globalbits
128 globalbits = w/folds;
129 returnarray = new int[bits][w];
130 for (int r=0; r<w; r++) {
131 for (int s=0; s<bits; s++) {
132 if (allfile.charAt(r*bits + s) == '1') {
133 returnarray[s][w-r-1] = 1;
134 }
135 else {
136 returnarray[s][w-r-1] = 0;
137 }
138 }
139 }
140 } catch (IOException e) {
141 }
142 } catch(FileNotFoundException e) {
143 System.out.println(e.toString());
144 }
145 return returnarray;
146 }
147 //////////////////romarraygen end
148
149 /////////////////generateplane
generateplane(int bits)150 public static int[][] generateplane(int bits) {
151 int lines = (int) (Math.pow(2.0, (double) bits));
152 char[][] wordlines = new char[lines][bits];
153 for (int i = 0; i<lines; i++) {
154 int len = Integer.toBinaryString(i).length();
155 int leadingz = bits - len;
156 int h;
157 for (h=0; h<leadingz; h++) {
158 wordlines[i][h] = '0';
159 }
160 for (int j=h; j<bits; j++) {
161 wordlines[i][j] = Integer.toBinaryString(i).charAt(j-h);
162 }
163 }
164 int[][] x = new int[lines][bits];
165 for (int j = 0; j<lines; j++) {
166 for (int k = 0; k<bits; k++) {
167 x[j][k] = Character.getNumericValue(wordlines[j][k]);
168 }
169 }
170 int[][] wcomp = new int[lines][2*bits];
171 for (int j = 0; j<lines; j++) {
172 for (int k = 0; k<bits; k++) {
173 wcomp[j][(2*k)] = x[j][k];
174 int complement;
175 if (x[j][k] == 1) {
176 complement = 0;
177 }
178 else {
179 complement = 1;
180 }
181 wcomp[j][(2*k)+1] = complement;
182 }
183 }
184 int[][] wcompb = new int[lines][2*bits];
185 for (int j = 0; j<lines; j++) {
186 for (int k = 0; k<(2*bits); k++) {
187 wcompb[j][k] = wcomp[j][(2*bits)-1-k];
188 }
189 }
190 return wcompb;
191 }
192 ////////////////generateplane end
193
194 ////////////////romfold begin
romfold(int[][] romarray)195 public static int[][] romfold(int[][] romarray) {
196 int roma = romarray.length*folds;
197 int romb = romarray[1].length/folds;
198 int[][] foldedrom = new int[roma][romb];
199
200 for (int i=0; i<romarray.length; i++) {
201 for (int j=0; j<folds; j++) {
202 for (int k=0; k<romb; k++) {
203 foldedrom[folds*i+j][k] = romarray[i][j*romb+k];
204 }
205 }
206 }
207 return foldedrom;
208 }
209 ////////////////romfold end
210
211 ////////////////createExport end
createExport(Electric.PortProto p, int exporttype)212 public static void createExport(Electric.PortProto p, int exporttype) {
213 int userbits = ((Integer)Electric.getVal(p, "userbits")).intValue();
214 Electric.setVal(p,"userbits",new Integer((userbits&~STATEBITS)|exporttype),0);
215 }
216 ////////////////createExport end
217
218 /////////////main start
main(String romfile, String romcell, int featuresize)219 public static int main(String romfile, String romcell, int featuresize) {
220
221 Electric.NodeInst ap1, ap2, ap3, ap4;
222 Electric.PortProto p, apport1, apport2, apport3, apport4;
223 Integer[] appos1, appos2, appos3, appos4;
224
225 lambda = featuresize;
226 int[][] romarray = romarraygen(romfile);
227
228 String dpr = new String(romcell+"_decoderpmos");
229 String dnr = new String(romcell+"_decodernmos");
230 String dpm = new String(romcell+"_decoderpmosmux");
231 String dnm = new String(romcell+"_decodernmosmux");
232 String invt = new String(romcell+"_ininvertertop");
233 String invb = new String(romcell+"_ininverterbot");
234 String romname = new String(romcell+"_rom");
235 String rp = new String(romcell+"_romplane");
236 String ip = new String(romcell+"_inverterplane");
237 String mp = new String(romcell+"_muxplane");
238
239
240 if (folds > 1) {
241 romarray = romfold(romarray);
242 }
243 romplane(lambda, romarray, rp);
244
245 int bits =
246 (new Double(Math.ceil(Math.log(globalbits)/Math.log((double)2.0)))).intValue();
247 int words = (int) (Math.pow(2.0, (double) bits));
248 int foldbits =
249 (new Double(Math.ceil(Math.log(folds)/Math.log((double) 2.0)))).intValue();
250
251 boolean top = true;
252 boolean bot = false;
253
254 decoderpmos(lambda,bits,dpr,top);
255 decodernmos(lambda,bits,dnr,top);
256 inverterplane(lambda,romarray.length,folds, ip);
257 ininverterplane(lambda,bits,invt,top,bits);
258
259 Electric.ArcProto m1arc = Electric.getArcProto("Metal-1");
260 Electric.ArcProto m2arc = Electric.getArcProto("Metal-2");
261
262 //////////////decoderpmos
263 Electric.NodeProto decp = Electric.getNodeProto(dpr+"{lay}");
264 int[] decpbox = {((Integer)Electric.getVal(decp, "lowx")).intValue()-lambda/2,
265 ((Integer)Electric.getVal(decp, "highx")).intValue()+lambda/2,
266 ((Integer)Electric.getVal(decp, "lowy")).intValue()-lambda/2,
267 ((Integer)Electric.getVal(decp, "highy")).intValue()+lambda/2};
268 Electric.PortProto[] decpin = new Electric.PortProto[words];
269 Electric.PortProto[] decpout = new Electric.PortProto[words];
270 Electric.PortProto[] decpbit = new Electric.PortProto[2*bits];
271 Electric.PortProto decpvdd = (Electric.PortProto)Electric.getVal(decp, "vdd");
272 Electric.PortProto decpvddb = (Electric.PortProto)Electric.getVal(decp, "vddb");
273 for (int i=0; i<words; i++) {
274 decpin[i] = (Electric.PortProto)Electric.getVal(decp, "wordin"+i);
275 decpout[i] = (Electric.PortProto)Electric.getVal(decp, "word"+i);
276 }
277 for (int i=0; i<bits; i++) {
278 decpbit[2*i] = (Electric.PortProto)Electric.getVal(decp, "top_in"+i);
279 decpbit[(2*i)+1] = (Electric.PortProto)Electric.getVal(decp, "top_in"+i+"_b");
280 }
281
282 //////////////decodernmos
283 Electric.NodeProto decn = Electric.getNodeProto(dnr+"{lay}");
284 int[] decnbox = {((Integer)Electric.getVal(decn, "lowx")).intValue()-lambda/2,
285 ((Integer)Electric.getVal(decn, "highx")).intValue()+lambda/2,
286 ((Integer)Electric.getVal(decn, "lowy")).intValue()-lambda/2,
287 ((Integer)Electric.getVal(decn, "highy")).intValue()+lambda/2};
288 Electric.PortProto[] decnout = new Electric.PortProto[words];
289 Electric.PortProto[] decnin = new Electric.PortProto[words];
290 Electric.PortProto[] decnbit = new Electric.PortProto[2*bits];
291
292 for (int i=0; i<words; i++) {
293 decnin[i] = (Electric.PortProto)Electric.getVal(decn, "mid"+i);
294 decnout[i] = (Electric.PortProto)Electric.getVal(decn, "word"+i);
295 }
296 for (int i=0; i<bits; i++) {
297 decnbit[2*i] = (Electric.PortProto)Electric.getVal(decn, "top_in"+i);
298 decnbit[(2*i)+1] = (Electric.PortProto)Electric.getVal(decn, "top_in"+i+"_b");
299 }
300
301 //////////////////////romplane
302 Electric.NodeProto romp = Electric.getNodeProto(rp+"{lay}");
303 int[] rompbox = {((Integer)Electric.getVal(romp, "lowx")).intValue()-lambda/2,
304 ((Integer)Electric.getVal(romp, "highx")).intValue()+lambda/2,
305 ((Integer)Electric.getVal(romp, "lowy")).intValue()-lambda/2,
306 ((Integer)Electric.getVal(romp, "highy")).intValue()+lambda/2};
307 Electric.PortProto[] rompin = new Electric.PortProto[globalbits];
308 Electric.PortProto[] rompout = new Electric.PortProto[romarray.length];
309 Electric.PortProto[] rompgnd = new Electric.PortProto[romarray.length/2];
310 Electric.PortProto rompvdd = (Electric.PortProto) Electric.getVal(romp,"vdd");
311 Electric.PortProto rompgndc = (Electric.PortProto) Electric.getVal(romp,"gndc");
312 for (int i=0; i<globalbits; i++) {
313 rompin[i] = (Electric.PortProto)Electric.getVal(romp, "wordline_"+i);
314 }
315 for (int i=0; i<romarray.length; i++) {
316 rompout[i] = (Electric.PortProto)Electric.getVal(romp, "out_"+i);
317 }
318 for (int i=0; i<romarray.length/2; i++) {
319 rompgnd[i] = (Electric.PortProto)Electric.getVal(romp, "romgnd"+i);
320 }
321
322 //////////////////////inverterplane
323 Electric.NodeProto invp = Electric.getNodeProto(ip+"{lay}");
324 int[] invpbox = {((Integer)Electric.getVal(invp, "lowx")).intValue()-lambda/2,
325 ((Integer)Electric.getVal(invp, "highx")).intValue()+lambda/2,
326 ((Integer)Electric.getVal(invp, "lowy")).intValue()-lambda/2,
327 ((Integer)Electric.getVal(invp, "highy")).intValue()+lambda/2};
328 Electric.PortProto[] invin = new Electric.PortProto[romarray.length];
329 Electric.PortProto[] invout = new Electric.PortProto[romarray.length];
330 Electric.PortProto[] invgnd = new Electric.PortProto[romarray.length/2];
331 Electric.PortProto invvddc = (Electric.PortProto)Electric.getVal(invp, ("vdd"));
332 Electric.PortProto invgndc = (Electric.PortProto)Electric.getVal(invp, ("gnd"));
333 for (int i=0; i<romarray.length/folds; i++) {
334 invin[i] = (Electric.PortProto)Electric.getVal(invp, ("invin"+i));
335 invout[i] = (Electric.PortProto)Electric.getVal(invp, ("invout"+i));
336 }
337
338 int invplanegnd = romarray.length/folds;
339 if (folds == 1) {
340 invplanegnd = invplanegnd / 2;
341 }
342
343 for (int i=0; i<invplanegnd; i++) {
344 invgnd[i] = (Electric.PortProto)Electric.getVal(invp, ("invgnd"+i));
345 }
346
347 //////////////////////ininverterplane top
348 Electric.NodeProto ininvtp = Electric.getNodeProto(invt+"{lay}");
349 int[] ininvtpbox =
350 {((Integer)Electric.getVal(ininvtp, "lowx")).intValue()-lambda/2,
351 ((Integer)Electric.getVal(ininvtp, "highx")).intValue()+lambda/2,
352 ((Integer)Electric.getVal(ininvtp, "lowy")).intValue()-lambda/2,
353 ((Integer)Electric.getVal(ininvtp, "highy")).intValue()+lambda/2};
354 Electric.PortProto[] ivttop = new Electric.PortProto[bits];
355 Electric.PortProto[] ivtbot = new Electric.PortProto[bits];
356 Electric.PortProto[] ivtbar = new Electric.PortProto[bits];
357 Electric.PortProto ivtvdd = (Electric.PortProto)Electric.getVal(ininvtp, ("vdd"));
358 Electric.PortProto ivtgnd = (Electric.PortProto)Electric.getVal(ininvtp, ("gnd"));
359 for (int i=0; i<bits; i++) {
360 ivttop[i] = (Electric.PortProto)Electric.getVal(ininvtp, ("in_top"+i));
361 ivtbot[i] = (Electric.PortProto)Electric.getVal(ininvtp, ("in_bot"+i));
362 ivtbar[i] = (Electric.PortProto)Electric.getVal(ininvtp, ("in_b"+i));
363 }
364
365 //create new layout named "rom{lay}" in current library
366 Electric.NodeProto rom = Electric.newNodeProto(romname+"{lay}", Electric.curLib());
367
368 //////////calculate pplane offset
369 int offset = (2*bits*(8*lambda)) + (16*lambda);
370 int rompoffset = (8*lambda)*2*bits + (12*lambda) + offset;
371 int rompoffsety = 8*lambda*(globalbits+1);
372 int foldoffsetx = (2*(bits-foldbits)*(8*lambda));
373 int muxpoffsety = -6*lambda;
374 int foldoffsety = -8*lambda*(folds+1);
375 int ininvtoffset = (globalbits+2)*8*lambda+48*lambda;
376
377 int invpoffsety = -8*lambda*(folds+1)-16*lambda;
378 if (folds == 1) {
379 invpoffsety = invpoffsety + 24*lambda;
380 }
381
382 Electric.NodeInst nplane =
383 Electric.newNodeInst(decn, decnbox[0]+offset, decnbox[1]+offset, decnbox[2],
384 decnbox[3], 0, 0, rom);
385 Electric.NodeInst pplane =
386 Electric.newNodeInst(decp, decpbox[0], decpbox[1], decpbox[2], decpbox[3],
387 0, 0, rom);
388 Electric.NodeInst rompln =
389 Electric.newNodeInst(romp, rompbox[0]+rompoffset, rompbox[1]+rompoffset,
390 rompbox[2]+rompoffsety, rompbox[3]+rompoffsety,
391 0, 2700, rom);
392 Electric.NodeInst invpln =
393 Electric.newNodeInst(invp, invpbox[0]+rompoffset, invpbox[1]+rompoffset,
394 invpbox[2]+invpoffsety,invpbox[3]+invpoffsety, 0, 0, rom);
395 Electric.NodeInst ininvtop1 =
396 Electric.newNodeInst(ininvtp,ininvtpbox[0],ininvtpbox[1],
397 ininvtpbox[2]+ininvtoffset,ininvtpbox[3]+ininvtoffset,
398 0, 0, rom);
399 Electric.NodeInst ininvtop2 =
400 Electric.newNodeInst(ininvtp,ininvtpbox[0]+offset,ininvtpbox[1]+offset,
401 ininvtpbox[2]+ininvtoffset,
402 ininvtpbox[3]+ininvtoffset, 0, 0, rom);
403
404 //////////////exports on top level
405 for (int i=0; i<bits; i++) {
406 ap1 = ininvtop1;
407 apport1 = ivttop[i];
408 p = Electric.newPortProto(rom, ap1, apport1, ("sel"+i));
409 createExport(p, INPORT);
410 }
411 for (int i=0; i<romarray.length/folds; i++) {
412 ap1 = invpln;
413 apport1 = invout[i];
414 p = Electric.newPortProto(rom, ap1, apport1, ("out"+i));
415 createExport(p, OUTPORT);
416 }
417
418
419 ap2 = rompln;
420 apport2 = rompvdd;
421 p = Electric.newPortProto(rom, ap2, apport2, ("vdd"));
422 createExport(p, PWRPORT);
423
424 ap1 = nplane;
425 apport1 = (Electric.PortProto)Electric.getVal(decn, "gnd");
426 appos1 = Electric.portPosition(ap1, apport1);
427 ap2 = rompln;
428 apport2 = rompgndc;
429 appos2 = Electric.portPosition(ap2, apport2);
430 Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
431 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
432 appos2[1].intValue(),rom);
433
434 apport2 = (Electric.PortProto)Electric.getVal(romp, "gnd");
435
436 // decnout, decpin
437 for (int i=0; i<words; i++) {
438 ap1 = pplane;
439 apport1 = decpout[i];
440 appos1 = Electric.portPosition(ap1, apport1);
441 ap2 = nplane;
442 apport2 = decnin[i];
443 appos2 = Electric.portPosition(ap2, apport2);
444 Electric.newArcInst(m2arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
445 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
446 appos2[1].intValue(),rom);
447 }
448
449 for (int i=0; i<words; i++) {
450 ap1 = nplane;
451 apport1 = decnout[i];
452 appos1 = Electric.portPosition(ap1, apport1);
453 ap2 = rompln;
454 apport2 = rompin[i];
455 appos2 = Electric.portPosition(ap2, apport2);
456 Electric.newArcInst(m2arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
457 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
458 appos2[1].intValue(),rom);
459 }
460
461 ///////connect rompgnd to invgnd
462 if (folds > 1) {
463 for (int i=0; i<romarray.length/folds; i++) {
464 ap1 = invpln;
465 apport1 = invgnd[i];
466 appos1 = Electric.portPosition(ap1, apport1);
467 ap2 = rompln;
468 apport2 = rompgnd[i*folds/2];
469 appos2 = Electric.portPosition(ap2, apport2);
470 Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
471 appos1[1].intValue(), ap2,apport2,appos2[0].intValue(),
472 appos2[1].intValue(),rom);
473 }
474 } else {
475 for (int i=0; i<romarray.length/(2*folds); i++) {
476 ap1 = invpln;
477 apport1 = invgnd[i];
478 appos1 = Electric.portPosition(ap1, apport1);
479 ap2 = rompln;
480 apport2 = rompgnd[i];
481 appos2 = Electric.portPosition(ap2, apport2);
482 Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
483 appos1[1].intValue(), ap2,apport2,appos2[0].intValue(),
484 appos2[1].intValue(),rom);
485 }
486 }
487
488 ///////connect top ininv1 to ininv2
489 for (int i=0; i<bits; i++) {
490 ap1 = ininvtop1;
491 apport1 = ivttop[i];
492 appos1 = Electric.portPosition(ap1, apport1);
493 ap2 = ininvtop2;
494 apport2 = ivttop[i];
495 appos2 = Electric.portPosition(ap2, apport2);
496 Electric.newArcInst(m2arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
497 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
498 appos2[1].intValue(),rom);
499 }
500
501 ///////connect top ininv1 to ndecoder
502 for (int i=0; i<bits; i++) {
503 ap1 = ininvtop1;
504 apport1 = ivtbot[i];
505 appos1 = Electric.portPosition(ap1, apport1);
506 ap2 = pplane;
507 apport2 = decpbit[i*2];
508 appos2 = Electric.portPosition(ap2, apport2);
509 Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
510 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
511 appos2[1].intValue(),rom);
512 ap1 = ininvtop1;
513 apport1 = ivtbar[i];
514 appos1 = Electric.portPosition(ap1, apport1);
515 ap2 = pplane;
516 apport2 = decpbit[(i*2)+1];
517 appos2 = Electric.portPosition(ap2, apport2);
518 Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
519 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
520 appos2[1].intValue(),rom);
521 }
522
523 ///////connect top ininv2 to pdecoder
524 for (int i=0; i<bits; i++) {
525 ap1 = ininvtop2;
526 apport1 = ivtbot[i];
527 appos1 = Electric.portPosition(ap1, apport1);
528 ap2 = nplane;
529 apport2 = decnbit[i*2];
530 appos2 = Electric.portPosition(ap2, apport2);
531 Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
532 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
533 appos2[1].intValue(),rom);
534 ap1 = ininvtop2;
535 apport1 = ivtbar[i];
536 appos1 = Electric.portPosition(ap1, apport1);
537 ap2 = nplane;
538 apport2 = decnbit[(i*2)+1];
539 appos2 = Electric.portPosition(ap2, apport2);
540 Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
541 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
542 appos2[1].intValue(),rom);
543 }
544
545
546 ////////connect two top decoder inverterplanes and decoder together (vdd)
547 ap1 = ininvtop1;
548 apport1 = ivtvdd;
549 appos1 = Electric.portPosition(ap1, apport1);
550 ap2 = ininvtop2;
551 apport2 = ivtvdd;
552 appos2 = Electric.portPosition(ap2, apport2);
553 ap3 = pplane;
554 apport3 = decpvdd;
555 appos3 = Electric.portPosition(ap3, apport3);
556 Electric.newArcInst(m2arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
557 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
558 appos2[1].intValue(),rom);
559 Electric.newArcInst(m2arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
560 appos1[1].intValue(), ap3, apport3, appos3[0].intValue(),
561 appos3[1].intValue(),rom);
562
563 ////////connect two top decoder inverterplanes and romplane together (gnd)
564 ap1 = ininvtop1;
565 apport1 = ivtgnd;
566 appos1 = Electric.portPosition(ap1, apport1);
567 ap2 = ininvtop2;
568 apport2 = ivtgnd;
569 appos2 = Electric.portPosition(ap2, apport2);
570 ap3 = rompln;
571 apport3 = rompgndc;
572 appos3 = Electric.portPosition(ap3, apport3);
573
574 Electric.newArcInst(m2arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
575 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
576 appos2[1].intValue(),rom);
577 Electric.newArcInst(m1arc, 4*lambda, 0, ap2, apport2, appos2[0].intValue(),
578 appos2[1].intValue(), ap3, apport3, appos3[0].intValue(),
579 appos3[1].intValue(),rom);
580 p = Electric.newPortProto(rom, ap2, apport2, ("gnd"));
581 createExport(p, GNDPORT);
582
583
584 ////////connect decoder inverter vdd to rom vdd
585 ap1 = ininvtop2;
586 apport1 = ivtvdd;
587 appos1 = Electric.portPosition(ap1, apport1);
588 ap2 = rompln;
589 apport2 = rompvdd;
590 appos2 = Electric.portPosition(ap2, apport2);
591
592 Electric.newArcInst(m2arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
593 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
594 appos2[1].intValue(),rom);
595
596 //begin (folds > 1)
597 if (folds > 1) {
598 decoderpmos(lambda,foldbits,dpm,bot);
599 decodernmos(lambda,foldbits,dnm,bot);
600 ininverterplane(lambda,foldbits,invb, bot,bits);
601 muxplane(lambda,folds, romarray.length, mp);
602
603 //////////////decodernmosmux
604 Electric.NodeProto decpmux = Electric.getNodeProto(dpm+"{lay}");
605 int[] decpmuxbox =
606 {((Integer)Electric.getVal(decpmux, "lowx")).intValue()-lambda/2,
607 ((Integer)Electric.getVal(decpmux, "highx")).intValue()+lambda/2,
608 ((Integer)Electric.getVal(decpmux, "lowy")).intValue()-lambda/2,
609 ((Integer)Electric.getVal(decpmux, "highy")).intValue()+lambda/2};
610 Electric.PortProto[] decpmuxin = new Electric.PortProto[folds];
611 Electric.PortProto[] decpmuxout = new Electric.PortProto[folds];
612 Electric.PortProto[] decpmuxbit = new Electric.PortProto[2*foldbits];
613 Electric.PortProto decpmuxvdd =
614 (Electric.PortProto)Electric.getVal(decpmux,"vdd");
615 Electric.PortProto decpmuxvddb =
616 (Electric.PortProto)Electric.getVal(decpmux, "vddb");
617
618 for (int i=0; i<folds; i++) {
619 decpmuxin[i] = (Electric.PortProto)Electric.getVal(decpmux, "wordin"+i);
620 decpmuxout[i] = (Electric.PortProto)Electric.getVal(decpmux, "word"+i);
621 }
622 for (int i=0; i<foldbits; i++) {
623 decpmuxbit[2*i] = (Electric.PortProto)Electric.getVal(decpmux, "bot_in"+i);
624 decpmuxbit[(2*i)+1] =
625 (Electric.PortProto)Electric.getVal(decpmux, "bot_in"+i+"_b");
626 }
627
628 //////////////decoderpmosmux
629 Electric.NodeProto decnmux = Electric.getNodeProto(dnm+"{lay}");
630 int[] decnmuxbox =
631 {((Integer)Electric.getVal(decnmux, "lowx")).intValue()-lambda/2,
632 ((Integer)Electric.getVal(decnmux, "highx")).intValue()+lambda/2,
633 ((Integer)Electric.getVal(decnmux, "lowy")).intValue()-lambda/2,
634 ((Integer)Electric.getVal(decnmux, "highy")).intValue()+lambda/2};
635 Electric.PortProto[] decnmuxout = new Electric.PortProto[folds];
636 Electric.PortProto[] decnmuxin = new Electric.PortProto[folds];
637 Electric.PortProto[] decnmuxbit = new Electric.PortProto[2*foldbits];
638 for (int i=0; i<folds; i++) {
639 decnmuxin[i] = (Electric.PortProto)Electric.getVal(decnmux, "mid"+i);
640 decnmuxout[i] = (Electric.PortProto)Electric.getVal(decnmux, "word"+i);
641 }
642 for (int i=0; i<foldbits; i++) {
643 decnmuxbit[2*i] = (Electric.PortProto)Electric.getVal(decnmux, "bot_in"+i);
644 decnmuxbit[(2*i)+1] =
645 (Electric.PortProto)Electric.getVal(decnmux, "bot_in"+i+"_b");
646 }
647
648 //////////////////////muxplane
649 Electric.NodeProto muxp = Electric.getNodeProto(mp+"{lay}");
650 int[] muxpbox =
651 {((Integer)Electric.getVal(muxp, "lowx")).intValue()-lambda/2,
652 ((Integer)Electric.getVal(muxp, "highx")).intValue()+lambda/2,
653 ((Integer)Electric.getVal(muxp, "lowy")).intValue()-lambda/2,
654 ((Integer)Electric.getVal(muxp, "highy")).intValue()+lambda/2};
655 Electric.PortProto[] muxin = new Electric.PortProto[romarray.length];
656 Electric.PortProto[] muxout = new Electric.PortProto[romarray.length/folds];
657 Electric.PortProto[] muxsel = new Electric.PortProto[folds];
658 for (int i=0; i<romarray.length; i++) {
659 muxin[i] = (Electric.PortProto)Electric.getVal(muxp, ("muxin"+i));
660 }
661 for (int i=0; i<romarray.length/folds; i++) {
662 muxout[i] = (Electric.PortProto)Electric.getVal(muxp, ("muxout"+i));
663 }
664 for (int i=0; i<folds; i++) {
665 muxsel[i] = (Electric.PortProto)Electric.getVal(muxp, ("sel"+i));
666 }
667
668 //////////////////////ininverterplane bottom
669 Electric.NodeProto ininvbp = Electric.getNodeProto(invb+"{lay}");
670 int[] ininvbpbox =
671 {((Integer)Electric.getVal(ininvbp, "lowx")).intValue()-lambda/2,
672 ((Integer)Electric.getVal(ininvbp, "highx")).intValue()+lambda/2,
673 ((Integer)Electric.getVal(ininvbp, "lowy")).intValue()-lambda/2,
674 ((Integer)Electric.getVal(ininvbp, "highy")).intValue()+lambda/2};
675 Electric.PortProto[] ivbtop = new Electric.PortProto[foldbits];
676 Electric.PortProto[] ivbbot = new Electric.PortProto[foldbits];
677 Electric.PortProto[] ivbbar = new Electric.PortProto[foldbits];
678 Electric.PortProto ivbvdd =
679 (Electric.PortProto)Electric.getVal(ininvbp, ("vdd"));
680 Electric.PortProto ivbgnd =
681 (Electric.PortProto)Electric.getVal(ininvbp, ("gnd"));
682 for (int i=0; i<foldbits; i++) {
683 ivbtop[i] = (Electric.PortProto)Electric.getVal(ininvbp, ("in_top"+i));
684 ivbbot[i] = (Electric.PortProto)Electric.getVal(ininvbp, ("in_bot"+i));
685 ivbbar[i] = (Electric.PortProto)Electric.getVal(ininvbp, ("in_b"+i));
686 }
687
688 Electric.NodeInst muxpln =
689 Electric.newNodeInst(muxp, muxpbox[0]+rompoffset, muxpbox[1]+rompoffset,
690 muxpbox[2]+muxpoffsety, muxpbox[3]+muxpoffsety,
691 0, 2700, rom);
692 Electric.NodeInst pplnmx =
693 Electric.newNodeInst(decpmux, decpmuxbox[0]+foldoffsetx,
694 decpmuxbox[1]+foldoffsetx,
695 decpmuxbox[2]+muxpoffsety+foldoffsety,
696 decpmuxbox[3]+muxpoffsety+foldoffsety, 0, 0, rom);
697 Electric.NodeInst nplnmx =
698 Electric.newNodeInst(decnmux, decnmuxbox[0]+foldoffsetx+offset,
699 decnbox[1]+foldoffsetx+offset,
700 decnmuxbox[2]+muxpoffsety+foldoffsety,
701 decnmuxbox[3]+muxpoffsety+foldoffsety, 0, 0, rom);
702 Electric.NodeInst ininvbot1 =
703 Electric.newNodeInst(ininvbp,ininvbpbox[0]+foldoffsetx,
704 ininvbpbox[1]+foldoffsetx, ininvbpbox[2]+invpoffsety,
705 ininvbpbox[3]+invpoffsety, 0, 0, rom);
706 Electric.NodeInst ininvbot2 =
707 Electric.newNodeInst(ininvbp, ininvbpbox[0]+foldoffsetx+offset,
708 ininvbpbox[1]+foldoffsetx+offset,
709 ininvbpbox[2]+invpoffsety,
710 ininvbpbox[3]+invpoffsety, 0, 0, rom);
711
712 for (int i=0; i<foldbits; i++) {
713 ap1 = ininvbot1;
714 apport1 = ivbbot[i];
715 p = Electric.newPortProto(rom, ap1, apport1, ("colsel"+i));
716 createExport(p, INPORT);
717 }
718
719 ap1 = nplane;
720 apport1 = (Electric.PortProto)Electric.getVal(decn, "gnd");
721 appos1 = Electric.portPosition(ap1, apport1);
722 ap3 = pplnmx;
723 apport3 = decpmuxvdd;
724 appos3 = Electric.portPosition(ap3, apport3);
725 ap4 = pplane;
726 apport4 = decpvddb;
727 appos4 = Electric.portPosition(ap4, apport4);
728 Electric.newArcInst(m1arc, 4*lambda, 0, ap4, apport4, appos4[0].intValue(),
729 appos4[1].intValue(), ap3, apport3, appos3[0].intValue(),
730 appos3[1].intValue(),rom);
731
732 ap3 = nplnmx;
733 apport3 = (Electric.PortProto)Electric.getVal(decnmux, "gnd");
734 appos3 = Electric.portPosition(ap3, apport3);
735
736 Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
737 appos1[1].intValue(), ap3, apport3, appos3[0].intValue(),
738 appos3[1].intValue(),rom);
739
740 // decnmuxout, decpmuxin
741 for (int i=0; i<folds; i++) {
742 ap1 = pplnmx;
743 apport1 = decpmuxout[i];
744 appos1 = Electric.portPosition(ap1, apport1);
745 ap2 = nplnmx;
746 apport2 = decnmuxin[i];
747 appos2 = Electric.portPosition(ap2, apport2);
748 Electric.newArcInst(m2arc, 4*lambda, 0, ap1, apport1,appos1[0].intValue(),
749 appos1[1].intValue(),ap2,apport2,appos2[0].intValue(),
750 appos2[1].intValue(),rom);
751 }
752
753 for (int i=0; i<folds; i++) {
754 ap1 = nplnmx;
755 apport1 = decnmuxout[i];
756 appos1 = Electric.portPosition(ap1, apport1);
757 ap2 = muxpln;
758 apport2 = muxsel[i];
759 appos2 = Electric.portPosition(ap2, apport2);
760 Electric.newArcInst(m2arc, 4*lambda, 0, ap1, apport1,appos1[0].intValue(),
761 appos1[1].intValue(),ap2,apport2,appos2[0].intValue(),
762 appos2[1].intValue(),rom);
763 }
764
765 ///////connect rompout to muxin
766 for (int i=0; i<romarray.length; i++) {
767 ap1 = rompln;
768 apport1 = rompout[i];
769 appos1 = Electric.portPosition(ap1, apport1);
770 ap2 = muxpln;
771 apport2 = muxin[i];
772 appos2 = Electric.portPosition(ap2, apport2);
773 Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1,appos1[0].intValue(),
774 appos1[1].intValue(),ap2,apport2,appos2[0].intValue(),
775 appos2[1].intValue(),rom);
776 }
777 ///////connect muxout to invin
778 for (int i=0; i<romarray.length/folds; i++) {
779 ap1 = invpln;
780 apport1 = invin[i];
781 appos1 = Electric.portPosition(ap1, apport1);
782 ap2 = muxpln;
783 apport2 = muxout[i];
784 appos2 = Electric.portPosition(ap2, apport2);
785 Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1,appos1[0].intValue(),
786 appos1[1].intValue(),ap2,apport2,appos2[0].intValue(),
787 appos2[1].intValue(),rom);
788 }
789
790 ///////connect bot ininv1 to ininv2
791 for (int i=0; i<foldbits; i++) {
792 ap1 = ininvbot1;
793 apport1 = ivbbot[i];
794 appos1 = Electric.portPosition(ap1, apport1);
795 ap2 = ininvbot2;
796 apport2 = ivbbot[i];
797 appos2 = Electric.portPosition(ap2, apport2);
798 Electric.newArcInst(m2arc, 4*lambda, 0, ap1, apport1,appos1[0].intValue(),
799 appos1[1].intValue(),ap2,apport2,appos2[0].intValue(),
800 appos2[1].intValue(),rom);
801 }
802
803 ///////connect bot ininv1 to nmuxdecoder
804 for (int i=0; i<foldbits; i++) {
805 ap1 = ininvbot1;
806 apport1 = ivbtop[i];
807 appos1 = Electric.portPosition(ap1, apport1);
808 ap2 = pplnmx;
809 apport2 = decpmuxbit[i*2];
810 appos2 = Electric.portPosition(ap2, apport2);
811 Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
812 appos1[1].intValue(),ap2,apport2, appos2[0].intValue(),
813 appos2[1].intValue(),rom);
814 ap1 = ininvbot1;
815 apport1 = ivbbar[i];
816 appos1 = Electric.portPosition(ap1, apport1);
817 ap2 = pplnmx;
818 apport2 = decpmuxbit[(i*2)+1];
819 appos2 = Electric.portPosition(ap2, apport2);
820 Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
821 appos1[1].intValue(), ap2,apport2,appos2[0].intValue(),
822 appos2[1].intValue(),rom);
823 }
824 ///////connect bot ininv2 to pmuxdecoder
825 for (int i=0; i<foldbits; i++) {
826 ap1 = ininvbot2;
827 apport1 = ivbtop[i];
828 appos1 = Electric.portPosition(ap1, apport1);
829 ap2 = nplnmx;
830 apport2 = decnmuxbit[i*2];
831 appos2 = Electric.portPosition(ap2, apport2);
832 Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
833 appos1[1].intValue(), ap2,apport2,appos2[0].intValue(),
834 appos2[1].intValue(),rom);
835 ap1 = ininvbot2;
836 apport1 = ivbbar[i];
837 appos1 = Electric.portPosition(ap1, apport1);
838 ap2 = nplnmx;
839 apport2 = decnmuxbit[(i*2)+1];
840 appos2 = Electric.portPosition(ap2, apport2);
841 Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1,appos1[0].intValue(),
842 appos1[1].intValue(),ap2,apport2,appos2[0].intValue(),
843 appos2[1].intValue(),rom);
844 }
845
846 ////////connect two mux decoder inverterplanes and mux decoder together (vdd)
847 ap1 = ininvbot1;
848 apport1 = ivbvdd;
849 appos1 = Electric.portPosition(ap1, apport1);
850 ap2 = ininvbot2;
851 apport2 = ivbvdd;
852 appos2 = Electric.portPosition(ap2, apport2);
853 ap3 = pplnmx;
854 apport3 = decpmuxvddb;
855 appos3 = Electric.portPosition(ap3, apport3);
856
857 Electric.newArcInst(m2arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
858 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
859 appos2[1].intValue(),rom);
860
861 Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
862 appos1[1].intValue(), ap3, apport3, appos3[0].intValue(),
863 appos3[1].intValue(),rom);
864
865 ////////connect two mux decoder inverterplanes and inverterplane together (gnd)
866 ap1 = ininvbot1;
867 apport1 = ivbgnd;
868 appos1 = Electric.portPosition(ap1, apport1);
869 ap2 = ininvbot2;
870 apport2 = ivbgnd;
871 appos2 = Electric.portPosition(ap2, apport2);
872 ap3 = invpln;
873 apport3 = invgndc;
874 appos3 = Electric.portPosition(ap3, apport3);
875 Electric.newArcInst(m2arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
876 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
877 appos2[1].intValue(),rom);
878 Electric.newArcInst(m2arc, 4*lambda, 0, ap3, apport3, appos3[0].intValue(),
879 appos3[1].intValue(), ap2, apport2, appos2[0].intValue(),
880 appos2[1].intValue(),rom);
881
882 ////////connect mux decoder to inverter vdd
883 ap1 = invpln;
884 apport1 = invvddc;
885 appos1 = Electric.portPosition(ap1, apport1);
886 ap2 = ininvbot2;
887 apport2 = ivbvdd;
888 appos2 = Electric.portPosition(ap2, apport2);
889 Electric.newArcInst(m2arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
890 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
891 appos2[1].intValue(),rom);
892
893
894 }
895 //end (folds > 1)
896
897 //begin (folds == 1)
898 if (folds == 1) {
899 for (int i=0; i<romarray.length; i++) {
900 ap1 = invpln;
901 apport1 = invin[i];
902 appos1 = Electric.portPosition(ap1, apport1);
903 ap2 = rompln;
904 apport2 = rompout[i];
905 appos2 = Electric.portPosition(ap2, apport2);
906 Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
907 appos1[1].intValue(),ap2,apport2, appos2[0].intValue(),
908 appos2[1].intValue(),rom);
909 }
910
911 //connect vdd of decoderpmos to vdd of inverterplane
912 Electric.NodeProto m1m2c = Electric.getNodeProto("Metal-1-Metal-2-Con");
913 Electric.PortProto m1m2cport =
914 (Electric.PortProto)Electric.getVal(m1m2c, "firstPortProto");
915 int[] m1m2cbox = {-5*lambda/2, 5*lambda/2, -5*lambda/2, 5*lambda/2};
916
917 Electric.NodeInst vddbot = new Electric.NodeInst();
918
919 int vddoffsetx = offset - 4*lambda;
920 int vddoffsety = invpoffsety - 26*lambda;
921
922 vddbot =
923 Electric.newNodeInst(m1m2c,m1m2cbox[0]+vddoffsetx,m1m2cbox[1]+vddoffsetx,
924 m1m2cbox[2]+vddoffsety,m1m2cbox[3]+vddoffsety,
925 0,0,rom);
926
927 ap1 = invpln;
928 apport1 = invvddc;
929 appos1 = Electric.portPosition(ap1, apport1);
930 ap2 = vddbot;
931 apport2 = m1m2cport;
932 appos2 = Electric.portPosition(ap2, apport2);
933 ap3 = pplane;
934 apport3 = decpvddb;
935 appos3 = Electric.portPosition(ap3, apport3);
936 Electric.newArcInst(m2arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
937 appos1[1].intValue(),ap2,apport2, appos2[0].intValue(),
938 appos2[1].intValue(),rom);
939 Electric.newArcInst(m1arc, 4*lambda, 0, ap2, apport2, appos2[0].intValue(),
940 appos2[1].intValue(),ap3,apport3, appos3[0].intValue(),
941 appos3[1].intValue(),rom);
942
943
944
945 }
946
947
948 return 1;
949 }
950
951 ////////////////////romplane start
romplane(int lambda, int romarray[][], String rp)952 public static void romplane(int lambda, int romarray[][], String rp)
953 {
954 int i, m, o;
955 int x, y;
956 Electric.NodeInst ap1, ap2, ap3, ap4, gnd1, gnd2, intgnd;
957 Electric.PortProto p, apport1, apport2, apport3, apport4, gndport1, gndport2,
958 intgndport;
959 Integer[] appos1, appos2, appos3, appos4, gndpos1, gndpos2, intgndpos;
960
961 int inputs = romarray[0].length;
962 int wordlines = romarray.length;
963
964 Electric.NodeInst[][] andtrans = new Electric.NodeInst[wordlines+2][inputs+2];
965 Electric.NodeInst[] pulluptrans = new Electric.NodeInst[wordlines+2];
966 Electric.NodeInst[] nwellc = new Electric.NodeInst[(wordlines+2)/2];
967 Electric.NodeInst[][] minpins = new Electric.NodeInst[wordlines+2][inputs+2];
968 Electric.NodeInst[][] diffpins = new Electric.NodeInst[wordlines+2][inputs+2];
969 Electric.NodeInst[][] gndpins = new Electric.NodeInst[wordlines/2][inputs+2];
970 Electric.NodeInst[] gnd_2pins = new Electric.NodeInst[wordlines/2];
971 Electric.NodeInst[] m1polypins = new Electric.NodeInst[inputs+2];
972 Electric.NodeInst[] m1m2pins = new Electric.NodeInst[inputs+2];
973 Electric.NodeInst[] m1m2_2pins = new Electric.NodeInst[wordlines+2];
974 Electric.NodeInst[] m1m2_3pins = new Electric.NodeInst[wordlines+2];
975 Electric.NodeInst[] m1m2_4pins = new Electric.NodeInst[wordlines+2];
976 Electric.NodeInst[] mpac_1pins = new Electric.NodeInst[wordlines+2];
977 Electric.NodeInst[] mpac_2pins = new Electric.NodeInst[wordlines+2];
978 Electric.NodeInst gndpex[] = new Electric.NodeInst[1];
979 Electric.NodeInst gndm1ex[] = new Electric.NodeInst[1];
980 Electric.NodeInst gnd1pin = new Electric.NodeInst();
981 Electric.NodeInst vdd1pin = new Electric.NodeInst();
982 Electric.NodeInst vdd2pin = new Electric.NodeInst();
983
984 Electric.PortProto[] nwellcports = new Electric.PortProto[(wordlines+2)/2];
985 Electric.PortProto[][] minports = new Electric.PortProto[wordlines+2][inputs+2];
986 Electric.PortProto[][] gndports = new Electric.PortProto[wordlines/2][inputs+2];
987 Electric.PortProto[] gnd_2ports = new Electric.PortProto[wordlines/2];
988 Electric.PortProto[][] diffports = new Electric.PortProto[wordlines/2][inputs+2];
989 Electric.PortProto[] m1polyports = new Electric.PortProto[inputs+2];
990 Electric.PortProto[] m1m2ports = new Electric.PortProto[inputs+2];
991 Electric.PortProto[] m1m2_2ports = new Electric.PortProto[wordlines+2];
992 Electric.PortProto[] m1m2_3ports = new Electric.PortProto[wordlines+2];
993 Electric.PortProto[] m1m2_4ports = new Electric.PortProto[wordlines+2];
994 Electric.PortProto[] mpac_1ports = new Electric.PortProto[wordlines+2];
995 Electric.PortProto[] mpac_2ports = new Electric.PortProto[wordlines+2];
996 Electric.PortProto gndpexport[] = new Electric.PortProto[1];
997 Electric.PortProto gndm1export[] = new Electric.PortProto[1];
998 Electric.PortProto gnd1port = new Electric.PortProto();
999 Electric.PortProto vdd1port = new Electric.PortProto();
1000 Electric.PortProto vdd2port = new Electric.PortProto();
1001
1002 /* get pointers to primitives */
1003 Electric.NodeProto nmos = Electric.getNodeProto("N-Transistor");
1004 Electric.PortProto nmosg1port = Electric.getPortProto(nmos, "n-trans-poly-right");
1005 Electric.PortProto nmosg2port = Electric.getPortProto(nmos, "n-trans-poly-left");
1006 Electric.PortProto nmosd1port = Electric.getPortProto(nmos, "n-trans-diff-top");
1007 Electric.PortProto nmosd2port = Electric.getPortProto(nmos, "n-trans-diff-bottom");
1008 int[] nmosbox = {((Integer)Electric.getVal(nmos, "lowx")).intValue()-lambda/2,
1009 ((Integer)Electric.getVal(nmos, "highx")).intValue()+lambda/2,
1010 ((Integer)Electric.getVal(nmos, "lowy")).intValue(),
1011 ((Integer)Electric.getVal(nmos, "highy")).intValue()};
1012
1013 Electric.NodeProto pmos = Electric.getNodeProto("P-Transistor");
1014 Electric.PortProto pmosg1port = Electric.getPortProto(pmos, "p-trans-poly-right");
1015 Electric.PortProto pmosg2port = Electric.getPortProto(pmos, "p-trans-poly-left");
1016 Electric.PortProto pmosd1port = Electric.getPortProto(pmos, "p-trans-diff-top");
1017 Electric.PortProto pmosd2port = Electric.getPortProto(pmos, "p-trans-diff-bottom");
1018 int bbb = 15;
1019 int ccc = 23;
1020 int[] pmosbox = {-bbb*lambda/2, bbb*lambda/2, -ccc*lambda/2, ccc*lambda/2};
1021
1022 Electric.NodeProto ppin = Electric.getNodeProto("Polysilicon-1-Pin");
1023 Electric.PortProto ppinport =
1024 (Electric.PortProto)Electric.getVal(ppin, "firstPortProto");
1025 int[] ppinbox = {((Integer)Electric.getVal(ppin, "lowx")).intValue(),
1026 ((Integer)Electric.getVal(ppin, "highx")).intValue(),
1027 ((Integer)Electric.getVal(ppin, "lowy")).intValue(),
1028 ((Integer)Electric.getVal(ppin, "highy")).intValue()};
1029
1030 Electric.NodeProto napin = Electric.getNodeProto("N-Active-Pin");
1031
1032 Electric.NodeProto m1pin = Electric.getNodeProto("Metal-1-Pin");
1033 Electric.PortProto m1pinport =
1034 (Electric.PortProto)Electric.getVal(m1pin, "firstPortProto");
1035 int[] m1pinbox = {((Integer)Electric.getVal(m1pin, "lowx")).intValue()-lambda/2,
1036 ((Integer)Electric.getVal(m1pin, "highx")).intValue()+lambda/2,
1037 ((Integer)Electric.getVal(m1pin, "lowy")).intValue()-lambda/2,
1038 ((Integer)Electric.getVal(m1pin, "highy")).intValue()+lambda/2};
1039
1040 Electric.NodeProto m2pin = Electric.getNodeProto("Metal-2-Pin");
1041 Electric.PortProto m2pinport =
1042 (Electric.PortProto)Electric.getVal(m2pin, "firstPortProto");
1043 int[] m2pinbox = {((Integer)Electric.getVal(m2pin, "lowx")).intValue()-lambda/2,
1044 ((Integer)Electric.getVal(m2pin, "highx")).intValue()+lambda/2,
1045 ((Integer)Electric.getVal(m2pin, "lowy")).intValue()-lambda/2,
1046 ((Integer)Electric.getVal(m2pin, "highy")).intValue()+lambda/2};
1047
1048 Electric.NodeProto diffpin = Electric.getNodeProto("Active-Pin");
1049 Electric.PortProto diffpinport =
1050 (Electric.PortProto)Electric.getVal(diffpin, "firstPortProto");
1051 int[] diffpinbox =
1052 {((Integer)Electric.getVal(diffpin, "lowx")).intValue()-lambda/2,
1053 ((Integer)Electric.getVal(diffpin, "highx")).intValue()+lambda/2,
1054 ((Integer)Electric.getVal(diffpin, "lowy")).intValue()-lambda/2,
1055 ((Integer)Electric.getVal(diffpin, "highy")).intValue()+lambda/2};
1056
1057 Electric.NodeProto nwnode = Electric.getNodeProto("N-Well-Node");
1058 int[] nwnodebox =
1059 {((Integer)Electric.getVal(nwnode, "lowx")).intValue()-lambda/2,
1060 ((Integer)Electric.getVal(nwnode, "highx")).intValue()+lambda/2,
1061 ((Integer)Electric.getVal(nwnode, "lowy")).intValue()-lambda/2,
1062 ((Integer)Electric.getVal(nwnode, "highy")).intValue()+lambda/2};
1063
1064 Electric.NodeProto pwnode = Electric.getNodeProto("P-Well-Node");
1065 int[] pwnodebox =
1066 {((Integer)Electric.getVal(pwnode, "lowx")).intValue()-lambda/2,
1067 ((Integer)Electric.getVal(pwnode, "highx")).intValue()+lambda/2,
1068 ((Integer)Electric.getVal(pwnode, "lowy")).intValue()-lambda/2,
1069 ((Integer)Electric.getVal(pwnode, "highy")).intValue()+lambda/2};
1070
1071 Electric.NodeProto psnode = Electric.getNodeProto("P-Select-Node");
1072 int[] psnodebox =
1073 {((Integer)Electric.getVal(psnode, "lowx")).intValue()-lambda/2,
1074 ((Integer)Electric.getVal(psnode, "highx")).intValue()+lambda/2,
1075 ((Integer)Electric.getVal(psnode, "lowy")).intValue()-lambda/2,
1076 ((Integer)Electric.getVal(psnode, "highy")).intValue()+lambda/2};
1077
1078 Electric.NodeProto mnac = Electric.getNodeProto("Metal-1-N-Active-Con");
1079 Electric.PortProto mnacport =
1080 (Electric.PortProto)Electric.getVal(mnac, "firstPortProto");
1081 int aaa = 17;
1082 int[] mnacbox = {-aaa*lambda/2, aaa*lambda/2, -aaa*lambda/2, aaa*lambda/2};
1083
1084 Electric.NodeProto mpac = Electric.getNodeProto("Metal-1-P-Active-Con");
1085 Electric.PortProto mpacport =
1086 (Electric.PortProto)Electric.getVal(mpac, "firstPortProto");
1087 int[] mpacbox = {-aaa*lambda/2, aaa*lambda/2, -aaa*lambda/2, aaa*lambda/2};
1088
1089 Electric.NodeProto mpwc = Electric.getNodeProto("Metal-1-P-Well-Con");
1090 Electric.PortProto mpwcport =
1091 (Electric.PortProto)Electric.getVal(mpwc, "firstPortProto");
1092 int[] mpwcbox = {-17*lambda/2, 17*lambda/2, -17*lambda/2, 17*lambda/2};
1093
1094 Electric.NodeProto mnwc = Electric.getNodeProto("Metal-1-N-Well-Con");
1095 Electric.PortProto mnwcport =
1096 (Electric.PortProto)Electric.getVal(mnwc, "firstPortProto");
1097 int nwellx = 29;
1098 int nwelly = 17;
1099 int[] mnwcbox ={-nwellx*lambda/2,nwellx*lambda/2,-nwelly*lambda/2,nwelly*lambda/2};
1100
1101 Electric.NodeProto mpc = Electric.getNodeProto("Metal-1-Polysilicon-1-Con");
1102 Electric.PortProto mpcport =
1103 (Electric.PortProto)Electric.getVal(mpc, "firstPortProto");
1104 int mx = 5;
1105 int[] mpcbox = {-mx*lambda/2, mx*lambda/2, -mx*lambda/2, mx*lambda/2};
1106
1107 Electric.NodeProto m1m2c = Electric.getNodeProto("Metal-1-Metal-2-Con");
1108 Electric.PortProto m1m2cport =
1109 (Electric.PortProto)Electric.getVal(m1m2c, "firstPortProto");
1110 int[] m1m2cbox = {-mx*lambda/2, mx*lambda/2, -mx*lambda/2, mx*lambda/2};
1111
1112 Electric.NodeProto nsnode = Electric.getNodeProto("N-Select-Node");
1113 int nselectx = 8;
1114 int nselecty = 8;
1115 int[] nsnodebox =
1116 {-nselectx*lambda/2, nselectx*lambda/2, -nselecty*lambda/2, nselecty*lambda/2};
1117
1118 Electric.ArcProto parc = Electric.getArcProto("Polysilicon-1");
1119 Electric.ArcProto m1arc = Electric.getArcProto("Metal-1");
1120 Electric.ArcProto m2arc = Electric.getArcProto("Metal-2");
1121 Electric.ArcProto ndiffarc = Electric.getArcProto("N-Active");
1122 Electric.ArcProto pdiffarc = Electric.getArcProto("P-Active");
1123
1124 /* create a cell called "romplane{lay}" in the current library */
1125 Electric.NodeProto romplane =
1126 Electric.newNodeProto(rp+"{lay}", Electric.curLib());
1127
1128 Electric.NodeInst pwellnode =
1129 Electric.newNodeInst(pwnode,-4*lambda,(8*lambda*(inputs+2)),
1130 -4*lambda,3*8*lambda*(wordlines)/2,0,0,romplane);
1131
1132 int ptranssize = 20;
1133
1134 Electric.NodeInst pselectnode =
1135 Electric.newNodeInst(psnode,-28*lambda,(ptranssize-28)*lambda,4*lambda,
1136 (4+3*8*wordlines/2)*lambda,0,0,romplane);
1137 Electric.NodeInst nselectnode =
1138 Electric.newNodeInst(nsnode,0*lambda,(8*lambda*inputs),4*lambda,
1139 (4+3*8*wordlines/2)*lambda,0,0,romplane);
1140 Electric.NodeInst nwellnode =
1141 Electric.newNodeInst(nwnode,-38*lambda,(ptranssize-38)*lambda,20*lambda,
1142 (4+3*8*wordlines/2)*lambda,0,0,romplane);
1143
1144 // Create instances of objects on rom plane
1145 x = 0;
1146 for (i=0; i<inputs+1; i++) {
1147 x += 8*lambda;
1148 y = 0;
1149 if (i < inputs) {
1150 andtrans[0][i] =
1151 Electric.newNodeInst(ppin, ppinbox[0]+x, ppinbox[1]+x, ppinbox[2],
1152 ppinbox[3], 0, 0, romplane);
1153 m1polypins[i] =
1154 Electric.newNodeInst(mpc, mpcbox[0]+x, mpcbox[1]+x, mpcbox[2],
1155 mpcbox[3], 0, 0, romplane);
1156 m1m2pins[i] =
1157 Electric.newNodeInst(m1m2c, m1m2cbox[0]+x, m1m2cbox[1]+x,
1158 m1m2cbox[2], m1m2cbox[3], 0, 0, romplane);
1159 ap1 = m1m2pins[i];
1160 apport1 = m1m2cport;
1161 p = Electric.newPortProto(romplane,ap1,apport1,("wordline_"+(inputs-i-1)));
1162 createExport(p, INPORT);
1163 }
1164 for (m=0; m<wordlines; m++) {
1165 y += 8*lambda;
1166 if (m%2 == 1) {
1167 if (i%2 == 1) {
1168 gndpins[m/2][i] =
1169 Electric.newNodeInst(mnac, mnacbox[0]+x-4*lambda,
1170 mnacbox[1]+x-4*lambda, mnacbox[2]+y,
1171 mnacbox[3]+y, 0, 0, romplane);
1172 gndports[m/2][i] = mnacport;
1173 } else {
1174 if ( i == inputs) {
1175 gndpins[m/2][i] =
1176 Electric.newNodeInst(mpwc, mpwcbox[0]+x-4*lambda,
1177 mpwcbox[1]+x-4*lambda, mpwcbox[2]+y,
1178 mpwcbox[3]+y, 0, 0, romplane);
1179 gndports[m/2][i] = mpwcport;
1180 } else {
1181 gndpins[m/2][i] =
1182 Electric.newNodeInst(m1pin, m1pinbox[0]+x-4*lambda,
1183 m1pinbox[1]+x-4*lambda, m1pinbox[2]+y, m1pinbox[3]+y,
1184 0, 0, romplane);
1185 gndports[m/2][i] = m1pinport;
1186 }
1187 }
1188 if ( i == 0 ) {
1189 gnd_2pins[m/2] =
1190 Electric.newNodeInst(m1pin, m1pinbox[0]+x-12*lambda,
1191 m1pinbox[1]+x-12*lambda, m1pinbox[2]+y, m1pinbox[3]+y,
1192 0, 0, romplane);
1193 gnd_2ports[m/2] = m1pinport;
1194 if ( m == 1 ) {
1195 gndm1ex[m/2] =
1196 Electric.newNodeInst(m1pin, m1pinbox[0]+x-12*lambda,
1197 m1pinbox[1]+x-12*lambda,
1198 m1pinbox[2]+y-16*lambda,
1199 m1pinbox[3]+y-16*lambda, 0, 0, romplane);
1200 gndm1export[m/2] = m1pinport;
1201 gnd1pin =
1202 Electric.newNodeInst(m1pin, m1pinbox[0]+x-8*lambda,
1203 m1pinbox[1]+x-8*lambda,
1204 m1pinbox[2]+y-16*lambda,
1205 m1pinbox[3]+y-16*lambda, 0, 0, romplane);
1206 gnd1port = m1pinport;
1207 vdd2pin =
1208 Electric.newNodeInst(m2pin, m2pinbox[0]+x-32*lambda,
1209 m2pinbox[1]+x-32*lambda,
1210 m2pinbox[2]+y-16*lambda,
1211 m2pinbox[3]+y-16*lambda, 0, 0, romplane);
1212 vdd2port = m2pinport;
1213 }
1214 }
1215 y+= 8*lambda;
1216 }
1217 if (i < inputs) {
1218 if (romarray[m][i] == 1) {
1219 // create a transistor
1220 andtrans[m+1][i] =
1221 Electric.newNodeInst(nmos, nmosbox[0]+x, nmosbox[1]+x,
1222 nmosbox[2]+y, nmosbox[3]+y,1,0,romplane);
1223 } else {
1224 andtrans[m+1][i] =
1225 Electric.newNodeInst(ppin, ppinbox[0]+x, ppinbox[1]+x,
1226 ppinbox[2]+y,ppinbox[3]+y,0,0,romplane);
1227 }
1228 }
1229 boolean transcont = false;
1230 if (i < inputs) transcont = (romarray[m][i] == 1);
1231 if (i > 1) transcont |= (romarray[m][i-1] == 1);
1232 if (i%2 == 0 && transcont){
1233 minpins[m][i] =
1234 Electric.newNodeInst(mnac, mnacbox[0]+x-4*lambda,
1235 mnacbox[1]+x-4*lambda, mnacbox[2]+y,
1236 mnacbox[3]+y, 0, 0, romplane);
1237 diffpins[m][i] =
1238 Electric.newNodeInst(m1pin, m1pinbox[0]+x-4*lambda,
1239 m1pinbox[1]+x-4*lambda, m1pinbox[2]+y,
1240 m1pinbox[3]+y, 0, 0, romplane);
1241 minports[m][i] = mnacport;
1242 } else {
1243 minpins[m][i] =
1244 Electric.newNodeInst(m1pin, m1pinbox[0]+x-4*lambda,
1245 m1pinbox[1]+x-4*lambda, m1pinbox[2]+y,
1246 m1pinbox[3]+y, 0, 0, romplane);
1247 if ((transcont) || ((i==1) && (romarray[m][0] == 1))) {
1248 diffpins[m][i] =
1249 Electric.newNodeInst(diffpin, diffpinbox[0]+x-4*lambda,
1250 diffpinbox[1]+x-4*lambda, diffpinbox[2]+y,
1251 diffpinbox[3]+y, 0, 0, romplane);
1252 } else {
1253 diffpins[m][i] =
1254 Electric.newNodeInst(m1pin, m1pinbox[0]+x-4*lambda,
1255 m1pinbox[1]+x-4*lambda,m1pinbox[2]+y,m1pinbox[3]+y,
1256 0, 0, romplane);
1257 }
1258 minports[m][i] = m1pinport;
1259 }
1260 if (i == inputs) {
1261 ap1 = minpins[m][i];
1262 apport1 = minports[m][i];
1263 p = Electric.newPortProto(romplane, ap1, apport1, ("out_"+m));
1264 createExport(p, OUTPORT);
1265 }
1266 if (i == 0) {
1267 if ( m%2 ==1 ) {
1268 nwellc[m/2] =
1269 Electric.newNodeInst(mnwc, m1m2cbox[0]+x-46*lambda,
1270 mnwcbox[1]+x-46*lambda, mnwcbox[2]+y,
1271 mnwcbox[3]+y, 0, 0, romplane);
1272 nwellcports[m/2] = mnwcport;
1273 }
1274 m1m2_2pins[m] =
1275 Electric.newNodeInst(m1m2c, m1m2cbox[0]+x-4*lambda,
1276 m1m2cbox[1]+x-4*lambda, m1m2cbox[2]+y,
1277 m1m2cbox[3]+y, 0, 0, romplane);
1278 m1m2_2ports[m] = m1m2cport;
1279 m1m2_3pins[m] =
1280 Electric.newNodeInst(m1m2c, m1m2cbox[0]+x-20*lambda,
1281 m1m2cbox[1]+x-20*lambda, m1m2cbox[2]+y,
1282 m1m2cbox[3]+y, 0, 0, romplane);
1283 m1m2_3ports[m] = m1m2cport;
1284 mpac_1pins[m] =
1285 Electric.newNodeInst(mpac, mpacbox[0]+x-20*lambda,
1286 mpacbox[1]+x-20*lambda, mpacbox[2]+y,
1287 mpacbox[3]+y, 0, 0, romplane);
1288 mpac_1ports[m] = mpacport;
1289 pulluptrans[m] =
1290 Electric.newNodeInst(pmos, pmosbox[0]+x-26*lambda,
1291 pmosbox[1]+x-26*lambda, pmosbox[2]+y,
1292 pmosbox[3]+y, 1, 0, romplane);
1293 mpac_2pins[m] =
1294 Electric.newNodeInst(mpac, mpacbox[0]+x-32*lambda,
1295 mpacbox[1]+x-32*lambda, mpacbox[2]+y,
1296 mpacbox[3]+y, 0, 0, romplane);
1297 mpac_2ports[m] = mpacport;
1298 m1m2_4pins[m] =
1299 Electric.newNodeInst(m1m2c, m1m2cbox[0]+x-32*lambda,
1300 m1m2cbox[1]+x-32*lambda, m1m2cbox[2]+y,
1301 m1m2cbox[3]+y, 0, 0, romplane);
1302 m1m2_4ports[m] = m1m2cport;
1303 if ( m == 0) {
1304 gndpex[m] =
1305 Electric.newNodeInst(mpc, mpcbox[0]+x-26*lambda,
1306 mpcbox[1]+x-26*lambda,
1307 mpcbox[2]+y-8*lambda,
1308 mpcbox[3]+y-8*lambda, 0, 0, romplane);
1309 gndpexport[m] = mpcport;
1310 }
1311 }
1312 }
1313 }
1314
1315 // finished placing objects, start wiring arcs
1316
1317 for (i=0; i<inputs; i++) {
1318 ap1 = andtrans[0][i];
1319 apport1 = ppinport;
1320 appos1 = Electric.portPosition(ap1, apport1);
1321 ap2 = m1polypins[i];
1322 apport2 = mpcport;
1323 appos2 = Electric.portPosition(ap2, apport2);
1324 ap3 = m1m2pins[i];
1325 apport3 = m1m2cport;
1326 appos3 = Electric.portPosition(ap3, apport3);
1327 Electric.newArcInst(parc, 2*lambda, 0, ap1, apport1, appos1[0].intValue(),
1328 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
1329 appos2[1].intValue(),romplane);
1330 Electric.newArcInst(m1arc, 4*lambda, 0, ap2, apport2, appos2[0].intValue(),
1331 appos2[1].intValue(), ap3, apport3, appos3[0].intValue(),
1332 appos3[1].intValue(),romplane);
1333 }
1334
1335 for (i=0; i<inputs; i++){
1336 ap1 = andtrans[0][i];
1337 apport1 = ppinport;
1338 appos1 = Electric.portPosition(ap1, apport1);
1339 for (m=1; m<wordlines+1; m++) {
1340 ap2 = andtrans[m][i];
1341 if (romarray[m-1][i] == 1) {
1342 apport2 = nmosg1port;
1343 apport3 = nmosg2port;
1344 } else {
1345 apport2 = ppinport;
1346 apport3 = ppinport;
1347 }
1348 appos2 = Electric.portPosition(ap2, apport2);
1349 appos3 = Electric.portPosition(ap2, apport3);
1350 Electric.newArcInst(parc, 2*lambda, 0, ap1, apport1, appos1[0].intValue(),
1351 appos1[1].intValue(), ap2, apport2,
1352 appos2[0].intValue(), appos2[1].intValue(),romplane);
1353 ap1 = ap2;
1354 apport1 = apport3;
1355 appos1 = appos3;
1356 }
1357 }
1358 // connect m1 wordline lines
1359 for (m=0; m<wordlines; m++) {
1360 ap1 = minpins[m][0];
1361 apport1 = minports[m][0];
1362 appos1 = Electric.portPosition(ap1, apport1);
1363 for (i=1; i<inputs+1; i++) {
1364 ap2 = minpins[m][i];
1365 apport2 = minports[m][i];
1366 appos2 = Electric.portPosition(ap2, apport2);
1367 Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
1368 appos1[1].intValue(), ap2, apport2,
1369 appos2[0].intValue(), appos2[1].intValue(),romplane);
1370 ap1 = ap2;
1371 apport1 = apport2;
1372 appos1 = appos2;
1373 }
1374 }
1375
1376 // connect transistors to wordline lines
1377 for (m=0; m<wordlines; m++) {
1378 for (i=0; i<inputs; i++) {
1379 if (romarray[m][i] == 1) {
1380 // connect transistor
1381 ap1 = andtrans[m+1][i];
1382 gnd1 = ap1;
1383 if (i%2 == 0) {
1384 apport1 = nmosd1port;
1385 gndport1 = nmosd2port;
1386 ap2 = minpins[m][i];
1387 gnd2 = gndpins[m/2][i+1];
1388 intgnd = diffpins[m][i+1];
1389 } else {
1390 apport1 = nmosd2port;
1391 gndport1 = nmosd1port;
1392 ap2 = minpins[m][i+1];
1393 gnd2 = gndpins[m/2][i];
1394 intgnd = diffpins[m][i];
1395 }
1396 appos1 = Electric.portPosition(ap1, apport1);
1397 gndpos1 = Electric.portPosition(gnd1, gndport1);
1398 apport2 = mnacport;
1399 appos2 = Electric.portPosition(ap2, apport2);
1400 gndport2 = mnacport;
1401 gndpos2 = Electric.portPosition(gnd2, gndport2);
1402 intgndport = diffpinport;
1403 intgndpos = Electric.portPosition(intgnd, intgndport);
1404 Electric.newArcInst(ndiffarc, 16*lambda, 0, ap1, apport1,
1405 appos1[0].intValue(), appos1[1].intValue(),
1406 ap2, apport2, appos2[0].intValue(),
1407 appos2[1].intValue(),romplane);
1408 Electric.newArcInst(ndiffarc, 16*lambda, 0, gnd1, gndport1,
1409 gndpos1[0].intValue(), gndpos1[1].intValue(),
1410 intgnd, intgndport, intgndpos[0].intValue(),
1411 intgndpos[1].intValue(),romplane);
1412 Electric.newArcInst(ndiffarc, 16*lambda, 0, intgnd, intgndport,
1413 intgndpos[0].intValue(), intgndpos[1].intValue(),
1414 gnd2, gndport2, gndpos2[0].intValue(),
1415 gndpos2[1].intValue(),romplane);
1416 }
1417 }
1418 }
1419
1420 // connect ground lines
1421 for (m=0; m<wordlines/2; m++) {
1422 ap1 = gndpins[m][0];
1423 apport1 = gndports[m][0];
1424 appos1 = Electric.portPosition(ap1, apport1);
1425 for (i=1; i<inputs+1; i++) {
1426 ap2 = gndpins[m][i];
1427 apport2 = gndports[m][i];
1428 appos2 = Electric.portPosition(ap2, apport2);
1429 Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
1430 appos1[1].intValue(), ap2, apport2,
1431 appos2[0].intValue(), appos2[1].intValue(),romplane);
1432 if (i == inputs) {
1433 p = Electric.newPortProto(romplane, ap1, apport1, ("romgnd"+m));
1434 createExport(p, GNDPORT);
1435 }
1436 ap1 = ap2;
1437 apport1 = apport2;
1438 appos1 = appos2;
1439 }
1440 }
1441
1442 // extend the gnd plane
1443 for (m=0; m<wordlines/2; m++) {
1444 ap1 = gndpins[m][0];
1445 apport1 = gndports[m][0];
1446 appos1 = Electric.portPosition(ap1, apport1);
1447 ap2 = gnd_2pins[m];
1448 apport2 = gnd_2ports[m];
1449 appos2 = Electric.portPosition(ap2, apport2);
1450 Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
1451 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
1452 appos2[1].intValue(),romplane);
1453 }
1454
1455 // tie up all the gndlines
1456 ap1 = gnd_2pins[0];
1457 apport1 = gnd_2ports[0];
1458 appos1 = Electric.portPosition(ap1, apport1);
1459 for (m=0; m<wordlines/2; m++) {
1460 ap2 = gnd_2pins[m];
1461 apport2 = gnd_2ports[m];
1462 appos2 = Electric.portPosition(ap2, apport2);
1463 Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
1464 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
1465 appos2[1].intValue(),romplane);
1466 if (m == (wordlines/2 - 1)) {
1467 p = Electric.newPortProto(romplane, ap2, apport2, ("gnd"));
1468 createExport(p, GNDPORT);
1469 }
1470 }
1471
1472 ap2 = gndm1ex[0];
1473 apport2 = gndm1export[0];
1474 appos2 = Electric.portPosition(ap2, apport2);
1475 Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
1476 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
1477 appos2[1].intValue(),romplane);
1478 ap1 = gnd1pin;
1479 apport1 = gnd1port;
1480 appos1 = Electric.portPosition(ap1, apport1);
1481 Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
1482 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
1483 appos2[1].intValue(),romplane);
1484 p = Electric.newPortProto(romplane, ap1, apport1, ("gndc"));
1485 createExport(p, GNDPORT);
1486
1487 ap1 = gndpex[0];
1488 apport1 = gndpexport[0];
1489 appos1 = Electric.portPosition(ap1, apport1);
1490 Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
1491 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
1492 appos2[1].intValue(),romplane);
1493
1494 ap2 = pulluptrans[0];
1495 apport2 = pmosg1port;
1496 appos2 = Electric.portPosition(ap2, apport2);
1497 Electric.newArcInst(parc, 3*lambda, 0, ap1, apport1, appos1[0].intValue(),
1498 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
1499 appos2[1].intValue(),romplane);
1500
1501 // connect m1m2contact from romplane to m1m2contact before pull-up trans
1502 for (m=0; m<wordlines; m++) {
1503 ap1 = minpins[m][0];
1504 apport1 = minports[m][0];
1505 appos1 = Electric.portPosition(ap1, apport1);
1506 ap2 = m1m2_2pins[m];
1507 apport2 = m1m2_2ports[m];
1508 appos2 = Electric.portPosition(ap2, apport2);
1509 ap3 = m1m2_3pins[m];
1510 apport3 = m1m2_3ports[m];
1511 appos3 = Electric.portPosition(ap3, apport3);
1512 Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
1513 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
1514 appos2[1].intValue(),romplane);
1515 Electric.newArcInst(m2arc, 4*lambda, 0, ap2, apport2, appos2[0].intValue(),
1516 appos2[1].intValue(), ap3, apport3, appos3[0].intValue(),
1517 appos3[1].intValue(),romplane);
1518 }
1519
1520 // connect m1m2contact from romplane to mpac of pull-up trans
1521 for (m=0; m<wordlines; m++) {
1522 ap1 = m1m2_3pins[m];
1523 apport1 = m1m2_3ports[m];
1524 appos1 = Electric.portPosition(ap1, apport1);
1525 ap2 = mpac_1pins[m];
1526 apport2 = mpac_1ports[m];
1527 appos2 = Electric.portPosition(ap2, apport2);
1528 Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
1529 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
1530 appos2[1].intValue(),romplane);
1531 }
1532
1533 //connect pull-up transistors to the mpac
1534 for (m=0; m<wordlines; m++) {
1535 ap1 = pulluptrans[m];
1536 ap4 = ap1;
1537 apport4 = pmosd1port;
1538 apport1 = pmosd2port;
1539 ap2= mpac_1pins[m];
1540 ap3= mpac_2pins[m];
1541 apport2 = mpacport;
1542 apport3 = mpacport;
1543 appos1 = Electric.portPosition(ap1, apport1);
1544 appos4 = Electric.portPosition(ap4, apport4);
1545 appos2 = Electric.portPosition(ap2, apport2);
1546 appos3 = Electric.portPosition(ap3, apport3);
1547 Electric.newArcInst(pdiffarc, 15*lambda, 0, ap1, apport1, appos1[0].intValue(),
1548 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
1549 appos2[1].intValue(),romplane);
1550 Electric.newArcInst(pdiffarc, 15*lambda, 0, ap4, apport4, appos4[0].intValue(),
1551 appos4[1].intValue(), ap3, apport3, appos3[0].intValue(),
1552 appos3[1].intValue(),romplane);
1553 }
1554
1555 // connect mpac of pull-up trans to m1m2c
1556 for (m=0; m<wordlines; m++) {
1557 ap1 = m1m2_4pins[m];
1558 apport1 = m1m2_4ports[m];
1559 appos1 = Electric.portPosition(ap1, apport1);
1560 ap2 = mpac_2pins[m];
1561 apport2 = mpac_2ports[m];
1562 appos2 = Electric.portPosition(ap2, apport2);
1563 Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
1564 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
1565 appos2[1].intValue(),romplane);
1566 }
1567
1568 // connect mpac of pull-up trans to m1m2c
1569 for (m=0; m<wordlines; m++) {
1570 if (m%2 ==1) {
1571 ap1 = nwellc[m/2];
1572 apport1 = nwellcports[m/2];
1573 appos1 = Electric.portPosition(ap1, apport1);
1574 ap2 = mpac_2pins[m];
1575 apport2 = mpac_2ports[m];
1576 appos2 = Electric.portPosition(ap2, apport2);
1577 Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
1578 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
1579 appos2[1].intValue(),romplane);
1580 }
1581 }
1582
1583 // tie up all the vddlines
1584 ap1 = m1m2_4pins[0];
1585 apport1 = m1m2_4ports[0];
1586 appos1 = Electric.portPosition(ap1, apport1);
1587 for (m=0; m<wordlines; m++) {
1588 ap2 = m1m2_4pins[m];
1589 apport2 = m1m2_4ports[m];
1590 appos2 = Electric.portPosition(ap2, apport2);
1591 Electric.newArcInst(m2arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
1592 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
1593 appos2[1].intValue(),romplane);
1594 }
1595
1596 ap2 = vdd2pin;
1597 apport2 = vdd2port;
1598 appos2 = Electric.portPosition(ap2, apport2);
1599 Electric.newArcInst(m2arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
1600 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
1601 appos2[1].intValue(),romplane);
1602
1603 p = Electric.newPortProto(romplane, ap2, apport2, ("vdd"));
1604 createExport(p, PWRPORT);
1605
1606 // connect poly for the pull-up transistor
1607 for (m=0; m<wordlines-1; m++) {
1608 ap1 = pulluptrans[m];
1609 apport1 = pmosg2port;
1610 appos1 = Electric.portPosition(ap1, apport1);
1611 ap2 = pulluptrans[m+1];
1612 apport2 = pmosg1port;
1613 appos2 = Electric.portPosition(ap2, apport2);
1614 Electric.newArcInst(parc, 3*lambda, 0, ap1, apport1, appos1[0].intValue(),
1615 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
1616 appos2[1].intValue(),romplane);
1617 }
1618 }
1619 ////////////////////romplane end
1620
1621 ////////////////////decoder nmos
decodernmos(int lambda, int bits, String cellname, boolean top)1622 public static void decodernmos(int lambda, int bits, String cellname,
1623 boolean top) {
1624
1625 int[][] romplane = generateplane(bits);
1626 int i, m, o;
1627 int x, y;
1628 Electric.NodeInst ap1, ap2, ap3, gnd1, gnd2, vdd1, vdd2;
1629 Electric.PortProto p, apport1, apport2, apport3, gndport1, gndport2,
1630 vddport1, vddport2;
1631 Integer[] appos1, appos2, appos3, gndpos1, gndpos2, vddpos1, vddpos2;
1632
1633 int inputs = romplane[0].length;
1634 int wordlines = romplane.length;
1635
1636 Electric.NodeInst[][] ortrans = new Electric.NodeInst[wordlines+3][inputs+2];
1637 Electric.NodeInst[][] minpins = new Electric.NodeInst[wordlines+2][inputs+2];
1638 Electric.NodeInst[][] diffpins = new Electric.NodeInst[wordlines+2][inputs+2];
1639 Electric.NodeInst[][] gndpins = new Electric.NodeInst[wordlines/2][inputs+2];
1640 Electric.NodeInst[][] vddpins = new Electric.NodeInst[wordlines][inputs/2];
1641 Electric.NodeInst[] pwrpins = new Electric.NodeInst[inputs/2];
1642 Electric.NodeInst[][] m1m2pins = new Electric.NodeInst[wordlines+2][inputs+2];
1643 Electric.NodeInst[] pwcpins = new Electric.NodeInst[wordlines+2];
1644
1645
1646 Electric.PortProto[][] minports = new Electric.PortProto[wordlines+2][inputs+2];
1647 Electric.PortProto[][] gndports = new Electric.PortProto[wordlines/2][inputs+2];
1648 Electric.PortProto[][] vddports = new Electric.PortProto[wordlines][inputs/2];
1649 Electric.PortProto[] pwrports = new Electric.PortProto[inputs/2];
1650 Electric.PortProto[][] diffports = new Electric.PortProto[wordlines/2][inputs+2];
1651 Electric.PortProto[][] m1m2ports = new Electric.PortProto[wordlines+2][inputs+2];
1652 Electric.PortProto[] pwcports = new Electric.PortProto[wordlines+2];
1653
1654
1655 /* get pointers to primitives */
1656 Electric.NodeProto nmos = Electric.getNodeProto("N-Transistor");
1657 Electric.PortProto nmosg1port = Electric.getPortProto(nmos, "n-trans-poly-right");
1658 Electric.PortProto nmosg2port = Electric.getPortProto(nmos, "n-trans-poly-left");
1659 Electric.PortProto nmosd1port = Electric.getPortProto(nmos, "n-trans-diff-top");
1660 Electric.PortProto nmosd2port = Electric.getPortProto(nmos, "n-trans-diff-bottom");
1661 int[] nmosbox = {((Integer)Electric.getVal(nmos, "lowx")).intValue()-lambda/2,
1662 ((Integer)Electric.getVal(nmos, "highx")).intValue()+lambda/2,
1663 ((Integer)Electric.getVal(nmos, "lowy")).intValue(),
1664 ((Integer)Electric.getVal(nmos, "highy")).intValue()};
1665
1666 Electric.NodeProto pmos = Electric.getNodeProto("P-Transistor");
1667 Electric.PortProto pmosg1port = Electric.getPortProto(pmos, "p-trans-poly-right");
1668 Electric.PortProto pmosg2port = Electric.getPortProto(pmos, "p-trans-poly-left");
1669 Electric.PortProto pmosd1port = Electric.getPortProto(pmos, "p-trans-diff-top");
1670 Electric.PortProto pmosd2port = Electric.getPortProto(pmos, "p-trans-diff-bottom");
1671 int[] pmosbox = {((Integer)Electric.getVal(pmos, "lowx")).intValue()-lambda/2,
1672 ((Integer)Electric.getVal(pmos, "highx")).intValue()+lambda/2,
1673 ((Integer)Electric.getVal(pmos, "lowy")).intValue(),
1674 ((Integer)Electric.getVal(pmos, "highy")).intValue()};
1675
1676 Electric.NodeProto ppin = Electric.getNodeProto("Polysilicon-1-Pin");
1677 Electric.PortProto ppinport =
1678 (Electric.PortProto)Electric.getVal(ppin, "firstPortProto");
1679 int[] ppinbox = {((Integer)Electric.getVal(ppin, "lowx")).intValue(),
1680 ((Integer)Electric.getVal(ppin, "highx")).intValue(),
1681 ((Integer)Electric.getVal(ppin, "lowy")).intValue(),
1682 ((Integer)Electric.getVal(ppin, "highy")).intValue()};
1683
1684 Electric.NodeProto napin = Electric.getNodeProto("N-Active-Pin");
1685
1686 Electric.NodeProto m1pin = Electric.getNodeProto("Metal-1-Pin");
1687 Electric.PortProto m1pinport =
1688 (Electric.PortProto)Electric.getVal(m1pin, "firstPortProto");
1689 int[] m1pinbox = {((Integer)Electric.getVal(m1pin, "lowx")).intValue()-lambda/2,
1690 ((Integer)Electric.getVal(m1pin, "highx")).intValue()+lambda/2,
1691 ((Integer)Electric.getVal(m1pin, "lowy")).intValue()-lambda/2,
1692 ((Integer)Electric.getVal(m1pin, "highy")).intValue()+lambda/2};
1693
1694 Electric.NodeProto m2pin = Electric.getNodeProto("Metal-2-Pin");
1695 Electric.PortProto m2pinport =
1696 (Electric.PortProto)Electric.getVal(m2pin, "firstPortProto");
1697 int[] m2pinbox = {((Integer)Electric.getVal(m1pin, "lowx")).intValue()-lambda/2,
1698 ((Integer)Electric.getVal(m1pin, "highx")).intValue()+lambda/2,
1699 ((Integer)Electric.getVal(m1pin, "lowy")).intValue()-lambda/2,
1700 ((Integer)Electric.getVal(m1pin, "highy")).intValue()+lambda/2};
1701
1702
1703 Electric.NodeProto nwnode = Electric.getNodeProto("N-Well-Node");
1704 int[] nwnodebox =
1705 {((Integer)Electric.getVal(nwnode, "lowx")).intValue()-lambda/2,
1706 ((Integer)Electric.getVal(nwnode, "highx")).intValue()+lambda/2,
1707 ((Integer)Electric.getVal(nwnode, "lowy")).intValue()-lambda/2,
1708 ((Integer)Electric.getVal(nwnode, "highy")).intValue()+lambda/2};
1709 Electric.NodeProto pwnode = Electric.getNodeProto("P-Well-Node");
1710 int[] pwnodebox =
1711 {((Integer)Electric.getVal(pwnode, "lowx")).intValue()-lambda/2,
1712 ((Integer)Electric.getVal(pwnode, "highx")).intValue()+lambda/2,
1713 ((Integer)Electric.getVal(pwnode, "lowy")).intValue()-lambda/2,
1714 ((Integer)Electric.getVal(pwnode, "highy")).intValue()+lambda/2};
1715
1716 int mx = 5;
1717 Electric.NodeProto mpc = Electric.getNodeProto("Metal-1-Polysilicon-1-Con");
1718 Electric.PortProto mpcport =
1719 (Electric.PortProto)Electric.getVal(mpc, "firstPortProto");
1720 int[] mpcbox = {-mx*lambda/2, mx*lambda/2, -mx*lambda/2, mx*lambda/2};
1721
1722 Electric.NodeProto m1m2c = Electric.getNodeProto("Metal-1-Metal-2-Con");
1723 Electric.PortProto m1m2cport =
1724 (Electric.PortProto)Electric.getVal(m1m2c, "firstPortProto");
1725 int[] m1m2cbox = {-5*lambda/2, 5*lambda/2, -5*lambda/2, 5*lambda/2};
1726
1727 Electric.NodeProto diffpin = Electric.getNodeProto("Active-Pin");
1728 Electric.PortProto diffpinport =
1729 (Electric.PortProto)Electric.getVal(diffpin, "firstPortProto");
1730 int[] diffpinbox =
1731 {((Integer)Electric.getVal(diffpin, "lowx")).intValue()-lambda/2,
1732 ((Integer)Electric.getVal(diffpin, "highx")).intValue()+lambda/2,
1733 ((Integer)Electric.getVal(diffpin, "lowy")).intValue()-lambda/2,
1734 ((Integer)Electric.getVal(diffpin, "highy")).intValue()+lambda/2};
1735
1736 Electric.NodeProto mnac = Electric.getNodeProto("Metal-1-N-Active-Con");
1737 Electric.PortProto mnacport =
1738 (Electric.PortProto)Electric.getVal(mnac, "firstPortProto");
1739 int aaa = 17;
1740 int[] mnacbox = {-aaa*lambda/2, aaa*lambda/2, -aaa*lambda/2, aaa*lambda/2};
1741 //centers around 6 goes up by multiples of 2
1742
1743 Electric.NodeProto mpac = Electric.getNodeProto("Metal-1-P-Active-Con");
1744 Electric.PortProto mpacport =
1745 (Electric.PortProto)Electric.getVal(mpac, "firstPortProto");
1746 int[] mpacbox = {-aaa*lambda/2, aaa*lambda/2, -aaa*lambda/2, aaa*lambda/2};
1747 //centers around 6 goes up by multiples of 2
1748
1749 Electric.NodeProto mpwc = Electric.getNodeProto("Metal-1-P-Well-Con");
1750 Electric.PortProto mpwcport =
1751 (Electric.PortProto)Electric.getVal(mpwc, "firstPortProto");
1752 int[] mpwcbox = {-17*lambda/2, 17*lambda/2, -17*lambda/2, 17*lambda/2};
1753
1754 Electric.NodeProto mnwc = Electric.getNodeProto("Metal-1-N-Well-Con");
1755 Electric.PortProto mnwcport =
1756 (Electric.PortProto)Electric.getVal(mnwc, "firstPortProto");
1757 int[] mnwcbox = {-17*lambda/2, 17*lambda/2, -17*lambda/2, 17*lambda/2};
1758
1759 Electric.ArcProto parc = Electric.getArcProto("Polysilicon-1");
1760 Electric.ArcProto m1arc = Electric.getArcProto("Metal-1");
1761 Electric.ArcProto m2arc = Electric.getArcProto("Metal-2");
1762 Electric.ArcProto ndiffarc = Electric.getArcProto("N-Active");
1763 Electric.ArcProto pdiffarc = Electric.getArcProto("P-Active");
1764
1765 /* create a cell called cellname+"{lay}" in the current library */
1766 Electric.NodeProto decn =
1767 Electric.newNodeProto(cellname+"{lay}", Electric.curLib());
1768
1769
1770 Electric.NodeProto nsnode = Electric.getNodeProto("N-Select-Node");
1771 int nselectx = 8;
1772 int nselecty = 8;
1773 int[] nsnodebox =
1774 {-nselectx*lambda/2, nselectx*lambda/2, -nselecty*lambda/2, nselecty*lambda/2};
1775
1776 Electric.NodeInst pwellnode =
1777 Electric.newNodeInst(pwnode,0,(8*lambda*(2*bits+1)),
1778 0,8*lambda*(wordlines+1),0,0,decn);
1779 Electric.NodeInst nselectnode =
1780 Electric.newNodeInst(nsnode,0,(8*lambda*(2*bits+1)),
1781 0,8*lambda*(wordlines+1),0,0,decn);
1782
1783 // Create instances of objects on decoder nmos plane
1784 x = 0;
1785 for (i=0; i<inputs+1; i++) {
1786 x += 8*lambda;
1787 y = 0;
1788 if ( i%2 ==1)
1789 {
1790 x += 0*lambda;
1791 }
1792 if (i < inputs) {
1793 if ( top == true) {
1794 ortrans[0][i] =
1795 Electric.newNodeInst(ppin, ppinbox[0]+x, ppinbox[1]+x,
1796 ppinbox[2], ppinbox[3], 0, 0, decn);
1797 }else {
1798 ortrans[0][i] =
1799 Electric.newNodeInst(mpc, mpcbox[0]+x, mpcbox[1]+x,
1800 mpcbox[2], mpcbox[3], 0, 0, decn);
1801 }
1802 }
1803 for (m=0; m<wordlines; m++) {
1804 y += 8*lambda;
1805 if (i%2 == 1) {
1806 vddpins[m][i/2] =
1807 Electric.newNodeInst(mnac, mnacbox[0]+x-4*lambda,
1808 mnacbox[1]+x-4*lambda,
1809 mnacbox[2]+y, mnacbox[3]+y, 0, 0, decn);
1810 vddports[m][i/2] = mnacport;
1811 if (m == (wordlines-1)) {
1812 pwrpins[i/2] =
1813 Electric.newNodeInst(m1pin, m1pinbox[0]+x-4*lambda,
1814 m1pinbox[1]+x-4*lambda,
1815 m1pinbox[2]+y+(8*lambda),
1816 m1pinbox[3]+y+(8*lambda), 0, 0, decn);
1817 pwrports[i/2] = m1pinport;
1818 }
1819 }
1820 if (i < inputs) {
1821 if (romplane[m][i] == 1) {
1822 // create a transistor
1823 ortrans[m+1][i] =
1824 Electric.newNodeInst(nmos, nmosbox[0]+x, nmosbox[1]+x,
1825 nmosbox[2]+y, nmosbox[3]+y, 1, 0, decn);
1826 } else {
1827 ortrans[m+1][i] =
1828 Electric.newNodeInst(ppin, ppinbox[0]+x, ppinbox[1]+x,
1829 ppinbox[2]+y, ppinbox[3]+y, 0, 0, decn);
1830 }
1831 if ( m == wordlines-1) {
1832 if (top == true) {
1833 ortrans[m+2][i] =
1834 Electric.newNodeInst(mpc, mpcbox[0]+x, mpcbox[1]+x,
1835 mpcbox[2]+y+16*lambda,
1836 mpcbox[3]+y+16*lambda,
1837 0, 0, decn);
1838 }else {
1839 ortrans[m+2][i] =
1840 Electric.newNodeInst(ppin, ppinbox[0]+x, ppinbox[1]+x,
1841 ppinbox[2]+y+4*lambda, ppinbox[3]+y+4*lambda,
1842 0, 0, decn);
1843 }
1844 }
1845 }
1846 boolean transcont = false;
1847 if (i < inputs) transcont = (romplane[m][i] == 1);
1848 if (i > 1) transcont |= (romplane[m][i-1] == 1);
1849 if (i%2 == 0 && transcont){
1850 minpins[m][i] =
1851 Electric.newNodeInst(mnac, mnacbox[0]+x-4*lambda,
1852 mnacbox[1]+x-4*lambda, mnacbox[2]+y,
1853 mnacbox[3]+y, 0, 0, decn);
1854 minports[m][i] = mnacport;
1855 m1m2pins[m][i] =
1856 Electric.newNodeInst(m1m2c, m1m2cbox[0]+x-4*lambda,
1857 m1m2cbox[1]+x-4*lambda, m1m2cbox[2]+y,
1858 m1m2cbox[3]+y, 0, 0, decn);
1859 m1m2ports[m][i] = m1m2cport;
1860 } else {
1861 minpins[m][i] =
1862 Electric.newNodeInst(m2pin, m2pinbox[0]+x-4*lambda,
1863 m2pinbox[1]+x-4*lambda, m2pinbox[2]+y,
1864 m2pinbox[3]+y, 0, 0, decn);
1865 minports[m][i] = m2pinport;
1866 if (i==0) {
1867 m1m2pins[m][i] =
1868 Electric.newNodeInst(m1m2c, m1m2cbox[0]+x-4*lambda,
1869 m1m2cbox[1]+x-4*lambda, m1m2cbox[2]+y,
1870 m1m2cbox[3]+y, 0, 0, decn);
1871 m1m2ports[m][i] = m1m2cport;
1872 } else {
1873 m1m2pins[m][i] =
1874 Electric.newNodeInst(m2pin, m2pinbox[0]+x-4*lambda,
1875 m2pinbox[1]+x-4*lambda, m2pinbox[2]+y,
1876 m2pinbox[3]+y, 0, 0, decn);
1877 m1m2ports[m][i] = m2pinport;
1878 }
1879 }
1880 if (i==0) {
1881 ap1 = m1m2pins[m][i];
1882 apport1 = m1m2ports[m][i];
1883 p = Electric.newPortProto(decn, ap1, apport1, ("mid"+m));
1884 createExport(p, INPORT);
1885 }
1886 }
1887 }
1888
1889 //finished making instances, start making arcs
1890 ap1 = pwrpins[0];
1891 apport1 = pwrports[0];
1892 appos1 = Electric.portPosition(ap1, apport1);
1893 for (i=1; i<inputs/2; i++) {
1894 ap2 = pwrpins[i];
1895 apport2 = pwrports[i];
1896 appos2 = Electric.portPosition(ap2, apport2);
1897 Electric.newArcInst(m1arc, 4*lambda, 0,
1898 ap1, apport1, appos1[0].intValue(), appos1[1].intValue(),
1899 ap2, apport2, appos2[0].intValue(), appos2[1].intValue(),
1900 decn);
1901 ap1 = ap2;
1902 apport1 = apport2;
1903 appos1 = appos2;
1904 }
1905 p = Electric.newPortProto(decn, ap1, apport1, ("gnd"));
1906 createExport(p, GNDPORT);
1907
1908 m = wordlines - 1;
1909 for (i=0; i<inputs/2; i++) {
1910 ap1 = vddpins[m][i];
1911 apport1 = vddports[m][i];
1912 appos1 = Electric.portPosition(ap1, apport1);
1913 ap2 = pwrpins[i];
1914 apport2 = pwrports[i];
1915 appos2 = Electric.portPosition(ap2, apport2);
1916 Electric.newArcInst(m1arc, 4*lambda, 0,
1917 ap1, apport1, appos1[0].intValue(), appos1[1].intValue(),
1918 ap2, apport2, appos2[0].intValue(), appos2[1].intValue(),
1919 decn);
1920 }
1921
1922 // connect polysilicon gates
1923 for (i=0; i<inputs; i++)
1924 {
1925 ap1 = ortrans[wordlines+1][i];
1926 if (top == true) {
1927 apport1 = mpcport;
1928 }else {
1929 apport1 = ppinport;
1930 }
1931 appos1 = Electric.portPosition(ap1, apport1);
1932 if (i%2 == 0) {
1933 p = Electric.newPortProto(decn, ap1, apport1, ("top_in"+(i/2)));
1934 createExport(p, INPORT);
1935 } else {
1936 p = Electric.newPortProto(decn, ap1, apport1, ("top_in"+((i-1)/2)+"_b"));
1937 createExport(p, INPORT);
1938 }
1939
1940 ap1 = ortrans[0][i];
1941 if (top == true) {
1942 apport1 = ppinport;
1943 }else {
1944 apport1 = mpcport;
1945 }
1946 appos1 = Electric.portPosition(ap1, apport1);
1947
1948 if (i%2 == 0) {
1949 p = Electric.newPortProto(decn, ap1, apport1, ("bot_in"+(i/2)));
1950 createExport(p, INPORT);
1951 } else {
1952 p = Electric.newPortProto(decn, ap1, apport1, ("bot_in"+((i-1)/2)+"_b"));
1953 createExport(p, INPORT);
1954 }
1955
1956 for (m=1; m<wordlines+1; m++) {
1957 ap2 = ortrans[m][i];
1958 if (romplane[m-1][i] == 1) {
1959 apport2 = nmosg1port;
1960 apport3 = nmosg2port;
1961 } else {
1962 apport2 = ppinport;
1963 apport3 = ppinport;
1964 }
1965 appos2 = Electric.portPosition(ap2, apport2);
1966 appos3 = Electric.portPosition(ap2, apport3);
1967 Electric.newArcInst(parc, 2*lambda, 0,
1968 ap1,apport1,appos1[0].intValue(),appos1[1].intValue(),
1969 ap2,apport2,appos2[0].intValue(),appos2[1].intValue(),
1970 decn);
1971 ap1 = ap2;
1972 apport1 = apport3;
1973 appos1 = appos3;
1974 }
1975
1976 ap2 = ortrans[wordlines+1][i];
1977 if ( top == true) {
1978 apport2 = mpcport;
1979 apport3 = mpcport;
1980 }else {
1981 apport2 = ppinport;
1982 apport3 = ppinport;
1983 }
1984 appos2 = Electric.portPosition(ap2, apport2);
1985 appos3 = Electric.portPosition(ap2, apport3);
1986 Electric.newArcInst(parc, 2*lambda, 0,
1987 ap1, apport1, appos1[0].intValue(), appos1[1].intValue(),
1988 ap2, apport2, appos2[0].intValue(), appos2[1].intValue(),
1989 decn);
1990 }
1991
1992 // connect m2 wordline lines
1993 for (m=0; m<wordlines; m++) {
1994 ap1 = m1m2pins[m][0];
1995 apport1 = m1m2ports[m][0];
1996 appos1 = Electric.portPosition(ap1, apport1);
1997 for (i=1; i<inputs+1; i++) {
1998 ap2 = m1m2pins[m][i];
1999 apport2 = m1m2ports[m][i];
2000 appos2 = Electric.portPosition(ap2, apport2);
2001 Electric.newArcInst(m2arc, 4*lambda, 0, ap1, apport1,
2002 appos1[0].intValue(), appos1[1].intValue(),
2003 ap2, apport2, appos2[0].intValue(),
2004 appos2[1].intValue(),decn);
2005 ap1 = ap2;
2006 apport1 = apport2;
2007 appos1 = appos2;
2008 }
2009 p = Electric.newPortProto(decn, ap1, apport1, ("word"+m));
2010 createExport(p, OUTPORT);
2011 }
2012
2013 // connect transistors to wordline lines
2014 for (m=0; m<wordlines; m++) {
2015 for (i=0; i<inputs; i++) {
2016 if (romplane[m][i] == 1) {
2017 // connect transistor
2018 ap1 = ortrans[m+1][i];
2019 vdd1 = ap1;
2020 if (i%2 == 0) {
2021 apport1 = nmosd1port;
2022 vddport1 = nmosd2port;
2023 ap2 = minpins[m][i];
2024 ap3 = m1m2pins[m][i];
2025 vdd2 = vddpins[m][i/2];
2026 } else {
2027 apport1 = nmosd2port;
2028 vddport1 = nmosd1port;
2029 ap2 = minpins[m][i+1];
2030 ap3 = m1m2pins[m][i+1];
2031 vdd2 = vddpins[m][i/2];
2032 }
2033 apport2 = mnacport;
2034 apport3 = m1m2cport;
2035 vddport2 = mnacport;
2036
2037 appos1 = Electric.portPosition(ap1, apport1);
2038 vddpos1 = Electric.portPosition(vdd1, vddport1);
2039 appos2 = Electric.portPosition(ap2, apport2);
2040 appos3 = Electric.portPosition(ap3, apport3);
2041 vddpos2 = Electric.portPosition(vdd2, vddport2);
2042
2043 //ndiffarc size centers around 12 and goes up by multiples of 2
2044 Electric.newArcInst(ndiffarc, 16*lambda, 0, ap1, apport1,
2045 appos1[0].intValue(), appos1[1].intValue(), ap2,
2046 apport2, appos2[0].intValue(),
2047 appos2[1].intValue(),decn);
2048 Electric.newArcInst(ndiffarc, 16*lambda, 0, vdd1, vddport1,
2049 vddpos1[0].intValue(), vddpos1[1].intValue(), vdd2,
2050 vddport2, vddpos2[0].intValue(),
2051 vddpos2[1].intValue(),decn);
2052
2053 Electric.newArcInst(m1arc, 4*lambda, 0, ap2, apport2,
2054 appos2[0].intValue(), appos2[1].intValue(), ap3,
2055 apport3, appos3[0].intValue(),
2056 appos3[1].intValue(),decn);
2057 }
2058 }
2059 }
2060
2061 // connect vdd lines
2062 for (i=0; i<inputs/2; i++) {
2063 ap1 = vddpins[0][i];
2064 apport1 = vddports[0][i];
2065 appos1 = Electric.portPosition(ap1, apport1);
2066 for (m=1; m<wordlines; m++) {
2067 ap2 = vddpins[m][i];
2068 apport2 = vddports[m][i];
2069 appos2 = Electric.portPosition(ap2, apport2);
2070 Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1,
2071 appos1[0].intValue(), appos1[1].intValue(),
2072 ap2, apport2, appos2[0].intValue(),
2073 appos2[1].intValue(),decn);
2074 ap1 = ap2;
2075 apport1 = apport2;
2076 appos1 = appos2;
2077 }
2078 }
2079 }
2080 ////////////////////decodernmos end
2081
2082 ////////////////////decoderpmos
decoderpmos(int lambda, int bits, String cellname, boolean top)2083 public static void decoderpmos(int lambda, int bits, String cellname, boolean top) {
2084
2085 int[][] romplane = generateplane(bits);
2086 int i, m, o;
2087 int x, y;
2088 Electric.NodeInst ap1, ap2, ap3, apx, apy;
2089 Electric.PortProto p, apport1, apport2, apport3, apportx, apporty;
2090 Integer[] appos1, appos2, appos3, apposx, apposy;
2091 int inputs = romplane[0].length;
2092 int wordlines = romplane.length;
2093
2094 Electric.NodeInst[][] andtrans = new Electric.NodeInst[wordlines+2][inputs+2];
2095 Electric.NodeInst[][] minpins = new Electric.NodeInst[wordlines+3][inputs+2];
2096 Electric.NodeInst[] m1m2pins = new Electric.NodeInst[wordlines+2];
2097 Electric.NodeInst[] m2pins = new Electric.NodeInst[wordlines+2];
2098 Electric.NodeInst vddpin = new Electric.NodeInst();
2099 Electric.NodeInst vddipin = new Electric.NodeInst();
2100 Electric.NodeInst vddbpin = new Electric.NodeInst();
2101 Electric.NodeInst vddcpin = new Electric.NodeInst();
2102
2103 Electric.PortProto[][] minports = new Electric.PortProto[wordlines+2][inputs+2];
2104 Electric.PortProto[] m1m2ports = new Electric.PortProto[wordlines+2];
2105 Electric.PortProto[] m2ports = new Electric.PortProto[wordlines+2];
2106 Electric.PortProto vddport = new Electric.PortProto();
2107 Electric.PortProto vddiport = new Electric.PortProto();
2108 Electric.PortProto vddbport = new Electric.PortProto();
2109 Electric.PortProto vddcport = new Electric.PortProto();
2110
2111 /* get pointers to primitives */
2112 Electric.NodeProto nmos = Electric.getNodeProto("N-Transistor");
2113 Electric.PortProto nmosg1port = Electric.getPortProto(nmos, "n-trans-poly-right");
2114 Electric.PortProto nmosg2port = Electric.getPortProto(nmos, "n-trans-poly-left");
2115 Electric.PortProto nmosd1port = Electric.getPortProto(nmos, "n-trans-diff-top");
2116 Electric.PortProto nmosd2port = Electric.getPortProto(nmos, "n-trans-diff-bottom");
2117 int[] nmosbox = {((Integer)Electric.getVal(nmos, "lowx")).intValue()-lambda/2,
2118 ((Integer)Electric.getVal(nmos, "highx")).intValue()+lambda/2,
2119 ((Integer)Electric.getVal(nmos, "lowy")).intValue(),
2120 ((Integer)Electric.getVal(nmos, "highy")).intValue()};
2121
2122 Electric.NodeProto pmos = Electric.getNodeProto("P-Transistor");
2123 Electric.PortProto pmosg1port = Electric.getPortProto(pmos, "p-trans-poly-right");
2124 Electric.PortProto pmosg2port = Electric.getPortProto(pmos, "p-trans-poly-left");
2125 Electric.PortProto pmosd1port = Electric.getPortProto(pmos, "p-trans-diff-top");
2126 Electric.PortProto pmosd2port = Electric.getPortProto(pmos, "p-trans-diff-bottom");
2127 int[] pmosbox = {((Integer)Electric.getVal(pmos, "lowx")).intValue()-lambda/2,
2128 ((Integer)Electric.getVal(pmos, "highx")).intValue()+lambda/2,
2129 ((Integer)Electric.getVal(pmos, "lowy")).intValue(),
2130 ((Integer)Electric.getVal(pmos, "highy")).intValue()};
2131
2132 Electric.NodeProto ppin = Electric.getNodeProto("Polysilicon-1-Pin");
2133 Electric.PortProto ppinport =
2134 (Electric.PortProto)Electric.getVal(ppin, "firstPortProto");
2135 int[] ppinbox = {((Integer)Electric.getVal(ppin, "lowx")).intValue(),
2136 ((Integer)Electric.getVal(ppin, "highx")).intValue(),
2137 ((Integer)Electric.getVal(ppin, "lowy")).intValue(),
2138 ((Integer)Electric.getVal(ppin, "highy")).intValue()};
2139
2140 Electric.NodeProto napin = Electric.getNodeProto("N-Active-Pin");
2141
2142 Electric.NodeProto m1pin = Electric.getNodeProto("Metal-1-Pin");
2143 Electric.PortProto m1pinport =
2144 (Electric.PortProto)Electric.getVal(m1pin, "firstPortProto");
2145 int[] m1pinbox = {((Integer)Electric.getVal(m1pin, "lowx")).intValue()-lambda/2,
2146 ((Integer)Electric.getVal(m1pin, "highx")).intValue()+lambda/2,
2147 ((Integer)Electric.getVal(m1pin, "lowy")).intValue()-lambda/2,
2148 ((Integer)Electric.getVal(m1pin, "highy")).intValue()+lambda/2};
2149
2150 Electric.NodeProto m2pin = Electric.getNodeProto("Metal-2-Pin");
2151 Electric.PortProto m2pinport =
2152 (Electric.PortProto)Electric.getVal(m2pin, "firstPortProto");
2153 int[] m2pinbox = {((Integer)Electric.getVal(m1pin, "lowx")).intValue()-lambda/2,
2154 ((Integer)Electric.getVal(m1pin, "highx")).intValue()+lambda/2,
2155 ((Integer)Electric.getVal(m1pin, "lowy")).intValue()-lambda/2,
2156 ((Integer)Electric.getVal(m1pin, "highy")).intValue()+lambda/2};
2157
2158 int mx = 5;
2159 Electric.NodeProto mpc = Electric.getNodeProto("Metal-1-Polysilicon-1-Con");
2160 Electric.PortProto mpcport =
2161 (Electric.PortProto)Electric.getVal(mpc, "firstPortProto");
2162 int[] mpcbox = {-mx*lambda/2, mx*lambda/2, -mx*lambda/2, mx*lambda/2};
2163
2164 Electric.NodeProto diffpin = Electric.getNodeProto("Active-Pin");
2165 Electric.PortProto diffpinport =
2166 (Electric.PortProto)Electric.getVal(diffpin, "firstPortProto");
2167 int[] diffpinbox =
2168 {((Integer)Electric.getVal(diffpin, "lowx")).intValue()-lambda/2,
2169 ((Integer)Electric.getVal(diffpin, "highx")).intValue()+lambda/2,
2170 ((Integer)Electric.getVal(diffpin, "lowy")).intValue()-lambda/2,
2171 ((Integer)Electric.getVal(diffpin, "highy")).intValue()+lambda/2};
2172
2173 Electric.NodeProto m1m2c = Electric.getNodeProto("Metal-1-Metal-2-Con");
2174 Electric.PortProto m1m2cport =
2175 (Electric.PortProto)Electric.getVal(m1m2c, "firstPortProto");
2176 int[] m1m2cbox = {-5*lambda/2, 5*lambda/2, -5*lambda/2, 5*lambda/2};
2177
2178 Electric.NodeProto mnac = Electric.getNodeProto("Metal-1-N-Active-Con");
2179 Electric.PortProto mnacport =
2180 (Electric.PortProto)Electric.getVal(mnac, "firstPortProto");
2181 int[] mnacbox = {-17*lambda/2, 17*lambda/2, -17*lambda/2, 17*lambda/2};
2182 //centers around 6 goes up by multiples of 2
2183
2184 Electric.NodeProto mpac = Electric.getNodeProto("Metal-1-P-Active-Con");
2185 Electric.PortProto mpacport =
2186 (Electric.PortProto)Electric.getVal(mpac, "firstPortProto");
2187 int[] mpacbox = {-17*lambda/2, 17*lambda/2, -17*lambda/2, 17*lambda/2};
2188 //centers around 6 goes up my multiple of 2
2189
2190
2191
2192 Electric.NodeProto mnwc = Electric.getNodeProto("Metal-1-N-Well-Con");
2193 Electric.PortProto mnwcport =
2194 (Electric.PortProto)Electric.getVal(mnwc, "firstPortProto");
2195 int[] mnwcbox = {-17*lambda/2, 17*lambda/2, -17*lambda/2, 17*lambda/2};
2196
2197 Electric.NodeProto mpwc = Electric.getNodeProto("Metal-1-P-Well-Con");
2198 Electric.PortProto mpwcport =
2199 (Electric.PortProto)Electric.getVal(mpwc, "firstPortProto");
2200 int[] mpwcbox = {-2*lambda, 2*lambda, -2*lambda, 2*lambda};
2201
2202 Electric.ArcProto parc = Electric.getArcProto("Polysilicon-1");
2203 Electric.ArcProto m1arc = Electric.getArcProto("Metal-1");
2204 Electric.ArcProto m2arc = Electric.getArcProto("Metal-2");
2205 Electric.ArcProto ndiffarc = Electric.getArcProto("N-Active");
2206 Electric.ArcProto pdiffarc = Electric.getArcProto("P-Active");
2207
2208 Electric.NodeProto nwnode = Electric.getNodeProto("N-Well-Node");
2209 int[] nwnodebox =
2210 {((Integer)Electric.getVal(nwnode, "lowx")).intValue()-lambda/2,
2211 ((Integer)Electric.getVal(nwnode, "highx")).intValue()+lambda/2,
2212 ((Integer)Electric.getVal(nwnode, "lowy")).intValue()-lambda/2,
2213 ((Integer)Electric.getVal(nwnode, "highy")).intValue()+lambda/2};
2214 Electric.NodeProto pwnode = Electric.getNodeProto("P-Well-Node");
2215 int[] pwnodebox =
2216 {((Integer)Electric.getVal(pwnode, "lowx")).intValue()-lambda/2,
2217 ((Integer)Electric.getVal(pwnode, "highx")).intValue()+lambda/2,
2218 ((Integer)Electric.getVal(pwnode, "lowy")).intValue()-lambda/2,
2219 ((Integer)Electric.getVal(pwnode, "highy")).intValue()+lambda/2};
2220
2221 /* create a cell called cellname+"{lay}" in the current library */
2222 Electric.NodeProto decp =
2223 Electric.newNodeProto(cellname+"{lay}", Electric.curLib());
2224
2225 Electric.NodeProto psnode = Electric.getNodeProto("P-Select-Node");
2226 int pselectx = 8;
2227 int pselecty = 8;
2228 int[] psnodebox =
2229 {-pselectx*lambda/2, pselectx*lambda/2, -pselecty*lambda/2, pselecty*lambda/2};
2230
2231 Electric.NodeInst nwellnode =
2232 Electric.newNodeInst(nwnode,0,(8*lambda*(2*bits)),
2233 0,8*lambda*(wordlines+1),0,0,decp);
2234 Electric.NodeInst pselectnode =
2235 Electric.newNodeInst(psnode,0,(8*lambda*(2*bits)),
2236 0,8*lambda*(wordlines+1),0,0,decp);
2237
2238 // Create instances of objects on decoder pmos plane
2239 x = 0;
2240 for (i=0; i<inputs+1; i++) {
2241 x += 8*lambda;
2242 y = 0;
2243
2244 if (i < inputs) {
2245 if ( top == true) {
2246 andtrans[0][i] =
2247 Electric.newNodeInst(ppin, ppinbox[0]+x, ppinbox[1]+x,
2248 ppinbox[2], ppinbox[3], 0, 0, decp);
2249
2250 }else {
2251 andtrans[0][i] =
2252 Electric.newNodeInst(mpc, mpcbox[0]+x, mpcbox[1]+x,
2253 mpcbox[2], mpcbox[3], 0, 0, decp);
2254 }
2255 }
2256 for (m=0; m<wordlines; m++) {
2257 y += 8*lambda;
2258 if (i < inputs) {
2259 if (romplane[m][i] == 1) {
2260 // create a transistor
2261 andtrans[m+1][i] =
2262 Electric.newNodeInst(pmos, pmosbox[0]+x, pmosbox[1]+x,
2263 pmosbox[2]+y, pmosbox[3]+y, 1, 0, decp);
2264 } else {
2265 andtrans[m+1][i] =
2266 Electric.newNodeInst(ppin, ppinbox[0]+x, ppinbox[1]+x,
2267 ppinbox[2]+y, ppinbox[3]+y, 0, 0, decp);
2268 }
2269 if ( m == wordlines-1) {
2270 if (top == true) {
2271 andtrans[m+2][i] =
2272 Electric.newNodeInst(mpc, mpcbox[0]+x, mpcbox[1]+x,
2273 mpcbox[2]+y+16*lambda,
2274 mpcbox[3]+y+16*lambda,0,0,decp);
2275 }else {
2276 andtrans[m+2][i] =
2277 Electric.newNodeInst(ppin, ppinbox[0]+x, ppinbox[1]+x,
2278 ppinbox[2]+y+4*lambda, ppinbox[3]+y+4*lambda,
2279 0, 0, decp);
2280 }
2281 }
2282 }
2283
2284 boolean transcont = false;
2285 if (i < inputs) transcont = (romplane[m][i] == 1);
2286 if (i == 0) {
2287 m1m2pins[m] =
2288 Electric.newNodeInst(m1m2c, m1m2cbox[0]+x-4*lambda,
2289 m1m2cbox[1]+x-4*lambda, m1m2cbox[2]+y,
2290 m1m2cbox[3]+y, 0, 0, decp);
2291 m1m2ports[m] = m1m2cport;
2292 }
2293 if (i == (inputs)) {
2294 m2pins[m] =
2295 Electric.newNodeInst(m2pin, m2pinbox[0]+x-4*lambda,
2296 m2pinbox[1]+x-4*lambda, m2pinbox[2]+y,
2297 m2pinbox[3]+y, 0, 0, decp);
2298 m2ports[m] = m2pinport;
2299 }
2300 if (i >= 1) transcont |= (romplane[m][i-1] == 1);
2301 if (transcont){
2302 minpins[m][i] =
2303 Electric.newNodeInst(mpac, mpacbox[0]+x-4*lambda,
2304 mpacbox[1]+x-4*lambda, mpacbox[2]+y,
2305 mpacbox[3]+y, 0, 0, decp);
2306 minports[m][i] = mpacport;
2307 } else {
2308 if ( i == inputs) {
2309 minpins[m][i] =
2310 Electric.newNodeInst(mnwc, mnwcbox[0]+x-4*lambda,
2311 mnwcbox[1]+x-4*lambda, mnwcbox[2]+y,
2312 mnwcbox[3]+y, 0, 0, decp);
2313 minports[m][i] = mnwcport;
2314 } else {
2315 minpins[m][i] =
2316 Electric.newNodeInst(m1pin, m1pinbox[0]+x-4*lambda,
2317 m1pinbox[1]+x-4*lambda, m1pinbox[2]+y,
2318 m1pinbox[3]+y, 0, 0, decp);
2319 minports[m][i] = m1pinport;
2320 }
2321 }
2322 if (i == inputs) {
2323 vddpin =
2324 Electric.newNodeInst(m1pin, m1pinbox[0]+x-4*lambda,
2325 m1pinbox[1]+x-4*lambda,
2326 m1pinbox[2]+y+8*lambda,
2327 m1pinbox[3]+y+8*lambda, 0, 0, decp);
2328 vddport = m1pinport;
2329 if (m == 0) {
2330 vddbpin =
2331 Electric.newNodeInst(m1pin, m1pinbox[0]+x+4*lambda,
2332 m1pinbox[1]+x+4*lambda,
2333 m1pinbox[2]+y+0*lambda,
2334 m1pinbox[3]+y+0*lambda, 0, 0, decp);
2335 vddbport = m1pinport;
2336 }
2337 if (m == wordlines-1) {
2338 vddcpin =
2339 Electric.newNodeInst(m1m2c, m1m2cbox[0]+x+4*lambda,
2340 m1m2cbox[1]+x+4*lambda,
2341 m1m2cbox[2]+y+8*lambda,
2342 m1m2cbox[3]+y+8*lambda, 0, 0, decp);
2343 vddcport = m1m2cport;
2344 }
2345 }
2346 }
2347 }
2348
2349 // connect polysilicon gates
2350 for (i=0; i<inputs; i++)
2351 {
2352 ap1 = andtrans[wordlines+1][i];
2353 if (top == true) {
2354 apport1 = mpcport;
2355 }else {
2356 apport1 = ppinport;
2357 }
2358 appos1 = Electric.portPosition(ap1, apport1);
2359 if (i%2 == 0) {
2360 p = Electric.newPortProto(decp, ap1, apport1, ("top_in"+(i/2)));
2361 createExport(p, INPORT);
2362 } else {
2363 p = Electric.newPortProto(decp, ap1, apport1, ("top_in"+((i-1)/2)+"_b"));
2364 createExport(p, INPORT);
2365 }
2366 ap1 = andtrans[0][i];
2367 if (top == true) {
2368 apport1 = ppinport;
2369 }else {
2370 apport1 = mpcport;
2371 }
2372 appos1 = Electric.portPosition(ap1, apport1);
2373 if (i%2 == 0) {
2374 p = Electric.newPortProto(decp, ap1, apport1, ("bot_in"+(i/2)));
2375 createExport(p, INPORT);
2376 } else {
2377 p = Electric.newPortProto(decp, ap1, apport1, ("bot_in"+((i-1)/2)+"_b"));
2378 createExport(p, INPORT);
2379 }
2380 for (m=1; m<wordlines+1; m++) {
2381 ap2 = andtrans[m][i];
2382 if (romplane[m-1][i] == 1) {
2383 apport2 = pmosg1port;
2384 apport3 = pmosg2port;
2385 } else {
2386 apport2 = ppinport;
2387 apport3 = ppinport;
2388 }
2389 appos2 = Electric.portPosition(ap2, apport2);
2390 appos3 = Electric.portPosition(ap2, apport3);
2391 Electric.newArcInst(parc,2*lambda,0,ap1,apport1,appos1[0].intValue(),
2392 appos1[1].intValue(),ap2,apport2,appos2[0].intValue(),
2393 appos2[1].intValue(),decp);
2394 ap1 = ap2;
2395 apport1 = apport3;
2396 appos1 = appos3;
2397 }
2398
2399 ap2 = andtrans[wordlines+1][i];
2400 if ( top == true) {
2401 apport2 = mpcport;
2402 apport3 = mpcport;
2403 }else {
2404 apport2 = ppinport;
2405 apport3 = ppinport;
2406 }
2407 appos2 = Electric.portPosition(ap2, apport2);
2408 appos3 = Electric.portPosition(ap2, apport3);
2409 Electric.newArcInst(parc,2*lambda,0,ap1,apport1,appos1[0].intValue(),
2410 appos1[1].intValue(),ap2,apport2,appos2[0].intValue(),
2411 appos2[1].intValue(),decp);
2412 }
2413
2414 // connect m1 wordline lines
2415 for (m=0; m<wordlines; m++) {
2416 ap1 = minpins[m][0];
2417 apport1 = minports[m][0];
2418 appos1 = Electric.portPosition(ap1, apport1);
2419 for (i=1; i<inputs+1; i++) {
2420 ap2 = minpins[m][i];
2421 apport2 = minports[m][i];
2422 appos2 = Electric.portPosition(ap2, apport2);
2423 if (romplane[m][i-1] != 1) {
2424 Electric.newArcInst(m1arc,4*lambda,0,ap1,apport1,appos1[0].intValue(),
2425 appos1[1].intValue(),ap2,apport2,
2426 appos2[0].intValue(), appos2[1].intValue(),decp);
2427 }
2428 ap1 = ap2;
2429 apport1 = apport2;
2430 appos1 = appos2;
2431 }
2432 }
2433
2434 // connect transistors to wordline lines
2435 for (m=0; m<wordlines; m++) {
2436 for (i=0; i<inputs; i++) {
2437 if (romplane[m][i] == 1) {
2438 ap1 = andtrans[m+1][i];
2439 apport1 = pmosd1port;
2440 apport2 = pmosd2port;
2441 appos1 = Electric.portPosition(ap1, apport1);
2442 appos2 = Electric.portPosition(ap1, apport2);
2443 apx = minpins[m][i];
2444 apy = minpins[m][i+1];
2445 apportx = mpacport;
2446 apporty = mpacport;
2447 apposx = Electric.portPosition(apx, apportx);
2448 apposy = Electric.portPosition(apy, apporty);
2449 // pdiffarc size centers around 12 and goes up by multiples of 2
2450 Electric.newArcInst(pdiffarc,16*lambda,0,ap1,apport1,
2451 appos1[0].intValue(), appos1[1].intValue(),apx,
2452 apportx,apposx[0].intValue(),apposx[1].intValue(),
2453 decp);
2454 Electric.newArcInst(pdiffarc,16*lambda,0,ap1,apport2,
2455 appos2[0].intValue(), appos2[1].intValue(),apy,
2456 apporty,apposy[0].intValue(),apposy[1].intValue(),
2457 decp);
2458 }
2459 }
2460 }
2461
2462 // connect ground lines
2463 i = inputs;
2464 ap1 = minpins[0][i];
2465 apport1 = minports[0][i];
2466 appos1 = Electric.portPosition(ap1, apport1);
2467 for (m=1; m<wordlines; m++) {
2468 ap2 = minpins[m][i];
2469 apport2 = minports[m][i];
2470 appos2 = Electric.portPosition(ap2, apport2);
2471 Electric.newArcInst(m1arc,4*lambda,0,ap1,apport1,appos1[0].intValue(),
2472 appos1[1].intValue(),ap2,apport2,appos2[0].intValue(),
2473 appos2[1].intValue(),decp);
2474 ap1 = ap2;
2475 apport1 = apport2;
2476 appos1 = appos2;
2477 }
2478
2479 ap1 = vddpin;
2480 apport1 = vddport;
2481 appos1 = Electric.portPosition(ap1, apport1);
2482 ap2 = minpins[wordlines-1][inputs];
2483 apport2 = minports[wordlines-1][inputs];
2484 appos2 = Electric.portPosition(ap2, apport2);
2485 Electric.newArcInst(m1arc,4*lambda,0,ap1,apport1,appos1[0].intValue(),
2486 appos1[1].intValue(),ap2,apport2,appos2[0].intValue(),
2487 appos2[1].intValue(),decp);
2488
2489 ap1 = vddcpin;
2490 apport1 = vddcport;
2491 appos1 = Electric.portPosition(ap1, apport1);
2492 ap2 = vddpin;
2493 apport2 = vddport;
2494 appos2 = Electric.portPosition(ap2, apport2);
2495 Electric.newArcInst(m1arc,4*lambda,0,ap1,apport1,appos1[0].intValue(),
2496 appos1[1].intValue(),ap2,apport2,appos2[0].intValue(),
2497 appos2[1].intValue(),decp);
2498 p = Electric.newPortProto(decp, ap1, apport1, "vdd");
2499 createExport(p, PWRPORT);
2500
2501 ap1 = vddbpin;
2502 apport1 = vddbport;
2503 appos1 = Electric.portPosition(ap1, apport1);
2504 ap2 = minpins[0][inputs];
2505 apport2 = minports[0][inputs];
2506 appos2 = Electric.portPosition(ap2, apport2);
2507 Electric.newArcInst(m1arc,4*lambda,0,ap1,apport1,appos1[0].intValue(),
2508 appos1[1].intValue(),ap2,apport2,appos2[0].intValue(),
2509 appos2[1].intValue(),decp);
2510 p = Electric.newPortProto(decp, ap1, apport1, "vddb");
2511 createExport(p, PWRPORT);
2512
2513 // connect metal 2 lines
2514 for (m=0; m<wordlines; m++) {
2515 ap1 = m1m2pins[m];
2516 apport1 = m1m2ports[m];
2517 appos1 = Electric.portPosition(ap1,apport1);
2518 ap2 = m2pins[m];
2519 apport2 = m2ports[m];
2520 appos2 = Electric.portPosition(ap2, apport2);
2521 ap3 = minpins[m][0];
2522 apport3 = minports[m][0];
2523 appos3 = Electric.portPosition(ap3, apport3);
2524 Electric.newArcInst(m2arc,4*lambda,0,ap1,apport1,appos1[0].intValue(),
2525 appos1[1].intValue(),ap2,apport2,appos2[0].intValue(),
2526 appos2[1].intValue(),decp);
2527 Electric.newArcInst(m1arc,4*lambda,0,ap1,apport1,appos1[0].intValue(),
2528 appos1[1].intValue(),ap3,apport3,appos3[0].intValue(),
2529 appos3[1].intValue(),decp);
2530 p = Electric.newPortProto(decp, ap2, apport2, ("word"+m));
2531 createExport(p, OUTPORT);
2532 p = Electric.newPortProto(decp, ap1, apport1, ("wordin"+m));
2533 createExport(p, INPORT);
2534 }
2535 }
2536 ////////////////////decoderpmos end
2537
generatemuxarray(int folds, int romoutputs)2538 private static int[][] generatemuxarray(int folds, int romoutputs) {
2539 int muxes = romoutputs/folds;
2540 int[][] muxarray = new int[romoutputs][folds];
2541 for (int i=0; i<muxes; i++) {
2542 for (int j=0; j<folds; j++) {
2543 for (int k=0; k<folds; k++) {
2544 if (j == k) {
2545 muxarray[i*folds+j][k] = 1;
2546 } else {
2547 muxarray[i*folds+j][k] = 0;
2548 }
2549 }
2550 }
2551 }
2552 StringBuffer sb = new StringBuffer();
2553 for (int i=0; i<romoutputs; i++) {
2554 sb = new StringBuffer();
2555 for (int j=0; j<folds; j++) {
2556 sb.append(Integer.toString(muxarray[i][j]));
2557 }
2558 }
2559 return muxarray;
2560 }
2561
2562
2563
muxplane(int lambda, int folds, int romoutputs, String mp)2564 public static void muxplane(int lambda, int folds, int romoutputs, String mp) {
2565 int[][] muxarray = generatemuxarray(folds,romoutputs);
2566 int muxnumber = folds;
2567 int selects = folds;
2568 int outputbits = romoutputs;
2569
2570 int i, m, o;
2571 int x, y;
2572 Electric.NodeInst ap1, ap2, ap3, apx, apy;
2573 Electric.PortProto p, apport1, apport2, apport3, apportx, apporty;
2574 Integer[] appos1, appos2, appos3, apposx, apposy;
2575
2576 Electric.NodeInst[][] ntrans = new Electric.NodeInst[outputbits+2][selects+2];
2577 Electric.NodeInst[][] minpins = new Electric.NodeInst[outputbits+2][selects+2];
2578 Electric.NodeInst[] m1m2pins2 = new Electric.NodeInst[outputbits+2];
2579 Electric.NodeInst[] m1m2pins = new Electric.NodeInst[selects+2];
2580 Electric.NodeInst[] m2pins = new Electric.NodeInst[outputbits+2];
2581 Electric.NodeInst[] m1polypins = new Electric.NodeInst[outputbits+2];
2582
2583 Electric.PortProto[][] minports = new Electric.PortProto[outputbits+2][selects+2];
2584 Electric.PortProto[] m1m2ports2 = new Electric.PortProto[outputbits+2];
2585 Electric.PortProto[] m1m2ports = new Electric.PortProto[selects+2];
2586 Electric.PortProto[] m2ports = new Electric.PortProto[outputbits+2];
2587 Electric.PortProto[] m1polyports = new Electric.PortProto[outputbits+2];
2588
2589 /* get pointers to primitives */
2590 Electric.NodeProto nmos = Electric.getNodeProto("N-Transistor");
2591 Electric.PortProto nmosg1port = Electric.getPortProto(nmos, "n-trans-poly-right");
2592 Electric.PortProto nmosg2port = Electric.getPortProto(nmos, "n-trans-poly-left");
2593 Electric.PortProto nmosd1port = Electric.getPortProto(nmos, "n-trans-diff-top");
2594 Electric.PortProto nmosd2port = Electric.getPortProto(nmos, "n-trans-diff-bottom");
2595 int[] nmosbox = {((Integer)Electric.getVal(nmos, "lowx")).intValue()-lambda/2,
2596 ((Integer)Electric.getVal(nmos, "highx")).intValue()+lambda/2,
2597 ((Integer)Electric.getVal(nmos, "lowy")).intValue(),
2598 ((Integer)Electric.getVal(nmos, "highy")).intValue()};
2599
2600 Electric.NodeProto pmos = Electric.getNodeProto("P-Transistor");
2601 Electric.PortProto pmosg1port = Electric.getPortProto(pmos, "p-trans-poly-right");
2602 Electric.PortProto pmosg2port = Electric.getPortProto(pmos, "p-trans-poly-left");
2603 Electric.PortProto pmosd1port = Electric.getPortProto(pmos, "p-trans-diff-top");
2604 Electric.PortProto pmosd2port = Electric.getPortProto(pmos, "p-trans-diff-bottom");
2605 int[] pmosbox = {((Integer)Electric.getVal(nmos, "lowx")).intValue()-lambda/2,
2606 ((Integer)Electric.getVal(nmos, "highx")).intValue()+lambda/2,
2607 ((Integer)Electric.getVal(nmos, "lowy")).intValue(),
2608 ((Integer)Electric.getVal(nmos, "highy")).intValue()};
2609
2610 Electric.NodeProto ppin = Electric.getNodeProto("Polysilicon-1-Pin");
2611 Electric.PortProto ppinport =
2612 (Electric.PortProto)Electric.getVal(ppin, "firstPortProto");
2613 int[] ppinbox = {((Integer)Electric.getVal(ppin, "lowx")).intValue(),
2614 ((Integer)Electric.getVal(ppin, "highx")).intValue(),
2615 ((Integer)Electric.getVal(ppin, "lowy")).intValue(),
2616 ((Integer)Electric.getVal(ppin, "highy")).intValue()};
2617
2618 Electric.NodeProto napin = Electric.getNodeProto("N-Active-Pin");
2619
2620 Electric.NodeProto m1pin = Electric.getNodeProto("Metal-1-Pin");
2621 Electric.PortProto m1pinport =
2622 (Electric.PortProto)Electric.getVal(m1pin, "firstPortProto");
2623 int[] m1pinbox = {((Integer)Electric.getVal(m1pin, "lowx")).intValue()-lambda/2,
2624 ((Integer)Electric.getVal(m1pin, "highx")).intValue()+lambda/2,
2625 ((Integer)Electric.getVal(m1pin, "lowy")).intValue()-lambda/2,
2626 ((Integer)Electric.getVal(m1pin, "highy")).intValue()+lambda/2};
2627
2628 Electric.NodeProto m2pin = Electric.getNodeProto("Metal-2-Pin");
2629 Electric.PortProto m2pinport =
2630 (Electric.PortProto)Electric.getVal(m2pin, "firstPortProto");
2631 int[] m2pinbox = {((Integer)Electric.getVal(m1pin, "lowx")).intValue()-lambda/2,
2632 ((Integer)Electric.getVal(m1pin, "highx")).intValue()+lambda/2,
2633 ((Integer)Electric.getVal(m1pin, "lowy")).intValue()-lambda/2,
2634 ((Integer)Electric.getVal(m1pin, "highy")).intValue()+lambda/2};
2635
2636 Electric.NodeProto diffpin = Electric.getNodeProto("Active-Pin");
2637 Electric.PortProto diffpinport =
2638 (Electric.PortProto)Electric.getVal(diffpin, "firstPortProto");
2639 int[] diffpinbox =
2640 {((Integer)Electric.getVal(diffpin, "lowx")).intValue()-lambda/2,
2641 ((Integer)Electric.getVal(diffpin, "highx")).intValue()+lambda/2,
2642 ((Integer)Electric.getVal(diffpin, "lowy")).intValue()-lambda/2,
2643 ((Integer)Electric.getVal(diffpin, "highy")).intValue()+lambda/2};
2644
2645 Electric.NodeProto m1m2c = Electric.getNodeProto("Metal-1-Metal-2-Con");
2646 Electric.PortProto m1m2cport =
2647 (Electric.PortProto)Electric.getVal(m1m2c, "firstPortProto");
2648 int[] m1m2cbox = {-5*lambda/2, 5*lambda/2, -5*lambda/2, 5*lambda/2};
2649
2650 Electric.NodeProto mnac = Electric.getNodeProto("Metal-1-N-Active-Con");
2651 Electric.PortProto mnacport =
2652 (Electric.PortProto)Electric.getVal(mnac, "firstPortProto");
2653 int mult = 17;
2654 int[] mnacbox = {-1*mult*lambda/2, mult*lambda/2, -1*mult*lambda/2, mult*lambda/2};
2655
2656 Electric.NodeProto mpac = Electric.getNodeProto("Metal-1-N-Active-Con");
2657
2658 Electric.NodeProto mpwc = Electric.getNodeProto("Metal-1-P-Well-Con");
2659 Electric.PortProto mpwcport =
2660 (Electric.PortProto)Electric.getVal(mpwc, "firstPortProto");
2661 int[] mpwcbox = {-2*lambda, 2*lambda, -2*lambda, 2*lambda};
2662
2663 Electric.NodeProto mpc = Electric.getNodeProto("Metal-1-Polysilicon-1-Con");
2664 Electric.PortProto mpcport =
2665 (Electric.PortProto)Electric.getVal(mpc, "firstPortProto");
2666 int mx = 5;
2667 int[] mpcbox = {-mx*lambda/2, mx*lambda/2, -mx*lambda/2, mx*lambda/2};
2668
2669 Electric.ArcProto parc = Electric.getArcProto("Polysilicon-1");
2670 Electric.ArcProto m1arc = Electric.getArcProto("Metal-1");
2671 Electric.ArcProto m2arc = Electric.getArcProto("Metal-2");
2672 Electric.ArcProto ndiffarc = Electric.getArcProto("N-Active");
2673
2674 Electric.NodeProto pwnode = Electric.getNodeProto("P-Well-Node");
2675 int[] pwnodebox =
2676 {((Integer)Electric.getVal(pwnode, "lowx")).intValue()-lambda/2,
2677 ((Integer)Electric.getVal(pwnode, "highx")).intValue()+lambda/2,
2678 ((Integer)Electric.getVal(pwnode, "lowy")).intValue()-lambda/2,
2679 ((Integer)Electric.getVal(pwnode, "highy")).intValue()+lambda/2};
2680
2681
2682 /* create a cell called "muxplane{lay}" in the current library */
2683 Electric.NodeProto muxplane =
2684 Electric.newNodeProto(mp+"{lay}", Electric.curLib());
2685
2686 Electric.NodeInst pwellnode =
2687 Electric.newNodeInst(pwnode,-8*lambda,lambda*8*(folds+1),
2688 -8*lambda,8*lambda*3*romoutputs/2,0,0,muxplane);
2689
2690 // Create instances of objects in mux plane
2691 x = 0;
2692 for (i=0; i<selects+1; i++) {
2693 x += 8*lambda;
2694 y = 0;
2695 if (i < selects) {
2696 ntrans[0][i] =
2697 Electric.newNodeInst(ppin, ppinbox[0]+x, ppinbox[1]+x, ppinbox[2],
2698 ppinbox[3], 0, 0, muxplane);
2699 m1polypins[i] =
2700 Electric.newNodeInst(mpc, mpcbox[0]+x, mpcbox[1]+x, mpcbox[2],
2701 mpcbox[3], 0, 0, muxplane);
2702 m1m2pins[i] =
2703 Electric.newNodeInst(m1m2c, m1m2cbox[0]+x, m1m2cbox[1]+x, m1m2cbox[2],
2704 m1m2cbox[3], 0, 0, muxplane);
2705 ap1 = m1m2pins[i];
2706 apport1 = m1m2cport;
2707 p = Electric.newPortProto(muxplane, ap1, apport1, ("sel"+(selects-i-1)));
2708 createExport(p, INPORT);
2709 }
2710
2711 for (m=0; m<outputbits; m++) {
2712 y += 8*lambda;
2713 if (m%2 == 1) {
2714 y += 8*lambda;
2715 }
2716 if (i < selects) {
2717 if (muxarray[m][i] == 1) {
2718 // create a transistor
2719 ntrans[m+1][i] =
2720 Electric.newNodeInst(nmos, nmosbox[0]+x, nmosbox[1]+x,
2721 nmosbox[2]+y, nmosbox[3]+y,1,0,muxplane);
2722 } else {
2723 ntrans[m+1][i] =
2724 Electric.newNodeInst(ppin, ppinbox[0]+x, ppinbox[1]+x,
2725 ppinbox[2]+y,ppinbox[3]+y,0,0,muxplane);
2726 }
2727 }
2728 boolean transcont = false;
2729 if (i < selects) transcont = (muxarray[m][i] == 1);
2730 if (i == (selects)) {
2731 m1m2pins2[m] =
2732 Electric.newNodeInst(m1m2c, m1m2cbox[0]+x-4*lambda,
2733 m1m2cbox[1]+x-4*lambda, m1m2cbox[2]+y,
2734 m1m2cbox[3]+y, 0, 0, muxplane);
2735 m1m2ports2[m] = m1m2cport;
2736 }
2737 if (i >= 1) transcont |= (muxarray[m][i-1] == 1);
2738 if (transcont){
2739 minpins[m][i] =
2740 Electric.newNodeInst(mnac, mnacbox[0]+x-4*lambda,
2741 mnacbox[1]+x-4*lambda, mnacbox[2]+y,
2742 mnacbox[3]+y, 0, 0, muxplane);
2743 minports[m][i] = mnacport;
2744 } else {
2745 minpins[m][i] =
2746 Electric.newNodeInst(m1pin, m1pinbox[0]+x-4*lambda,
2747 m1pinbox[1]+x-4*lambda, m1pinbox[2]+y,
2748 m1pinbox[3]+y, 0, 0, muxplane);
2749 minports[m][i] = m1pinport;
2750 }
2751 }
2752 }
2753
2754 // finished placing objects, now wire arcs
2755
2756 // connect polysilicon gates
2757 for (i=0; i<selects; i++) {
2758 ap1 = ntrans[0][i];
2759 apport1 = ppinport;
2760 appos1 = Electric.portPosition(ap1, apport1);
2761 ap2 = m1polypins[i];
2762 apport2 = mpcport;
2763 appos2 = Electric.portPosition(ap2, apport2);
2764 ap3 = m1m2pins[i];
2765 apport3 = m1m2cport;
2766 appos3 = Electric.portPosition(ap3, apport3);
2767 Electric.newArcInst(parc, 2*lambda, 0, ap1, apport1, appos1[0].intValue(),
2768 appos1[1].intValue(),ap2, apport2, appos2[0].intValue(),
2769 appos2[1].intValue(),muxplane);
2770 Electric.newArcInst(m1arc, 4*lambda, 0, ap2, apport2, appos2[0].intValue(),
2771 appos2[1].intValue(),ap3, apport3, appos3[0].intValue(),
2772 appos3[1].intValue(),muxplane);
2773 }
2774
2775 // connect polysilicon gates
2776 for (i=0; i<selects; i++)
2777 {
2778 ap1 = ntrans[0][i];
2779 apport1 = ppinport;
2780 appos1 = Electric.portPosition(ap1, apport1);
2781 for (m=1; m<outputbits+1; m++) {
2782 ap2 = ntrans[m][i];
2783 if (muxarray[m-1][i] == 1) {
2784 apport2 = nmosg1port;
2785 apport3 = nmosg2port;
2786 } else {
2787 apport2 = ppinport;
2788 apport3 = ppinport;
2789 }
2790 appos2 = Electric.portPosition(ap2, apport2);
2791 appos3 = Electric.portPosition(ap2, apport3);
2792 Electric.newArcInst(parc, 2*lambda, 0, ap1, apport1, appos1[0].intValue(),
2793 appos1[1].intValue(), ap2, apport2,
2794 appos2[0].intValue(), appos2[1].intValue(),muxplane);
2795 ap1 = ap2;
2796 apport1 = apport3;
2797 appos1 = appos3;
2798 }
2799 }
2800
2801 // connect m1 wordline lines
2802 for (m=0; m<outputbits; m++) {
2803 ap1 = minpins[m][0];
2804 apport1 = minports[m][0];
2805 appos1 = Electric.portPosition(ap1, apport1);
2806 for (i=1; i<selects+1; i++) {
2807 ap2 = minpins[m][i];
2808 apport2 = minports[m][i];
2809 appos2 = Electric.portPosition(ap2, apport2);
2810 if (muxarray[m][i-1] != 1) {
2811 Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1,
2812 appos1[0].intValue(), appos1[1].intValue(),
2813 ap2, apport2, appos2[0].intValue(),
2814 appos2[1].intValue(),muxplane);
2815 }
2816 if (i == 1) {
2817 p = Electric.newPortProto(muxplane, ap1, apport1, ("muxin"+m));
2818 createExport(p, INPORT);
2819 }
2820 ap1 = ap2;
2821 apport1 = apport2;
2822 appos1 = appos2;
2823 }
2824 }
2825
2826
2827 // connect transistors to wordline lines
2828 for (m=0; m<outputbits; m++) {
2829 for (i=0; i<selects; i++) {
2830 if (muxarray[m][i] == 1) {
2831 // connect transistor
2832 ap1 = ntrans[m+1][i];
2833 apport1 = nmosd1port;
2834 apport2 = nmosd2port;
2835 appos1 = Electric.portPosition(ap1, apport1);
2836 appos2 = Electric.portPosition(ap1, apport2);
2837 apx = minpins[m][i];
2838 apy = minpins[m][i+1];
2839 apportx = mnacport;
2840 apporty = mnacport;
2841 apposx = Electric.portPosition(apx, apportx);
2842 apposy = Electric.portPosition(apy, apporty);
2843 Electric.newArcInst(ndiffarc, 16*lambda, 0, ap1, apport1,
2844 appos1[0].intValue(), appos1[1].intValue(),
2845 apx, apportx, apposx[0].intValue(),
2846 apposx[1].intValue(),muxplane);
2847 Electric.newArcInst(ndiffarc, 16*lambda, 0, ap1, apport2,
2848 appos2[0].intValue(), appos2[1].intValue(),
2849 apy, apporty, apposy[0].intValue(),
2850 apposy[1].intValue(),muxplane);
2851 }
2852 }
2853 }
2854
2855 for(int j = 0 ; j < outputbits; j++) {
2856 i = selects;
2857 ap1 = minpins[j][i];
2858 apport1 = minports[j][i];
2859 appos1 = Electric.portPosition(ap1, apport1);
2860 ap2 = m1m2pins2[j];
2861 apport2 = m1m2ports2[j];
2862 appos2 = Electric.portPosition(ap2, apport2);
2863 Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
2864 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
2865 appos2[1].intValue(),muxplane);
2866 }
2867
2868 // connect mux together
2869 for(int j = 0 ; j < outputbits/muxnumber; j++) {
2870 ap1 = m1m2pins2[j*muxnumber];
2871 apport1 = m1m2ports2[j*muxnumber];
2872 appos1 = Electric.portPosition(ap1, apport1);
2873 for (m=1+j*muxnumber; m<muxnumber+j*muxnumber; m++) {
2874 ap2 = m1m2pins2[m];
2875 apport2 = m1m2ports2[m];
2876 appos2 = Electric.portPosition(ap2, apport2);
2877 Electric.newArcInst(m2arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
2878 appos1[1].intValue(),ap2, apport2,
2879 appos2[0].intValue(), appos2[1].intValue(),muxplane);
2880 }
2881 p = Electric.newPortProto(muxplane, ap1, apport1, "muxout"+j);
2882 createExport(p, OUTPORT);
2883 }
2884
2885 }
2886
2887 ////////////////////inverterplane
inverterplane(int lambda, int outs, int folds, String ip)2888 public static void inverterplane(int lambda, int outs, int folds, String ip) {
2889
2890 int i, m, o;
2891 int x, y;
2892 Electric.NodeInst ap1, ap2, ap3, gnd1, gnd2, vdd1, vdd2;
2893 Electric.PortProto p, apport1, apport2, apport3, trans1port, trans2port,
2894 gndport1, gndport2, vddport1, vddport2;
2895 Integer[] appos1, appos2, appos3, trans1pos, trans2pos, gndpos1, gndpos2,
2896 vddpos1, vddpos2;
2897
2898 Electric.NodeInst[] ntrans = new Electric.NodeInst[outs/folds];
2899 Electric.NodeInst[] ptrans = new Electric.NodeInst[outs/folds];
2900 Electric.NodeInst[] inpins = new Electric.NodeInst[outs/folds];
2901 Electric.NodeInst[] polypins = new Electric.NodeInst[outs/folds];
2902 Electric.NodeInst[] intppins = new Electric.NodeInst[outs/folds];
2903 Electric.NodeInst[] nmospins = new Electric.NodeInst[outs/folds];
2904 Electric.NodeInst[] pmospins = new Electric.NodeInst[outs/folds];
2905 Electric.NodeInst[] gndpins = new Electric.NodeInst[outs/2];
2906 Electric.NodeInst[] pwellpins = new Electric.NodeInst[outs/2];
2907 Electric.NodeInst[] vddpins = new Electric.NodeInst[outs/2];
2908 Electric.NodeInst[] midvddpins = new Electric.NodeInst[outs/2];
2909 Electric.NodeInst[] gndpins2 = new Electric.NodeInst[outs/folds];
2910 Electric.NodeInst[] pwellpins2 = new Electric.NodeInst[outs/folds];
2911 Electric.NodeInst[] vddpins2 = new Electric.NodeInst[outs/folds];
2912 Electric.NodeInst[] midvddpins2 = new Electric.NodeInst[outs/folds];
2913 Electric.NodeInst gndc = new Electric.NodeInst();
2914 Electric.NodeInst nwellc = new Electric.NodeInst();
2915 Electric.NodeInst nwellm = new Electric.NodeInst();
2916
2917 Electric.PortProto[] ntransports = new Electric.PortProto[outs/folds];
2918 Electric.PortProto[] ptransports = new Electric.PortProto[outs/folds];
2919 Electric.PortProto[] inports = new Electric.PortProto[outs/folds];
2920 Electric.PortProto[] polyports = new Electric.PortProto[outs/folds];
2921 Electric.PortProto[] intpports = new Electric.PortProto[outs/folds];
2922 Electric.PortProto[] nmosports = new Electric.PortProto[outs/folds];
2923 Electric.PortProto[] pmosports = new Electric.PortProto[outs/folds];
2924 Electric.PortProto[] pwellports = new Electric.PortProto[outs/2];
2925 Electric.PortProto[] gndports = new Electric.PortProto[outs/2];
2926 Electric.PortProto[] vddports = new Electric.PortProto[outs/2];
2927 Electric.PortProto[] midvddports = new Electric.PortProto[outs/2];
2928 Electric.PortProto[] pwellports2 = new Electric.PortProto[outs/folds];
2929 Electric.PortProto[] gndports2 = new Electric.PortProto[outs/folds];
2930 Electric.PortProto[] vddports2 = new Electric.PortProto[outs/folds];
2931 Electric.PortProto[] midvddports2 = new Electric.PortProto[outs/folds];
2932 Electric.PortProto gndcport = new Electric.PortProto();
2933 Electric.PortProto nwellcport = new Electric.PortProto();
2934 Electric.PortProto nwellmport = new Electric.PortProto();
2935
2936
2937 /* get pointers to primitives */
2938 Electric.NodeProto nmos = Electric.getNodeProto("N-Transistor");
2939 Electric.PortProto nmosg1port = Electric.getPortProto(nmos, "n-trans-poly-right");
2940 Electric.PortProto nmosg2port = Electric.getPortProto(nmos, "n-trans-poly-left");
2941 Electric.PortProto nmosd1port = Electric.getPortProto(nmos, "n-trans-diff-top");
2942 Electric.PortProto nmosd2port = Electric.getPortProto(nmos, "n-trans-diff-bottom");
2943 int[] nmosbox = {((Integer)Electric.getVal(nmos, "lowx")).intValue()-lambda/2,
2944 ((Integer)Electric.getVal(nmos, "highx")).intValue()+lambda/2,
2945 ((Integer)Electric.getVal(nmos, "lowy")).intValue(),
2946 ((Integer)Electric.getVal(nmos, "highy")).intValue()};
2947
2948 Electric.NodeProto pmos = Electric.getNodeProto("P-Transistor");
2949 Electric.PortProto pmosg1port = Electric.getPortProto(pmos, "p-trans-poly-right");
2950 Electric.PortProto pmosg2port = Electric.getPortProto(pmos, "p-trans-poly-left");
2951 Electric.PortProto pmosd1port = Electric.getPortProto(pmos, "p-trans-diff-top");
2952 Electric.PortProto pmosd2port = Electric.getPortProto(pmos, "p-trans-diff-bottom");
2953 int[] pmosbox = {((Integer)Electric.getVal(pmos, "lowx")).intValue()-lambda/2,
2954 ((Integer)Electric.getVal(pmos, "highx")).intValue()+lambda/2,
2955 ((Integer)Electric.getVal(pmos, "lowy")).intValue(),
2956 ((Integer)Electric.getVal(pmos, "highy")).intValue()};
2957
2958 Electric.NodeProto ppin = Electric.getNodeProto("Polysilicon-1-Pin");
2959 Electric.PortProto ppinport =
2960 (Electric.PortProto)Electric.getVal(ppin, "firstPortProto");
2961 int[] ppinbox = {((Integer)Electric.getVal(ppin, "lowx")).intValue(),
2962 ((Integer)Electric.getVal(ppin, "highx")).intValue(),
2963 ((Integer)Electric.getVal(ppin, "lowy")).intValue(),
2964 ((Integer)Electric.getVal(ppin, "highy")).intValue()};
2965
2966 Electric.NodeProto napin = Electric.getNodeProto("N-Active-Pin");
2967
2968 Electric.NodeProto m1pin = Electric.getNodeProto("Metal-1-Pin");
2969 Electric.PortProto m1pinport =
2970 (Electric.PortProto)Electric.getVal(m1pin, "firstPortProto");
2971 int[] m1pinbox = {((Integer)Electric.getVal(m1pin, "lowx")).intValue()-lambda/2,
2972 ((Integer)Electric.getVal(m1pin, "highx")).intValue()+lambda/2,
2973 ((Integer)Electric.getVal(m1pin, "lowy")).intValue()-lambda/2,
2974 ((Integer)Electric.getVal(m1pin, "highy")).intValue()+lambda/2};
2975
2976 Electric.NodeProto m2pin = Electric.getNodeProto("Metal-2-Pin");
2977 Electric.PortProto m2pinport =
2978 (Electric.PortProto)Electric.getVal(m2pin, "firstPortProto");
2979 int[] m2pinbox = {((Integer)Electric.getVal(m1pin, "lowx")).intValue()-lambda/2,
2980 ((Integer)Electric.getVal(m1pin, "highx")).intValue()+lambda/2,
2981 ((Integer)Electric.getVal(m1pin, "lowy")).intValue()-lambda/2,
2982 ((Integer)Electric.getVal(m1pin, "highy")).intValue()+lambda/2};
2983
2984 Electric.NodeProto nwnode = Electric.getNodeProto("N-Well-Node");
2985 int[] nwnodebox =
2986 {((Integer)Electric.getVal(nwnode, "lowx")).intValue()-lambda/2,
2987 ((Integer)Electric.getVal(nwnode, "highx")).intValue()+lambda/2,
2988 ((Integer)Electric.getVal(nwnode, "lowy")).intValue()-lambda/2,
2989 ((Integer)Electric.getVal(nwnode, "highy")).intValue()+lambda/2};
2990
2991 Electric.NodeProto pwnode = Electric.getNodeProto("P-Well-Node");
2992 int[] pwnodebox =
2993 {((Integer)Electric.getVal(pwnode, "lowx")).intValue()-lambda/2,
2994 ((Integer)Electric.getVal(pwnode, "highx")).intValue()+lambda/2,
2995 ((Integer)Electric.getVal(pwnode, "lowy")).intValue()-lambda/2,
2996 ((Integer)Electric.getVal(pwnode, "highy")).intValue()+lambda/2};
2997
2998 Electric.NodeProto m1m2c = Electric.getNodeProto("Metal-1-Metal-2-Con");
2999 Electric.PortProto m1m2cport =
3000 (Electric.PortProto)Electric.getVal(m1m2c, "firstPortProto");
3001 int[] m1m2cbox = {-5*lambda/2, 5*lambda/2, -5*lambda/2, 5*lambda/2};
3002
3003 Electric.NodeProto diffpin = Electric.getNodeProto("Active-Pin");
3004 Electric.PortProto diffpinport =
3005 (Electric.PortProto)Electric.getVal(diffpin, "firstPortProto");
3006 int[] diffpinbox =
3007 {((Integer)Electric.getVal(diffpin, "lowx")).intValue()-lambda/2,
3008 ((Integer)Electric.getVal(diffpin, "highx")).intValue()+lambda/2,
3009 ((Integer)Electric.getVal(diffpin, "lowy")).intValue()-lambda/2,
3010 ((Integer)Electric.getVal(diffpin, "highy")).intValue()+lambda/2};
3011
3012 Electric.NodeProto mnac = Electric.getNodeProto("Metal-1-N-Active-Con");
3013 Electric.PortProto mnacport =
3014 (Electric.PortProto)Electric.getVal(mnac, "firstPortProto");
3015 int aaa = 17;
3016 int[] mnacbox = {-aaa*lambda/2, aaa*lambda/2, -aaa*lambda/2, aaa*lambda/2};
3017
3018 Electric.NodeProto mpac = Electric.getNodeProto("Metal-1-P-Active-Con");
3019 Electric.PortProto mpacport =
3020 (Electric.PortProto)Electric.getVal(mpac, "firstPortProto");
3021 int[] mpacbox = {-aaa*lambda/2, aaa*lambda/2, -aaa*lambda/2, aaa*lambda/2}; //
3022
3023 Electric.NodeProto mpc = Electric.getNodeProto("Metal-1-Polysilicon-1-Con");
3024 Electric.PortProto mpcport =
3025 (Electric.PortProto)Electric.getVal(mpc, "firstPortProto");
3026 int mx = -7;
3027 int my = 5;
3028 int[] mpcbox = {-mx*lambda/2, mx*lambda/2, -my*lambda/2, my*lambda/2};
3029
3030 Electric.NodeProto mpwc = Electric.getNodeProto("Metal-1-P-Well-Con");
3031 Electric.PortProto mpwcport =
3032 (Electric.PortProto)Electric.getVal(mpwc, "firstPortProto");
3033 int[] mpwcbox = {-17*lambda/2, 17*lambda/2, -17*lambda/2, 17*lambda/2};
3034
3035 Electric.NodeProto mnwc = Electric.getNodeProto("Metal-1-N-Well-Con");
3036 Electric.PortProto mnwcport =
3037 (Electric.PortProto)Electric.getVal(mnwc, "firstPortProto");
3038 int[] mnwcbox = {-17*lambda/2, 17*lambda/2, -17*lambda/2, 17*lambda/2};
3039
3040 Electric.ArcProto parc = Electric.getArcProto("Polysilicon-1");
3041 Electric.ArcProto m1arc = Electric.getArcProto("Metal-1");
3042 Electric.ArcProto m2arc = Electric.getArcProto("Metal-2");
3043 Electric.ArcProto ndiffarc = Electric.getArcProto("N-Active");
3044 Electric.ArcProto pdiffarc = Electric.getArcProto("P-Active");
3045
3046 /* create a cell called "inverterplane{lay}" in the current library */
3047 Electric.NodeProto invp =
3048 Electric.newNodeProto(ip+"{lay}", Electric.curLib());
3049
3050 Electric.NodeInst pwellnode =
3051 Electric.newNodeInst(pwnode,-32*lambda,(3*lambda*8*outs/2)+8*lambda,
3052 -18*lambda,16*lambda,0,0,invp);
3053
3054 Electric.NodeInst nwellnode =
3055 Electric.newNodeInst(nwnode,-32*lambda,(3*lambda*8*outs/2)+8*lambda,
3056 -34*lambda,-18*lambda,0,0,invp);
3057
3058 // Create instances of objects on inverter plane
3059 x = 0*lambda;
3060 for (i=0; i<outs; i++) {
3061 x += 8*lambda;
3062 y = 0;
3063 if (folds > 1 ) {
3064 if ( i % folds == 1) {
3065 pwellpins2[i/folds] =
3066 Electric.newNodeInst(mpwc, mpwcbox[0]+x, mpwcbox[1]+x,
3067 mpwcbox[2]+y, mpwcbox[3]+y, 0, 0, invp);
3068 pwellports2[i/folds] = mpwcport;
3069 gndpins2[i/folds] =
3070 Electric.newNodeInst(mnac, mnacbox[0]+x, mnacbox[1]+x,
3071 mnacbox[2]+y-10*lambda,
3072 mnacbox[3]+y-10*lambda, 0, 0, invp);
3073 gndports2[i/folds] = mnacport;
3074 midvddpins2[i/folds] =
3075 Electric.newNodeInst(mpac, mpacbox[0]+x, mpacbox[1]+x,
3076 mpacbox[2]+y-26*lambda,
3077 mpacbox[3]+y-26*lambda, 0, 0, invp);
3078 midvddports2[i/folds] = mpacport;
3079 vddpins2[i/folds] =
3080 Electric.newNodeInst(m1m2c, m1m2cbox[0]+x, m1m2cbox[1]+x,
3081 m1m2cbox[2]+y-26*lambda,
3082 m1m2cbox[3]+y-26*lambda, 0, 0, invp);
3083 vddports2[i/folds] = m1m2cport;
3084 if (i == 1) {
3085 gndc =
3086 Electric.newNodeInst(m1m2c, m1m2cbox[0]+x, m1m2cbox[1]+x,
3087 m1m2cbox[2]+y-10*lambda,
3088 m1m2cbox[3]+y-10*lambda, 0, 0, invp);
3089 gndcport = m1m2cport;
3090 p = Electric.newPortProto(invp, gndc, gndcport, ("gnd"));
3091 createExport(p, GNDPORT);
3092 }
3093 }
3094 } else {
3095 if ( i%2 == 1){
3096 //place gnd, intvdd, vddpins
3097 // pwellpins[i/2] =
3098 // Electric.newNodeInst(mpwc, mpwcbox[0]+x, mpwcbox[1]+x,
3099 // mpwcbox[2]+y-10*lambda,
3100 // mpwcbox[3]+y-10*lambda, 0, 0, invp);
3101 // pwellports[i/2] = mpwcport;
3102 gndpins[i/2] =
3103 Electric.newNodeInst(mnac, mnacbox[0]+x, mnacbox[1]+x,
3104 mnacbox[2]+y-10*lambda,
3105 mnacbox[3]+y-10*lambda, 0, 0, invp);
3106 gndports[i/2] = mnacport;
3107 midvddpins[i/2] =
3108 Electric.newNodeInst(mpac, mpacbox[0]+x, mpacbox[1]+x,
3109 mpacbox[2]+y-26*lambda,
3110 mpacbox[3]+y-26*lambda, 0, 0, invp);
3111 midvddports[i/2] = mpacport;
3112 vddpins[i/2] =
3113 Electric.newNodeInst(m1m2c, m1m2cbox[0]+x, m1m2cbox[1]+x,
3114 m1m2cbox[2]+y-26*lambda,
3115 m1m2cbox[3]+y-26*lambda, 0, 0, invp);
3116 vddports[i/2] = m1m2cport;
3117
3118 if (i == 1) {
3119 nwellc =
3120 Electric.newNodeInst(mnwc, mnwcbox[0]+x-24*lambda,
3121 mnwcbox[1]+x-24*lambda,
3122 mnwcbox[2]+y-26*lambda,
3123 mnwcbox[3]+y-26*lambda, 0, 0, invp);
3124 nwellcport = mnwcport;
3125
3126 nwellm =
3127 Electric.newNodeInst(m1m2c, m1m2cbox[0]+x-24*lambda,
3128 m1m2cbox[1]+x-24*lambda,
3129 m1m2cbox[2]+y-26*lambda,
3130 m1m2cbox[3]+y-26*lambda, 0, 0, invp);
3131 nwellmport = m1m2cport;
3132
3133 gndc =
3134 Electric.newNodeInst(m1m2c, m1m2cbox[0]+x, m1m2cbox[1]+x,
3135 m1m2cbox[2]+y-10*lambda,
3136 m1m2cbox[3]+y-10*lambda, 0, 0, invp);
3137 gndcport = m1m2cport;
3138 p = Electric.newPortProto(invp, gndc, gndcport, ("gnd"));
3139 createExport(p, GNDPORT);
3140 }
3141 }
3142 }
3143 if (i%2 == 1) {
3144 x += 8*lambda;
3145 }
3146 if (folds > 1) {
3147 if (i%folds == 0) {
3148 inpins[i/folds] =
3149 Electric.newNodeInst(mpc, mpcbox[0]+x-6*lambda,
3150 mpacbox[1]+x-6*lambda, mpcbox[2]+y,
3151 mpcbox[3]+y, 0, 0, invp);
3152 inports[i/folds] = mpcport;
3153 polypins[i/folds] =
3154 Electric.newNodeInst(ppin, ppinbox[0]+x, ppinbox[1]+x,
3155 ppinbox[2]+y-6*lambda, ppinbox[3]+y-6*lambda,
3156 0, 0, invp);
3157 polyports[i/folds] = ppinport;
3158 nmospins[i/folds] =
3159 Electric.newNodeInst(mnac, mnacbox[0]+x, mnacbox[1]+x,
3160 mnacbox[2]+y-10*lambda, mnacbox[3]+y-10*lambda,
3161 0, 0, invp);
3162 nmosports[i/folds] = mnacport;
3163 pmospins[i/folds] =
3164 Electric.newNodeInst(mpac, mpacbox[0]+x, mpacbox[1]+x,
3165 mpacbox[2]+y-26*lambda, mpacbox[3]+y-26*lambda,
3166 0, 0, invp);
3167 pmosports[i/folds] = mpacport;
3168 }
3169 } else {
3170 //place inpins, polypins, nmospins, pmospins
3171 inpins[i] =
3172 Electric.newNodeInst(mpc, mpcbox[0]+x-6*lambda, mpacbox[1]+x-6*lambda,
3173 mpcbox[2]+y, mpcbox[3]+y, 0, 0, invp);
3174 inports[i] = mpcport;
3175 polypins[i] =
3176 Electric.newNodeInst(ppin, ppinbox[0]+x, ppinbox[1]+x,
3177 ppinbox[2]+y-6*lambda, ppinbox[3]+y-6*lambda,
3178 0, 0, invp);
3179 polyports[i] = ppinport;
3180 nmospins[i] =
3181 Electric.newNodeInst(mnac, mnacbox[0]+x, mnacbox[1]+x,
3182 mnacbox[2]+y-10*lambda, mnacbox[3]+y-10*lambda,
3183 0, 0, invp);
3184 nmosports[i] = mnacport;
3185 pmospins[i] =
3186 Electric.newNodeInst(mpac, mpacbox[0]+x, mpacbox[1]+x,
3187 mpacbox[2]+y-26*lambda, mpacbox[3]+y-26*lambda,
3188 0, 0, invp);
3189 pmosports[i] = mpacport;
3190 }
3191
3192 if (folds > 1) {
3193 if ( i%folds == 0) {
3194 int off = 4*lambda;
3195 ptrans[i/folds] =
3196 Electric.newNodeInst(pmos, pmosbox[0]+x+off, pmosbox[1]+x+off,
3197 pmosbox[2]+y-26*lambda,
3198 pmosbox[3]+y-26*lambda, 1, 0, invp);
3199 ntrans[i/folds] =
3200 Electric.newNodeInst(nmos, nmosbox[0]+x+off, nmosbox[1]+x+off,
3201 nmosbox[2]+y-10*lambda,
3202 nmosbox[3]+y-10*lambda, 1, 0, invp);
3203 intppins[i/folds] =
3204 Electric.newNodeInst(ppin, ppinbox[0]+x+off, ppinbox[1]+x+off,
3205 ppinbox[2]+y-6*lambda, ppinbox[3]+y-6*lambda,
3206 0, 0, invp);
3207 intpports[i/folds] = ppinport;
3208 }
3209 } else {
3210 int off = 0;
3211 if (i%2 == 0) {
3212 off = 4*lambda;
3213 }else {
3214 off = -4*lambda;
3215 }
3216 ptrans[i] =
3217 Electric.newNodeInst(pmos, pmosbox[0]+x+off, pmosbox[1]+x+off,
3218 pmosbox[2]+y-26*lambda, pmosbox[3]+y-26*lambda,
3219 1, 0, invp);
3220 ntrans[i] =
3221 Electric.newNodeInst(nmos, nmosbox[0]+x+off, nmosbox[1]+x+off,
3222 nmosbox[2]+y-10*lambda, nmosbox[3]+y-10*lambda,
3223 1, 0, invp);
3224 intppins[i] =
3225 Electric.newNodeInst(ppin, ppinbox[0]+x+off, ppinbox[1]+x+off,
3226 ppinbox[2]+y-6*lambda, ppinbox[3]+y-6*lambda,
3227 0, 0, invp);
3228 intpports[i] = ppinport;
3229 }
3230 }
3231
3232 // connect transistors to diffusion lines
3233 if ( folds > 1) {
3234 for (i=0; i<outs/folds; i++) {
3235 ap2 = nmospins[i];
3236 ap3 = gndpins2[i];
3237 ap1 = ntrans[i];
3238 apport1 = nmosd1port;
3239 gndport1 = nmosd2port;
3240 appos1 = Electric.portPosition(ap1, apport1);
3241 gndpos1 = Electric.portPosition(ap1, gndport1);
3242 apport2 = mnacport;
3243 appos2 = Electric.portPosition(ap2, apport2);
3244 apport3 = mnacport;
3245 appos3 = Electric.portPosition(ap3, apport3);
3246 //ndiffarc size centers around 12 and goes up by multiples of 2
3247 Electric.newArcInst(ndiffarc, 16*lambda, 0, ap1, apport1,
3248 appos1[0].intValue(), appos1[1].intValue(),
3249 ap2, apport2, appos2[0].intValue(),
3250 appos2[1].intValue(),invp);
3251 Electric.newArcInst(ndiffarc, 16*lambda, 0, ap1, gndport1,
3252 gndpos1[0].intValue(), gndpos1[1].intValue(),
3253 ap3, apport3, appos3[0].intValue(),
3254 appos3[1].intValue(),invp);
3255 }
3256 }else {
3257 for (i=0; i<outs; i++) {
3258 if (i%2 == 0) {
3259 ap2 = nmospins[i];
3260 ap3 = gndpins[i/2];
3261 } else {
3262 ap2 = gndpins[i/2];
3263 ap3 = nmospins[i];
3264 }
3265 ap1 = ntrans[i];
3266 apport1 = nmosd1port;
3267 gndport1 = nmosd2port;
3268 appos1 = Electric.portPosition(ap1, apport1);
3269 gndpos1 = Electric.portPosition(ap1, gndport1);
3270 apport2 = mnacport;
3271 appos2 = Electric.portPosition(ap2, apport2);
3272 apport3 = mnacport;
3273 appos3 = Electric.portPosition(ap3, apport3);
3274 Electric.newArcInst(ndiffarc, 16*lambda, 0, ap1, apport1,
3275 appos1[0].intValue(), appos1[1].intValue(),
3276 ap2, apport2, appos2[0].intValue(),
3277 appos2[1].intValue(),invp);
3278 Electric.newArcInst(ndiffarc, 16*lambda, 0, ap1, gndport1,
3279 gndpos1[0].intValue(), gndpos1[1].intValue(),
3280 ap3, apport3, appos3[0].intValue(),
3281 appos3[1].intValue(),invp);
3282 }
3283 }
3284
3285 if (folds >1) {
3286 for (i=0; i<outs/folds; i++) {
3287 ap2 = pmospins[i];
3288 ap3 = midvddpins2[i];
3289 ap1 = ptrans[i];
3290 ap1 = ptrans[i];
3291 apport1 = pmosd1port;
3292 vddport1 = pmosd2port;
3293 appos1 = Electric.portPosition(ap1, apport1);
3294 vddpos1 = Electric.portPosition(ap1, vddport1);
3295 apport2 = mpacport;
3296 appos2 = Electric.portPosition(ap2, apport2);
3297 apport3 = mpacport;
3298 appos3 = Electric.portPosition(ap3, apport3);
3299 Electric.newArcInst(pdiffarc, 16*lambda, 0, ap1, apport1,
3300 appos1[0].intValue(), appos1[1].intValue(),
3301 ap2, apport2, appos2[0].intValue(),
3302 appos2[1].intValue(),invp);
3303 Electric.newArcInst(pdiffarc, 16*lambda, 0, ap1, vddport1,
3304 vddpos1[0].intValue(), vddpos1[1].intValue(),
3305 ap3, apport3, appos3[0].intValue(),
3306 appos3[1].intValue(),invp);
3307 }
3308 }else {
3309 // connect transistors to diffusion lines
3310 for (i=0; i<outs; i++) {
3311 if (i%2 == 0) {
3312 ap2 = pmospins[i];
3313 ap3 = midvddpins[i/2];
3314 } else {
3315 ap2 = midvddpins[i/2];
3316 ap3 = pmospins[i];
3317 }
3318 ap1 = ptrans[i];
3319 apport1 = pmosd1port;
3320 vddport1 = pmosd2port;
3321 appos1 = Electric.portPosition(ap1, apport1);
3322 vddpos1 = Electric.portPosition(ap1, vddport1);
3323 apport2 = mpacport;
3324 appos2 = Electric.portPosition(ap2, apport2);
3325 apport3 = mpacport;
3326 appos3 = Electric.portPosition(ap3, apport3);
3327 Electric.newArcInst(pdiffarc, 16*lambda, 0, ap1, apport1,
3328 appos1[0].intValue(), appos1[1].intValue(),
3329 ap2, apport2, appos2[0].intValue(),
3330 appos2[1].intValue(),invp);
3331 Electric.newArcInst(pdiffarc, 16*lambda, 0, ap1, vddport1,
3332 vddpos1[0].intValue(), vddpos1[1].intValue(),
3333 ap3, apport3, appos3[0].intValue(),
3334 appos3[1].intValue(),invp);
3335 }
3336 }
3337
3338 // metal-1 mpac to mnac
3339 for (i=0; i<outs/folds; i++) {
3340 ap1 = nmospins[i];
3341 apport1 = nmosports[i];
3342 appos1 = Electric.portPosition(ap1, apport1);
3343 ap2 = pmospins[i];
3344 apport2 = pmosports[i];
3345 appos2 = Electric.portPosition(ap2, apport2);
3346 Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
3347 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
3348 appos2[1].intValue(),invp);
3349 }
3350
3351 // poly inpins to polypins
3352 for (i=0; i<outs/folds; i++) {
3353 ap1 = inpins[i];
3354 apport1 = inports[i];
3355 appos1 = Electric.portPosition(ap1, apport1);
3356 ap2 = polypins[i];
3357 apport2 = polyports[i];
3358 appos2 = Electric.portPosition(ap2, apport2);
3359 Electric.newArcInst(parc, 2*lambda, 0, ap1, apport1, appos1[0].intValue(),
3360 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
3361 appos2[1].intValue(),invp);
3362 }
3363
3364 // poly polypins to intppins
3365 for (i=0; i<outs/folds; i++) {
3366 ap1 = polypins[i];
3367 apport1 = polyports[i];
3368 appos1 = Electric.portPosition(ap1, apport1);
3369 ap2 = intppins[i];
3370 apport2 = intpports[i];
3371 appos2 = Electric.portPosition(ap2, apport2);
3372 Electric.newArcInst(parc, 2*lambda, 0, ap1, apport1, appos1[0].intValue(),
3373 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
3374 appos2[1].intValue(),invp);
3375 }
3376
3377 // poly intppins to ntrans
3378 for (i=0; i<outs/folds; i++) {
3379 ap1 = intppins[i];
3380 apport1 = intpports[i];
3381 appos1 = Electric.portPosition(ap1, apport1);
3382 ap2 = ntrans[i];
3383 apport2 = nmosg2port;
3384 appos2 = Electric.portPosition(ap2, apport2);
3385 Electric.newArcInst(parc, 2*lambda, 0, ap1, apport1, appos1[0].intValue(),
3386 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
3387 appos2[1].intValue(),invp);
3388 }
3389
3390 // poly ntrans to ptrans
3391 for (i=0; i<outs/folds; i++) {
3392 ap1 = ntrans[i];
3393 apport1 = nmosg1port;
3394 appos1 = Electric.portPosition(ap1, apport1);
3395 ap2 = ptrans[i];
3396 apport2 = pmosg2port;
3397 appos2 = Electric.portPosition(ap2, apport2);
3398 Electric.newArcInst(parc, 2*lambda, 0, ap1, apport1, appos1[0].intValue(),
3399 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
3400 appos2[1].intValue(),invp);
3401 }
3402
3403 if (folds > 1 ) {
3404 for (i=0; i < outs/folds; i++) {
3405 ap1 = pwellpins2[i];
3406 apport1 = pwellports2[i];
3407 appos1 = Electric.portPosition(ap1, apport1);
3408 ap2 = gndpins2[i];
3409 apport2 = gndports2[i];
3410 appos2 = Electric.portPosition(ap2, apport2);
3411 Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
3412 appos1[1].intValue(), ap2, apport2,
3413 appos2[0].intValue(), appos2[1].intValue(),invp);
3414 }
3415 for (i=0; i < outs/folds; i++) {
3416 ap1 = midvddpins2[i];
3417 apport1 = midvddports2[i];
3418 appos1 = Electric.portPosition(ap1, apport1);
3419 ap2 = vddpins2[i];
3420 apport2 = vddports2[i];
3421 appos2 = Electric.portPosition(ap2, apport2);
3422 Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
3423 appos1[1].intValue(), ap2, apport2,
3424
3425 appos2[0].intValue(), appos2[1].intValue(),invp);
3426 }
3427
3428 // metal 2 vddpins
3429 ap1 = vddpins2[0];
3430 apport1 = vddports2[0];
3431 appos1 = Electric.portPosition(ap1, apport1);
3432 for (i=1; i<outs/folds; i++) {
3433 ap2 = vddpins2[i];
3434 apport2 = vddports2[i];
3435 appos2 = Electric.portPosition(ap2, apport2);
3436 Electric.newArcInst(m2arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
3437 appos1[1].intValue(), ap2, apport2,
3438 appos2[0].intValue(), appos2[1].intValue(),invp);
3439 }
3440 p = Electric.newPortProto(invp, ap1, apport1, ("vdd"));
3441 createExport(p, PWRPORT);
3442
3443 for (i=0; i<outs/folds; i++) {
3444 ap1 = gndpins2[i];
3445 apport1 = gndports2[i];
3446 p = Electric.newPortProto(invp, ap1, apport1, ("invgnd" + i));
3447 createExport(p, GNDPORT);
3448 }
3449 ap1 = gndpins2[0];
3450 apport1 = gndports2[0];
3451 appos1 = Electric.portPosition(ap1, apport1);
3452
3453 } else {
3454 // for (i=0; i<outs/2; i++) {
3455 // ap1 = pwellpins[i];
3456 // apport1 = pwellports[i];
3457 // appos1 = Electric.portPosition(ap1, apport1);
3458 // ap2 = gndpins[i];
3459 // apport2 = gndports[i];
3460 // appos2 = Electric.portPosition(ap2, apport2);
3461 // Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
3462 // appos1[1].intValue(), ap2, apport2,
3463 // appos2[0].intValue(), appos2[1].intValue(),invp);
3464 // }
3465
3466 // metal 1 midvddpins to vddpins
3467 for (i=0; i<outs/2; i++) {
3468 ap1 = midvddpins[i];
3469 apport1 = midvddports[i];
3470 appos1 = Electric.portPosition(ap1, apport1);
3471 ap2 = vddpins[i];
3472 apport2 = vddports[i];
3473 appos2 = Electric.portPosition(ap2, apport2);
3474 Electric.newArcInst(m1arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
3475 appos1[1].intValue(), ap2, apport2,
3476 appos2[0].intValue(), appos2[1].intValue(),invp);
3477 }
3478
3479 ap1 = vddpins[0];
3480 apport1 = vddports[0];
3481 appos1 = Electric.portPosition(ap1, apport1);
3482 ap2 = nwellm;
3483 apport2 = nwellmport;
3484 appos2 = Electric.portPosition(ap2, apport2);
3485 ap3 = nwellc;
3486 apport3 = nwellcport;
3487 appos3 = Electric.portPosition(ap3, apport3);
3488 Electric.newArcInst(m2arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
3489 appos1[1].intValue(), ap2, apport2,
3490 appos2[0].intValue(), appos2[1].intValue(),invp);
3491 Electric.newArcInst(m1arc, 4*lambda, 0, ap3, apport3, appos3[0].intValue(),
3492 appos3[1].intValue(), ap2, apport2,
3493 appos2[0].intValue(), appos2[1].intValue(),invp);
3494
3495
3496
3497 // metal 2 vddpins
3498 ap1 = vddpins[0];
3499 apport1 = vddports[0];
3500 appos1 = Electric.portPosition(ap1, apport1);
3501 for (i=1; i<outs/2; i++) {
3502 ap2 = vddpins[i];
3503 apport2 = vddports[i];
3504 appos2 = Electric.portPosition(ap2, apport2);
3505 Electric.newArcInst(m2arc, 4*lambda, 0, ap1, apport1, appos1[0].intValue(),
3506 appos1[1].intValue(), ap2, apport2,
3507 appos2[0].intValue(), appos2[1].intValue(),invp);
3508 }
3509 p = Electric.newPortProto(invp, ap1, apport1, ("vdd"));
3510 createExport(p, PWRPORT);
3511
3512 for (i=0; i<outs/2; i++) {
3513 ap1 = gndpins[i];
3514 apport1 = gndports[i];
3515 p = Electric.newPortProto(invp, ap1, apport1, ("invgnd" + i));
3516 createExport(p, GNDPORT);
3517 }
3518
3519 ap1 = gndpins[0];
3520 apport1 = gndports[0];
3521 appos1 = Electric.portPosition(ap1, apport1);
3522 }
3523
3524 ap2 = gndc;
3525 apport2 = gndcport;
3526 appos2 = Electric.portPosition(ap2, apport2);
3527 Electric.newArcInst(m1arc,4*lambda,0,ap1,apport1,appos1[0].intValue(),
3528 appos1[1].intValue(), ap2, apport2, appos2[0].intValue(),
3529 appos2[1].intValue(),invp);
3530 for (i=0; i<outs/folds; i++) {
3531 ap1 = inpins[i];
3532 apport1 = inports[i];
3533 p = Electric.newPortProto(invp, ap1, apport1, ("invin" + i));
3534 createExport(p, INPORT);
3535 }
3536
3537 for (i=0; i<outs/folds; i++) {
3538 ap1 = pmospins[i];
3539 apport1 = pmosports[i];
3540 p = Electric.newPortProto(invp,ap1,apport1,("invout"+((outs/folds - 1) - i)));
3541 createExport(p, OUTPORT);
3542 }
3543
3544 }
3545 ////////////////////inverterplane end
3546
3547 ////////////////////ininverterplane
ininverterplane(int lambda, int outs, String layoutname, boolean top, int lengthbits)3548 public static void ininverterplane(int lambda, int outs, String layoutname, boolean top,
3549 int lengthbits) {
3550 int i, m, o;
3551 int x, y;
3552 Electric.NodeInst ap1, ap2, ap3, gnd1, gnd2, vdd1, vdd2;
3553 Electric.PortProto p, apport1, apport2, apport3, trans1port, trans2port,
3554 gndport1, gndport2, vddport1, vddport2;
3555 Integer[] appos1, appos2, appos3, trans1pos, trans2pos, gndpos1, gndpos2,
3556 vddpos1, vddpos2;
3557
3558 Electric.NodeInst[] ntrans = new Electric.NodeInst[outs];
3559 Electric.NodeInst[] ptrans = new Electric.NodeInst[outs];
3560 Electric.NodeInst[] inpins = new Electric.NodeInst[outs];
3561 Electric.NodeInst[] inpins2 = new Electric.NodeInst[outs];
3562 Electric.NodeInst[] outpins = new Electric.NodeInst[outs];
3563 Electric.NodeInst[] outpins2 = new Electric.NodeInst[outs];
3564 Electric.NodeInst[] polypins = new Electric.NodeInst[outs];
3565 Electric.NodeInst[] intppins = new Electric.NodeInst[outs];
3566 Electric.NodeInst[] polypins2 = new Electric.NodeInst[outs];
3567 Electric.NodeInst[] intppins2 = new Electric.NodeInst[outs];
3568 Electric.NodeInst[] gndpins = new Electric.NodeInst[outs];
3569 Electric.NodeInst[] midvddpins = new Electric.NodeInst[outs];
3570 Electric.NodeInst[] nmospins = new Electric.NodeInst[outs];
3571 Electric.NodeInst[] gndpins2 = new Electric.NodeInst[outs];
3572 Electric.NodeInst[] vddpins = new Electric.NodeInst[outs];
3573 Electric.NodeInst[] pmospins = new Electric.NodeInst[outs];
3574 Electric.NodeInst vddc = new Electric.NodeInst();
3575 Electric.NodeInst nwellc = new Electric.NodeInst();
3576 Electric.NodeInst gndc = new Electric.NodeInst();
3577 Electric.NodeInst pwellc = new Electric.NodeInst();
3578
3579 Electric.PortProto[] ntransports = new Electric.PortProto[outs];
3580 Electric.PortProto[] ptransports = new Electric.PortProto[outs];
3581 Electric.PortProto[] inports = new Electric.PortProto[outs];
3582 Electric.PortProto[] outports = new Electric.PortProto[outs];
3583 Electric.PortProto[] inports2 = new Electric.PortProto[outs];
3584 Electric.PortProto[] outports2 = new Electric.PortProto[outs];
3585 Electric.PortProto[] polyports = new Electric.PortProto[outs];
3586 Electric.PortProto[] intpports = new Electric.PortProto[outs];
3587 Electric.PortProto[] polyports2 = new Electric.PortProto[outs];
3588 Electric.PortProto[] intpports2 = new Electric.PortProto[outs];
3589 Electric.PortProto[] nmosports = new Electric.PortProto[outs];
3590 Electric.PortProto[] pmosports = new Electric.PortProto[outs];
3591 Electric.PortProto[] gndports = new Electric.PortProto[outs];
3592 Electric.PortProto[] gndports2 = new Electric.PortProto[outs];
3593 Electric.PortProto[] vddports = new Electric.PortProto[outs];
3594 Electric.PortProto[] midvddports = new Electric.PortProto[outs];
3595 Electric.PortProto vddcport = new Electric.PortProto();
3596 Electric.PortProto nwellport = new Electric.PortProto();
3597 Electric.PortProto gndcport = new Electric.PortProto();
3598 Electric.PortProto pwellport = new Electric.PortProto();
3599
3600
3601 /* get pointers to primitives */
3602 Electric.NodeProto nmos = Electric.getNodeProto("N-Transistor");
3603 Electric.PortProto nmosg1port = Electric.getPortProto(nmos, "n-trans-poly-right");
3604 Electric.PortProto nmosg2port = Electric.getPortProto(nmos, "n-trans-poly-left");
3605 Electric.PortProto nmosd1port = Electric.getPortProto(nmos, "n-trans-diff-top");
3606 Electric.PortProto nmosd2port = Electric.getPortProto(nmos, "n-trans-diff-bottom");
3607 int[] nmosbox = {((Integer)Electric.getVal(nmos, "lowx")).intValue()-lambda/2,
3608 ((Integer)Electric.getVal(nmos, "highx")).intValue()+lambda/2,
3609 ((Integer)Electric.getVal(nmos, "lowy")).intValue(),
3610 ((Integer)Electric.getVal(nmos, "highy")).intValue()};
3611
3612 Electric.NodeProto pmos = Electric.getNodeProto("P-Transistor");
3613 Electric.PortProto pmosg1port = Electric.getPortProto(pmos, "p-trans-poly-right");
3614 Electric.PortProto pmosg2port = Electric.getPortProto(pmos, "p-trans-poly-left");
3615 Electric.PortProto pmosd1port = Electric.getPortProto(pmos, "p-trans-diff-top");
3616 Electric.PortProto pmosd2port = Electric.getPortProto(pmos, "p-trans-diff-bottom");
3617 int[] pmosbox = {((Integer)Electric.getVal(pmos, "lowx")).intValue()-lambda/2,
3618 ((Integer)Electric.getVal(pmos, "highx")).intValue()+lambda/2,
3619 ((Integer)Electric.getVal(pmos, "lowy")).intValue(),
3620 ((Integer)Electric.getVal(pmos, "highy")).intValue()};
3621
3622 Electric.NodeProto ppin = Electric.getNodeProto("Polysilicon-1-Pin");
3623 Electric.PortProto ppinport =
3624 (Electric.PortProto)Electric.getVal(ppin, "firstPortProto");
3625 int[] ppinbox = {((Integer)Electric.getVal(ppin, "lowx")).intValue(),
3626 ((Integer)Electric.getVal(ppin, "highx")).intValue(),
3627 ((Integer)Electric.getVal(ppin, "lowy")).intValue(),
3628 ((Integer)Electric.getVal(ppin, "highy")).intValue()};
3629
3630 Electric.NodeProto napin = Electric.getNodeProto("N-Active-Pin");
3631
3632 Electric.NodeProto m1pin = Electric.getNodeProto("Metal-1-Pin");
3633 Electric.PortProto m1pinport =
3634 (Electric.PortProto)Electric.getVal(m1pin, "firstPortProto");
3635 int[] m1pinbox = {((Integer)Electric.getVal(m1pin, "lowx")).intValue()-lambda/2,
3636 ((Integer)Electric.getVal(m1pin, "highx")).intValue()+lambda/2,
3637 ((Integer)Electric.getVal(m1pin, "lowy")).intValue()-lambda/2,
3638 ((Integer)Electric.getVal(m1pin, "highy")).intValue()+lambda/2};
3639
3640 Electric.NodeProto m2pin = Electric.getNodeProto("Metal-2-Pin");
3641 Electric.PortProto m2pinport =
3642 (Electric.PortProto)Electric.getVal(m2pin, "firstPortProto");
3643 int[] m2pinbox = {((Integer)Electric.getVal(m1pin, "lowx")).intValue()-lambda/2,
3644 ((Integer)Electric.getVal(m1pin, "highx")).intValue()+lambda/2,
3645 ((Integer)Electric.getVal(m1pin, "lowy")).intValue()-lambda/2,
3646 ((Integer)Electric.getVal(m1pin, "highy")).intValue()+lambda/2};
3647
3648 Electric.NodeProto nwnode = Electric.getNodeProto("N-Well-Node");
3649 int[] nwnodebox =
3650 {((Integer)Electric.getVal(nwnode, "lowx")).intValue()-lambda/2,
3651 ((Integer)Electric.getVal(nwnode, "highx")).intValue()+lambda/2,
3652 ((Integer)Electric.getVal(nwnode, "lowy")).intValue()-lambda/2,
3653 ((Integer)Electric.getVal(nwnode, "highy")).intValue()+lambda/2};
3654
3655 Electric.NodeProto pwnode = Electric.getNodeProto("P-Well-Node");
3656 int[] pwnodebox =
3657 {((Integer)Electric.getVal(pwnode, "lowx")).intValue()-lambda/2,
3658 ((Integer)Electric.getVal(pwnode, "highx")).intValue()+lambda/2,
3659 ((Integer)Electric.getVal(pwnode, "lowy")).intValue()-lambda/2,
3660 ((Integer)Electric.getVal(pwnode, "highy")).intValue()+lambda/2};
3661
3662 Electric.NodeProto m1m2c = Electric.getNodeProto("Metal-1-Metal-2-Con");
3663 Electric.PortProto m1m2cport =
3664 (Electric.PortProto)Electric.getVal(m1m2c, "firstPortProto");
3665 int[] m1m2cbox = {-5*lambda/2, 5*lambda/2, -5*lambda/2, 5*lambda/2};
3666
3667 Electric.NodeProto diffpin = Electric.getNodeProto("Active-Pin");
3668 Electric.PortProto diffpinport =
3669 (Electric.PortProto)Electric.getVal(diffpin, "firstPortProto");
3670 int[] diffpinbox =
3671 {((Integer)Electric.getVal(diffpin, "lowx")).intValue()-lambda/2,
3672 ((Integer)Electric.getVal(diffpin, "highx")).intValue()+lambda/2,
3673 ((Integer)Electric.getVal(diffpin, "lowy")).intValue()-lambda/2,
3674 ((Integer)Electric.getVal(diffpin, "highy")).intValue()+lambda/2};
3675
3676 Electric.NodeProto mnac = Electric.getNodeProto("Metal-1-N-Active-Con");
3677 Electric.PortProto mnacport =
3678 (Electric.PortProto)Electric.getVal(mnac, "firstPortProto");
3679 int aaa = 17;
3680 int[] mnacbox = {-aaa*lambda/2, aaa*lambda/2, -aaa*lambda/2, aaa*lambda/2};
3681 //centers around 6 goes up by multiples of 2
3682
3683 Electric.NodeProto mpac = Electric.getNodeProto("Metal-1-P-Active-Con");
3684 Electric.PortProto mpacport =
3685 (Electric.PortProto)Electric.getVal(mpac, "firstPortProto");
3686 int[] mpacbox = {-aaa*lambda/2, aaa*lambda/2, -aaa*lambda/2, aaa*lambda/2};
3687 //centers around 6 goes up by multiples of 2
3688
3689
3690 int mx = -7;
3691 int my = 5;
3692 Electric.NodeProto mpc = Electric.getNodeProto("Metal-1-Polysilicon-1-Con");
3693 Electric.PortProto mpcport =
3694 (Electric.PortProto)Electric.getVal(mpc, "firstPortProto");
3695 int[] mpcbox = {-mx*lambda/2, mx*lambda/2, -my*lambda/2, my*lambda/2};
3696
3697 Electric.NodeProto mpwc = Electric.getNodeProto("Metal-1-P-Well-Con");
3698 Electric.PortProto mpwcport =
3699 (Electric.PortProto)Electric.getVal(mpwc, "firstPortProto");
3700 int[] mpwcbox = {-17*lambda/2, 17*lambda/2, -17*lambda/2, 17*lambda/2};
3701
3702 Electric.NodeProto mnwc = Electric.getNodeProto("Metal-1-N-Well-Con");
3703 Electric.PortProto mnwcport =
3704 (Electric.PortProto)Electric.getVal(mnwc, "firstPortProto");
3705 int[] mnwcbox = {-17*lambda/2, 17*lambda/2, -17*lambda/2, 17*lambda/2};
3706
3707 Electric.ArcProto parc = Electric.getArcProto("Polysilicon-1");
3708 Electric.ArcProto m1arc = Electric.getArcProto("Metal-1");
3709 Electric.ArcProto m2arc = Electric.getArcProto("Metal-2");
3710 Electric.ArcProto ndiffarc = Electric.getArcProto("N-Active");
3711 Electric.ArcProto pdiffarc = Electric.getArcProto("P-Active");
3712
3713 /* create a cell called layoutname+lay}" in the current library */
3714 Electric.NodeProto ininvp =
3715 Electric.newNodeProto(layoutname+"{lay}", Electric.curLib());
3716
3717 Electric.NodeInst pwellnode =
3718 Electric.newNodeInst(pwnode,-8*lambda,(4*lambda*8*lengthbits)+24*lambda,
3719 -18*lambda,10*lambda,0,0,ininvp);
3720 Electric.NodeInst nwellnode =
3721 Electric.newNodeInst(nwnode,-8*lambda,(4*lambda*8*lengthbits)+24*lambda,
3722 -36*lambda,-18*lambda,0,0,ininvp);
3723
3724
3725 // Create instances of objects on input inverter plane
3726 x = 0;
3727 for (i=0; i<outs; i++) {
3728 x += 8*lambda;
3729 y = 0;
3730 //place inpins, polypins, gndpins, midvddpins
3731 gndpins[i] =
3732 Electric.newNodeInst(mnac,mnacbox[0]+x,mnacbox[1]+x,mnacbox[2]+y-10*lambda,
3733 mnacbox[3]+y-10*lambda,0,0,ininvp);
3734 gndports[i] = mnacport;
3735 midvddpins[i] =
3736 Electric.newNodeInst(mpac,mpacbox[0]+x,mpacbox[1]+x,mpacbox[2]+y-26*lambda,
3737 mpacbox[3]+y-26*lambda,0,0,ininvp);
3738 midvddports[i] = mpacport;
3739
3740 int off = 4*lambda;
3741 ptrans[i] =
3742 Electric.newNodeInst(pmos,pmosbox[0]+x+off,pmosbox[1]+x+off,
3743 pmosbox[2]+y-26*lambda,pmosbox[3]+y-26*lambda,
3744 1,0,ininvp);
3745 ntrans[i] =
3746 Electric.newNodeInst(nmos,nmosbox[0]+x+off,nmosbox[1]+x+off,
3747 nmosbox[2]+y-10*lambda,nmosbox[3]+y-10*lambda,
3748 1,0,ininvp);
3749
3750 //place gnd, intvdd, vddpins
3751 x += 8*lambda;
3752 polypins[i] =
3753 Electric.newNodeInst(ppin,ppinbox[0]+x-8*lambda,ppinbox[1]+x-8*lambda,
3754 ppinbox[2]+y-6*lambda,ppinbox[3]+y-6*lambda,
3755 0,0,ininvp);
3756 polyports[i] = ppinport;
3757 inpins[i] =
3758 Electric.newNodeInst(mpc,mpcbox[0]+x-14*lambda,mpacbox[1]+x-14*lambda,
3759 mpcbox[2]+y,mpcbox[3]+y,0,0,ininvp);
3760 inports[i] = mpcport;
3761 if ( top == true ) {
3762 inpins2[i] =
3763 Electric.newNodeInst(m1m2c,m1m2cbox[0]+x-8*lambda,
3764 m1m2cbox[1]+x-8*lambda,
3765 m1m2cbox[2]+y+(8*lambda*(i+1)),
3766 m1m2cbox[3]+y+(8*lambda*(i+1)),0,0,ininvp);
3767 inports2[i] = m1m2cport;
3768 }
3769 intppins[i] =
3770 Electric.newNodeInst(ppin,ppinbox[0]+x-off,ppinbox[1]+x-off,
3771 ppinbox[2]+y-6*lambda,ppinbox[3]+y-6*lambda,
3772 0,0,ininvp);
3773 intpports[i] = ppinport;
3774 pmospins[i] =
3775 Electric.newNodeInst(mpac,mpacbox[0]+x,mpacbox[1]+x,mpacbox[2]+y-26*lambda,
3776 mpacbox[3]+y-26*lambda,0,0,ininvp);
3777 pmosports[i] = mpacport;
3778 vddpins[i] = Electric.newNodeInst(m1m2c,m1m2cbox[0]+x-8*lambda,
3779 m1m2cbox[1]+x-8*lambda,
3780 m1m2cbox[2]+y-26*lambda,
3781 m1m2cbox[3]+y-26*lambda,0,0,ininvp);
3782 vddports[i] = m1m2cport;
3783 nmospins[i] =
3784 Electric.newNodeInst(mnac,mnacbox[0]+x,mnacbox[1]+x,mnacbox[2]+y-10*lambda,
3785 mnacbox[3]+y-10*lambda,0,0,ininvp);
3786 nmosports[i] = mnacport;
3787 gndpins2[i] =
3788 Electric.newNodeInst(m1m2c,m1m2cbox[0]+x-8*lambda,m1m2cbox[1]+x-8*lambda,
3789 m1m2cbox[2]+y-10*lambda,m1m2cbox[3]+y-10*lambda,
3790 0,0,ininvp);
3791 gndports2[i] = m1m2cport;
3792 outpins[i] =
3793 Electric.newNodeInst(mpc,mpcbox[0]+x-14*lambda,mpacbox[1]+x-14*lambda,
3794 mpcbox[2]+y-36*lambda,mpcbox[3]+y-36*lambda,
3795 0,0,ininvp);
3796 outports[i] = mpcport;
3797 if ( top == false ) {
3798 outpins2[i] =
3799 Electric.newNodeInst(m1m2c,m1m2cbox[0]+x-8*lambda,
3800 m1m2cbox[1]+x-8*lambda,
3801 m1m2cbox[2]+y-(8*lambda*(i+1))-36*lambda,
3802 m1m2cbox[3]+y-(8*lambda*(i+1))-36*lambda,
3803 0,0,ininvp);
3804 outports2[i] = m1m2cport;
3805 }
3806 polypins2[i] =
3807 Electric.newNodeInst(ppin,ppinbox[0]+x-8*lambda,ppinbox[1]+x-8*lambda,
3808 ppinbox[2]+y-30*lambda,ppinbox[3]+y-30*lambda,
3809 0,0,ininvp);
3810 polyports2[i] = ppinport;
3811 intppins2[i] =
3812 Electric.newNodeInst(ppin,ppinbox[0]+x-off,ppinbox[1]+x-off,
3813 ppinbox[2]+y-30*lambda,ppinbox[3]+y-30*lambda,
3814 0,0,ininvp);
3815 intpports2[i] = ppinport;
3816
3817 if (i == (outs-1)) {
3818 if (top == true) {
3819 vddc =
3820 Electric.newNodeInst(m2pin,m2pinbox[0]+x+12*lambda,
3821 m2pinbox[1]+x+12*lambda,
3822 m2pinbox[2]+y-26*lambda,
3823 m2pinbox[3]+y-26*lambda,0,0,ininvp);
3824 vddcport = m2pinport;
3825 gndc =
3826 Electric.newNodeInst(m1m2c,m1m2cbox[0]+x+12*lambda,
3827 m1m2cbox[1]+x+12*lambda,
3828 m1m2cbox[2]+y-10*lambda,
3829 m1m2cbox[3]+y-10*lambda,0,0,ininvp);
3830 gndcport = m1m2cport;
3831 pwellc =
3832 Electric.newNodeInst(mpwc,mpwcbox[0]+x+12*lambda,
3833 mpwcbox[1]+x+12*lambda,mpwcbox[2]+y-10*lambda,
3834 mpwcbox[3]+y-10*lambda,0,0,ininvp);
3835 pwellport = mpwcport;
3836 }
3837 else {
3838 vddc =
3839 Electric.newNodeInst(m1m2c,m1m2cbox[0]+x+12*lambda,
3840 m1m2cbox[1]+x+12*lambda,
3841 m1m2cbox[2]+y-26*lambda,
3842 m1m2cbox[3]+y-26*lambda,0,0,ininvp);
3843 vddcport = m1m2cport;
3844 nwellc =
3845 Electric.newNodeInst(mnwc,mnwcbox[0]+x+12*lambda,
3846 mnwcbox[1]+x+12*lambda,mnwcbox[2]+y-26*lambda,
3847 mnwcbox[3]+y-26*lambda,0,0,ininvp);
3848 nwellport = mnwcport;
3849 gndc =
3850 Electric.newNodeInst(m2pin,m2pinbox[0]+x+12*lambda,
3851 m2pinbox[1]+x+12*lambda,
3852 m2pinbox[2]+y-10*lambda,
3853 m2pinbox[3]+y-10*lambda,0,0,ininvp);
3854 gndcport = m2pinport;
3855 }
3856 }
3857 }
3858
3859 // connect transistors to diffusion lines
3860 for (i=0; i<outs; i++) {
3861 ap2 = gndpins[i];
3862 ap3 = nmospins[i];
3863 ap1 = ntrans[i];
3864 apport1 = nmosd1port;
3865 gndport1 = nmosd2port;
3866 appos1 = Electric.portPosition(ap1, apport1);
3867 gndpos1 = Electric.portPosition(ap1, gndport1);
3868 apport2 = mnacport;
3869 appos2 = Electric.portPosition(ap2, apport2);
3870 apport3 = mnacport;
3871 appos3 = Electric.portPosition(ap3, apport3);
3872 // ndiffarc size centers around 12 and goes up by multiples of 2
3873 Electric.newArcInst(ndiffarc,16*lambda,0,ap1,apport1,appos1[0].intValue(),
3874 appos1[1].intValue(),ap2,apport2,appos2[0].intValue(),
3875 appos2[1].intValue(),ininvp);
3876 Electric.newArcInst(ndiffarc,16*lambda,0,ap1,gndport1,gndpos1[0].intValue(),
3877 gndpos1[1].intValue(),ap3,apport3,appos3[0].intValue(),
3878 appos3[1].intValue(),ininvp);
3879 }
3880
3881 // connect transistors to diffusion lines
3882 for (i=0; i<outs; i++) {
3883 ap2 = midvddpins[i];
3884 ap3 = pmospins[i];
3885 ap1 = ptrans[i];
3886 apport1 = pmosd1port;
3887 vddport1 = pmosd2port;
3888 appos1 = Electric.portPosition(ap1, apport1);
3889 vddpos1 = Electric.portPosition(ap1, vddport1);
3890 apport2 = mpacport;
3891 appos2 = Electric.portPosition(ap2, apport2);
3892 apport3 = mpacport;
3893 appos3 = Electric.portPosition(ap3, apport3);
3894 // pdiffarc size centers around 12 and goes up by multiples of 2
3895 Electric.newArcInst(pdiffarc,16*lambda,0,ap1,apport1,appos1[0].intValue(),
3896 appos1[1].intValue(),ap2,apport2,appos2[0].intValue(),
3897 appos2[1].intValue(),ininvp);
3898 Electric.newArcInst(pdiffarc,16*lambda,0,ap1,vddport1,vddpos1[0].intValue(),
3899 vddpos1[1].intValue(),ap3,apport3,appos3[0].intValue(),
3900 appos3[1].intValue(),ininvp);
3901 }
3902
3903 // metal-1 mpac to mnac
3904 for (i=0; i<outs; i++) {
3905 ap1 = nmospins[i];
3906 apport1 = nmosports[i];
3907 appos1 = Electric.portPosition(ap1, apport1);
3908 ap2 = pmospins[i];
3909 apport2 = pmosports[i];
3910 appos2 = Electric.portPosition(ap2, apport2);
3911 Electric.newArcInst(m1arc,4*lambda,0,ap1,apport1,appos1[0].intValue(),
3912 appos1[1].intValue(),ap2,apport2,appos2[0].intValue(),
3913 appos2[1].intValue(),ininvp);
3914 }
3915
3916 if (top == true) {
3917 ap1 = gndc;
3918 apport1 = gndcport;
3919 appos1 = Electric.portPosition(ap1, apport1);
3920 ap2 = pwellc;
3921 apport2 = pwellport;
3922 appos2 = Electric.portPosition(ap2, apport2);
3923 Electric.newArcInst(m1arc,4*lambda,0,ap1,apport1,appos1[0].intValue(),
3924 appos1[1].intValue(),ap2,apport2,appos2[0].intValue(),
3925 appos2[1].intValue(),ininvp);
3926 } else {
3927 ap1 = vddc;
3928 apport1 = vddcport;
3929 appos1 = Electric.portPosition(ap1, apport1);
3930 ap2 = nwellc;
3931 apport2 = nwellport;
3932 appos2 = Electric.portPosition(ap2, apport2);
3933 Electric.newArcInst(m1arc,4*lambda,0,ap1,apport1,appos1[0].intValue(),
3934 appos1[1].intValue(),ap2,apport2,appos2[0].intValue(),
3935 appos2[1].intValue(),ininvp);
3936 }
3937
3938 if (top == true) {
3939 for (i=0; i<outs; i++) {
3940 ap1 = inpins[i];
3941 apport1 = inports[i];
3942 appos1 = Electric.portPosition(ap1, apport1);
3943 ap2 = inpins2[i];
3944 apport2 = inports2[i];
3945 appos2 = Electric.portPosition(ap2, apport2);
3946 Electric.newArcInst(m1arc,4*lambda,0,ap1,apport1,appos1[0].intValue(),
3947 appos1[1].intValue(),ap2,apport2,appos2[0].intValue(),
3948 appos2[1].intValue(),ininvp);
3949 }
3950 } else {
3951 for (i=0; i<outs; i++) {
3952 ap1 = outpins[i];
3953 apport1 = outports[i];
3954 appos1 = Electric.portPosition(ap1, apport1);
3955 ap2 = outpins2[i];
3956 apport2 = outports2[i];
3957 appos2 = Electric.portPosition(ap2, apport2);
3958 Electric.newArcInst(m1arc,4*lambda,0,ap1,apport1,appos1[0].intValue(),
3959 appos1[1].intValue(),ap2,apport2,appos2[0].intValue(),
3960 appos2[1].intValue(),ininvp);
3961 }
3962 }
3963
3964 // poly inpins to polypins
3965 for (i=0; i<outs; i++) {
3966 ap1 = inpins[i];
3967 apport1 = inports[i];
3968 appos1 = Electric.portPosition(ap1, apport1);
3969 ap2 = polypins[i];
3970 apport2 = polyports[i];
3971 appos2 = Electric.portPosition(ap2, apport2);
3972 Electric.newArcInst(parc,2*lambda,0,ap1,apport1,appos1[0].intValue(),
3973 appos1[1].intValue(),ap2,apport2,appos2[0].intValue(),
3974 appos2[1].intValue(),ininvp);
3975 }
3976
3977 // poly polypins to intppins
3978 for (i=0; i<outs; i++) {
3979 ap1 = polypins[i];
3980 apport1 = polyports[i];
3981 appos1 = Electric.portPosition(ap1, apport1);
3982 ap2 = intppins[i];
3983 apport2 = intpports[i];
3984 appos2 = Electric.portPosition(ap2, apport2);
3985 Electric.newArcInst(parc,2*lambda,0,ap1,apport1,appos1[0].intValue(),
3986 appos1[1].intValue(),ap2,apport2,appos2[0].intValue(),
3987 appos2[1].intValue(),ininvp);
3988 }
3989
3990 // poly intppins to ntrans
3991 for (i=0; i<outs; i++) {
3992 ap1 = intppins[i];
3993 apport1 = intpports[i];
3994 appos1 = Electric.portPosition(ap1, apport1);
3995 ap2 = ntrans[i];
3996 apport2 = nmosg2port;
3997 appos2 = Electric.portPosition(ap2, apport2);
3998 Electric.newArcInst(parc,2*lambda,0,ap1,apport1,appos1[0].intValue(),
3999 appos1[1].intValue(),ap2,apport2,appos2[0].intValue(),
4000 appos2[1].intValue(),ininvp);
4001 }
4002
4003 // poly ntrans to ptrans
4004 for (i=0; i<outs; i++) {
4005 ap1 = ntrans[i];
4006 apport1 = nmosg1port;
4007 appos1 = Electric.portPosition(ap1, apport1);
4008 ap2 = ptrans[i];
4009 apport2 = pmosg2port;
4010 appos2 = Electric.portPosition(ap2, apport2);
4011 Electric.newArcInst(parc,2*lambda,0,ap1,apport1,appos1[0].intValue(),
4012 appos1[1].intValue(),ap2,apport2,appos2[0].intValue(),
4013 appos2[1].intValue(),ininvp);
4014 }
4015
4016 // poly outpins to polypins
4017 for (i=0; i<outs; i++) {
4018 ap1 = outpins[i];
4019 apport1 = outports[i];
4020 appos1 = Electric.portPosition(ap1, apport1);
4021 ap2 = polypins2[i];
4022 apport2 = polyports2[i];
4023 appos2 = Electric.portPosition(ap2, apport2);
4024 Electric.newArcInst(parc,2*lambda,0,ap1,apport1,appos1[0].intValue(),
4025 appos1[1].intValue(),ap2,apport2,appos2[0].intValue(),
4026 appos2[1].intValue(),ininvp);
4027 }
4028
4029 // poly polypins to intppins
4030 for (i=0; i<outs; i++) {
4031 ap1 = polypins2[i];
4032 apport1 = polyports2[i];
4033 appos1 = Electric.portPosition(ap1, apport1);
4034 ap2 = intppins2[i];
4035 apport2 = intpports2[i];
4036 appos2 = Electric.portPosition(ap2, apport2);
4037 Electric.newArcInst(parc,2*lambda,0,ap1,apport1,appos1[0].intValue(),
4038 appos1[1].intValue(),ap2,apport2,appos2[0].intValue(),
4039 appos2[1].intValue(),ininvp);
4040 }
4041
4042 // poly outtppins to ptrans
4043 for (i=0; i<outs; i++) {
4044 ap1 = intppins2[i];
4045 apport1 = intpports2[i];
4046 appos1 = Electric.portPosition(ap1, apport1);
4047 ap2 = ptrans[i];
4048 apport2 = pmosg1port;
4049 appos2 = Electric.portPosition(ap2, apport2);
4050 Electric.newArcInst(parc,2*lambda,0,ap1,apport1,appos1[0].intValue(),
4051 appos1[1].intValue(),ap2,apport2,appos2[0].intValue(),
4052 appos2[1].intValue(),ininvp);
4053 }
4054
4055 // metal 1 pmospins to vddpins
4056 for (i=0; i<outs; i++) {
4057 ap1 = midvddpins[i];
4058 apport1 = midvddports[i];
4059 appos1 = Electric.portPosition(ap1, apport1);
4060 ap2 = vddpins[i];
4061 apport2 = vddports[i];
4062 appos2 = Electric.portPosition(ap2, apport2);
4063 Electric.newArcInst(m1arc,4*lambda,0,ap1,apport1,appos1[0].intValue(),
4064 appos1[1].intValue(),ap2,apport2,appos2[0].intValue(),
4065 appos2[1].intValue(),ininvp);
4066 }
4067
4068 // metal 1 nmospins to nmospins2
4069 for (i=0; i<outs; i++) {
4070 ap1 = gndpins[i];
4071 apport1 = gndports[i];
4072 appos1 = Electric.portPosition(ap1, apport1);
4073 ap2 = gndpins2[i];
4074 apport2 = gndports2[i];
4075 appos2 = Electric.portPosition(ap2, apport2);
4076 Electric.newArcInst(m1arc,4*lambda,0,ap1,apport1,appos1[0].intValue(),
4077 appos1[1].intValue(),ap2,apport2,appos2[0].intValue(),
4078 appos2[1].intValue(),ininvp);
4079 }
4080
4081 // metal 2 nmospins
4082 ap1 = gndpins2[0];
4083 apport1 = gndports2[0];
4084 appos1 = Electric.portPosition(ap1, apport1);
4085 for (i=1; i<outs; i++) {
4086 ap2 = gndpins2[i];
4087 apport2 = gndports2[i];
4088 appos2 = Electric.portPosition(ap2, apport2);
4089 Electric.newArcInst(m2arc,4*lambda,0,ap1,apport1,appos1[0].intValue(),
4090 appos1[1].intValue(),ap2,apport2,appos2[0].intValue(),
4091 appos2[1].intValue(),ininvp);
4092 }
4093
4094 // metal 2 vddpins
4095 ap1 = vddpins[0];
4096 apport1 = vddports[0];
4097 appos1 = Electric.portPosition(ap1, apport1);
4098 for (i=1; i<outs; i++) {
4099 ap2 = vddpins[i];
4100 apport2 = vddports[i];
4101 appos2 = Electric.portPosition(ap2, apport2);
4102 Electric.newArcInst(m2arc,4*lambda,0,ap1,apport1,appos1[0].intValue(),
4103 appos1[1].intValue(),ap2,apport2,appos2[0].intValue(),
4104 appos2[1].intValue(),ininvp);
4105 }
4106
4107 ap1 = vddpins[0];
4108 apport1 = vddports[0];
4109 appos1 = Electric.portPosition(ap1, apport1);
4110 ap2 = vddc;
4111 apport2 = vddcport;
4112 appos2 = Electric.portPosition(ap2, apport2);
4113 Electric.newArcInst(m2arc,4*lambda,0,ap1,apport1,appos1[0].intValue(),
4114 appos1[1].intValue(),ap2,apport2,appos2[0].intValue(),
4115 appos2[1].intValue(),ininvp);
4116 p = Electric.newPortProto(ininvp, ap2, apport2, ("vdd"));
4117 createExport(p, PWRPORT);
4118
4119 ap1 = gndpins2[0];
4120 apport1 = gndports2[0];
4121 appos1 = Electric.portPosition(ap1, apport1);
4122 ap2 = gndc;
4123 apport2 = gndcport;
4124 appos2 = Electric.portPosition(ap2, apport2);
4125 Electric.newArcInst(m2arc,4*lambda,0,ap1,apport1,appos1[0].intValue(),
4126 appos1[1].intValue(),ap2,apport2,appos2[0].intValue(),
4127 appos2[1].intValue(),ininvp);
4128 p = Electric.newPortProto(ininvp, ap2, apport2, ("gnd"));
4129 createExport(p, GNDPORT);
4130
4131 if ( top == true) {
4132 for (i=0; i<outs; i++) {
4133 ap1 = inpins2[i];
4134 apport1 = inports2[i];
4135 p = Electric.newPortProto(ininvp, ap1, apport1, ("in_top" + i));
4136 createExport(p, INPORT);
4137 }
4138 }else {
4139 for (i=0; i<outs; i++) {
4140 ap1 = inpins[i];
4141 apport1 = inports[i];
4142 p = Electric.newPortProto(ininvp, ap1, apport1, ("in_top" + i));
4143 createExport(p, INPORT);
4144 }
4145 }
4146 if ( top == true ) {
4147 for (i=0; i<outs; i++) {
4148 ap1 = outpins[i];
4149 apport1 = outports[i];
4150 p = Electric.newPortProto(ininvp, ap1, apport1, ("in_bot" + i));
4151 createExport(p, INPORT);
4152 }
4153 } else {
4154 for (i=0; i<outs; i++) {
4155 ap1 = outpins2[i];
4156 apport1 = outports2[i];
4157 p = Electric.newPortProto(ininvp, ap1, apport1, ("in_bot" + i));
4158 createExport(p, INPORT);
4159 }
4160 }
4161
4162 for (i=0; i<outs; i++) {
4163 ap1 = pmospins[i];
4164 apport1 = pmosports[i];
4165 p = Electric.newPortProto(ininvp, ap1, apport1, ("in_b" + i));
4166 createExport(p, INPORT);
4167 }
4168
4169 }
4170 ////////////////////ininverterplane end
4171
4172 }
4173