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