📄 romgenerator.java
字号:
mpcbox[3]+y-8*lambda, 0, 0, romplane); gndpexport[m] = mpcport; } } } } // finished placing objects, start wiring arcs for (i=0; i<inputs; i++) { ap1 = andtrans[0][i]; apport1 = ppinport; appos1 = getCStylePortPosition(ap1, apport1); ap2 = m1polypins[i]; apport2 = mpcport; appos2 = getCStylePortPosition(ap2, apport2); ap3 = m1m2pins[i]; apport3 = m1m2cport; appos3 = getCStylePortPosition(ap3, apport3); makeCStyleArcInst(parc, 2*lambda, ap1, apport1, appos1[0], appos1[1], ap2, apport2, appos2[0], appos2[1]); makeCStyleArcInst(m1arc, 4*lambda, ap2, apport2, appos2[0], appos2[1], ap3, apport3, appos3[0], appos3[1]); } for (i=0; i<inputs; i++) { ap1 = andtrans[0][i]; apport1 = ppinport; appos1 = getCStylePortPosition(ap1, apport1); for (m=1; m<wordlines+1; m++) { ap2 = andtrans[m][i]; if (romarray[m-1][i] == 1) { apport2 = nmosg1port; apport3 = nmosg2port; } else { apport2 = ppinport; apport3 = ppinport; } appos2 = getCStylePortPosition(ap2, apport2); appos3 = getCStylePortPosition(ap2, apport3); makeCStyleArcInst(parc, 2*lambda, ap1, apport1, appos1[0], appos1[1], ap2, apport2, appos2[0], appos2[1]); ap1 = ap2; apport1 = apport3; appos1 = appos3; } } // connect m1 wordline lines for (m=0; m<wordlines; m++) { ap1 = minpins[m][0]; apport1 = minports[m][0]; appos1 = getCStylePortPosition(ap1, apport1); for (i=1; i<inputs+1; i++) { ap2 = minpins[m][i]; apport2 = minports[m][i]; appos2 = getCStylePortPosition(ap2, apport2); makeCStyleArcInst(m1arc, 4*lambda, ap1, apport1, appos1[0], appos1[1], ap2, apport2, appos2[0], appos2[1]); ap1 = ap2; apport1 = apport2; appos1 = appos2; } } // connect transistors to wordline lines for (m=0; m<wordlines; m++) { for (i=0; i<inputs; i++) { if (romarray[m][i] == 1) { // connect transistor ap1 = andtrans[m+1][i]; gnd1 = ap1; if (i%2 == 0) { apport1 = nmosd1port; gndport1 = nmosd2port; ap2 = minpins[m][i]; gnd2 = gndpins[m/2][i+1]; intgnd = diffpins[m][i+1]; } else { apport1 = nmosd2port; gndport1 = nmosd1port; ap2 = minpins[m][i+1]; gnd2 = gndpins[m/2][i]; intgnd = diffpins[m][i]; } appos1 = getCStylePortPosition(ap1, apport1); gndpos1 = getCStylePortPosition(gnd1, gndport1); apport2 = mnacport; appos2 = getCStylePortPosition(ap2, apport2); gndport2 = mnacport; gndpos2 = getCStylePortPosition(gnd2, gndport2); intgndport = diffpinport; intgndpos = getCStylePortPosition(intgnd, intgndport); makeCStyleArcInst(ndiffarc, 4/*16*/*lambda, ap1, apport1, appos1[0], appos1[1], ap2, apport2, appos2[0], appos2[1]); makeCStyleArcInst(ndiffarc, 4/*16*/*lambda, gnd1, gndport1, gndpos1[0], gndpos1[1], intgnd, intgndport, intgndpos[0], intgndpos[1]); makeCStyleArcInst(ndiffarc, 4/*16*/*lambda, intgnd, intgndport, intgndpos[0], intgndpos[1], gnd2, gndport2, gndpos2[0], gndpos2[1]); } } } // connect ground lines for (m=0; m<wordlines/2; m++) { ap1 = gndpins[m][0]; apport1 = gndports[m][0]; appos1 = getCStylePortPosition(ap1, apport1); for (i=1; i<inputs+1; i++) { ap2 = gndpins[m][i]; apport2 = gndports[m][i]; appos2 = getCStylePortPosition(ap2, apport2); makeCStyleArcInst(m1arc, 4*lambda, ap1, apport1, appos1[0], appos1[1], ap2, apport2, appos2[0], appos2[1]); if (i == inputs) { makeCStyleExport(romplane, ap1, apport1, "romgnd"+m, PortCharacteristic.GND); } ap1 = ap2; apport1 = apport2; appos1 = appos2; } } // extend the gnd plane for (m=0; m<wordlines/2; m++) { ap1 = gndpins[m][0]; apport1 = gndports[m][0]; appos1 = getCStylePortPosition(ap1, apport1); ap2 = gnd_2pins[m]; apport2 = gnd_2ports[m]; appos2 = getCStylePortPosition(ap2, apport2); makeCStyleArcInst(m1arc, 4*lambda, ap1, apport1, appos1[0], appos1[1], ap2, apport2, appos2[0], appos2[1]); } // tie up all the gndlines ap1 = gnd_2pins[0]; apport1 = gnd_2ports[0]; appos1 = getCStylePortPosition(ap1, apport1); for (m=0; m<wordlines/2; m++) { ap2 = gnd_2pins[m]; apport2 = gnd_2ports[m]; appos2 = getCStylePortPosition(ap2, apport2); makeCStyleArcInst(m1arc, 4*lambda, ap1, apport1, appos1[0], appos1[1], ap2, apport2, appos2[0], appos2[1]); if (m == (wordlines/2 - 1)) { makeCStyleExport(romplane, ap2, apport2, "gnd", PortCharacteristic.GND); } } ap2 = gndm1ex[0]; apport2 = gndm1export[0]; appos2 = getCStylePortPosition(ap2, apport2); makeCStyleArcInst(m1arc, 4*lambda, ap1, apport1, appos1[0], appos1[1], ap2, apport2, appos2[0], appos2[1]); ap1 = gnd1pin; apport1 = gnd1port; appos1 = getCStylePortPosition(ap1, apport1); makeCStyleArcInst(m1arc, 4*lambda, ap1, apport1, appos1[0], appos1[1], ap2, apport2, appos2[0], appos2[1]); makeCStyleExport(romplane, ap1, apport1, "gndc", PortCharacteristic.GND); ap1 = gndpex[0]; apport1 = gndpexport[0]; appos1 = getCStylePortPosition(ap1, apport1); makeCStyleArcInst(m1arc, 4*lambda, ap1, apport1, appos1[0], appos1[1], ap2, apport2, appos2[0], appos2[1]); ap2 = pulluptrans[0]; apport2 = pmosg1port; appos2 = getCStylePortPosition(ap2, apport2); makeCStyleArcInst(parc, 3*lambda, ap1, apport1, appos1[0], appos1[1], ap2, apport2, appos2[0], appos2[1]); // connect m1m2contact from romplane to m1m2contact before pull-up trans for (m=0; m<wordlines; m++) { ap1 = minpins[m][0]; apport1 = minports[m][0]; appos1 = getCStylePortPosition(ap1, apport1); ap2 = m1m2_2pins[m]; apport2 = m1m2_2ports[m]; appos2 = getCStylePortPosition(ap2, apport2); ap3 = m1m2_3pins[m]; apport3 = m1m2_3ports[m]; appos3 = getCStylePortPosition(ap3, apport3); makeCStyleArcInst(m1arc, 4*lambda, ap1, apport1, appos1[0], appos1[1], ap2, apport2, appos2[0], appos2[1]); makeCStyleArcInst(m2arc, 4*lambda, ap2, apport2, appos2[0], appos2[1], ap3, apport3, appos3[0], appos3[1]); } // connect m1m2contact from romplane to mpac of pull-up trans for (m=0; m<wordlines; m++) { ap1 = m1m2_3pins[m]; apport1 = m1m2_3ports[m]; appos1 = getCStylePortPosition(ap1, apport1); ap2 = mpac_1pins[m]; apport2 = mpac_1ports[m]; appos2 = getCStylePortPosition(ap2, apport2); makeCStyleArcInst(m1arc, 4*lambda, ap1, apport1, appos1[0], appos1[1], ap2, apport2, appos2[0], appos2[1]); } // connect pull-up transistors to the mpac for (m=0; m<wordlines; m++) { ap1 = pulluptrans[m]; ap4 = ap1; apport4 = pmosd1port; apport1 = pmosd2port; ap2= mpac_1pins[m]; ap3= mpac_2pins[m]; apport2 = mpacport; apport3 = mpacport; appos1 = getCStylePortPosition(ap1, apport1); appos4 = getCStylePortPosition(ap4, apport4); appos2 = getCStylePortPosition(ap2, apport2); appos3 = getCStylePortPosition(ap3, apport3); makeCStyleArcInst(pdiffarc, 3/*15*/*lambda, ap1, apport1, appos1[0], appos1[1], ap2, apport2, appos2[0], appos2[1]); makeCStyleArcInst(pdiffarc, 3/*15*/*lambda, ap4, apport4, appos4[0], appos4[1], ap3, apport3, appos3[0], appos3[1]); } // connect mpac of pull-up trans to m1m2c for (m=0; m<wordlines; m++) { ap1 = m1m2_4pins[m]; apport1 = m1m2_4ports[m]; appos1 = getCStylePortPosition(ap1, apport1); ap2 = mpac_2pins[m]; apport2 = mpac_2ports[m]; appos2 = getCStylePortPosition(ap2, apport2); makeCStyleArcInst(m1arc, 4*lambda, ap1, apport1, appos1[0], appos1[1], ap2, apport2, appos2[0], appos2[1]); } // connect mpac of pull-up trans to m1m2c for (m=0; m<wordlines; m++) { if (m%2 ==1) { ap1 = nwellc[m/2]; apport1 = nwellcports[m/2]; appos1 = getCStylePortPosition(ap1, apport1); ap2 = mpac_2pins[m]; apport2 = mpac_2ports[m]; appos2 = getCStylePortPosition(ap2, apport2); makeCStyleArcInst(m1arc, 4*lambda, ap1, apport1, appos1[0], appos1[1], ap2, apport2, appos2[0], appos2[1]); } } // tie up all the vddlines ap1 = m1m2_4pins[0]; apport1 = m1m2_4ports[0]; appos1 = getCStylePortPosition(ap1, apport1); for (m=0; m<wordlines; m++) { ap2 = m1m2_4pins[m]; apport2 = m1m2_4ports[m]; appos2 = getCStylePortPosition(ap2, apport2); makeCStyleArcInst(m2arc, 4*lambda, ap1, apport1, appos1[0], appos1[1], ap2, apport2, appos2[0], appos2[1]); } ap2 = vdd2pin; apport2 = vdd2port; appos2 = getCStylePortPosition(ap2, apport2); makeCStyleArcInst(m2arc, 4*lambda, ap1, apport1, appos1[0], appos1[1], ap2, apport2, appos2[0], appos2[1]); makeCStyleExport(romplane, ap2, apport2, "vdd", PortCharacteristic.PWR); // connect poly for the pull-up transistor for (m=0; m<wordlines-1; m++) { ap1 = pulluptrans[m]; apport1 = pmosg2port; appos1 = getCStylePortPosition(ap1, apport1); ap2 = pulluptrans[m+1]; apport2 = pmosg1port; appos2 = getCStylePortPosition(ap2, apport2); makeCStyleArcInst(parc, 3*lambda, ap1, apport1, appos1[0], appos1[1], ap2, apport2, appos2[0], appos2[1]); } } /** */ private static void decodernmos(Library destLib, double lambda, int bits, String cellname, boolean top) { int[][] romplane = generateplane(bits); int i, m; double x, y; NodeInst ap1, ap2, ap3, vdd1, vdd2; PortProto apport1, apport2, apport3, vddport1, vddport2; double[] appos1, appos2, appos3, vddpos1, vddpos2; int inputs = romplane[0].length; int wordlines = romplane.length; NodeInst[][] ortrans = new NodeInst[wordlines+3][inputs+2]; NodeInst[][] minpins = new NodeInst[wordlines+2][inputs+2]; NodeInst[][] vddpins = new NodeInst[wordlines][inputs/2]; NodeInst[] pwrpins = new NodeInst[inputs/2]; NodeInst[][] m1m2pins = new NodeInst[wordlines+2][inputs+2]; PortProto[][] minports = new PortProto[wordlines+2][inputs+2]; PortProto[][] vddports = new PortProto[wordlines][inputs/2]; PortProto[] pwrports = new PortProto[inputs/2]; PortProto[][] m1m2ports = new PortProto[wordlines+2][inputs+2]; // get pointers to primitives NodeProto nmos = tech.findNodeProto("N-Transistor"); PortProto nmosg1port = nmos.findPortProto("n-trans-poly-right"); PortProto nmosg2port = nmos.findPortProto("n-trans-poly-left"); PortProto nmosd1port = nmos.findPortProto("n-trans-diff-top"); PortProto nmosd2port = nmos.findPortProto("n-trans-diff-bottom"); double[] nmosbox = {-nmos.getDefWidth()/2-lambda/2, nmos.getDefWidth()/2+lambda/2, -nmos.getDefHeight()/2, nmos.getDefHeight()/2}; NodeProto ppin = tech.findNodeProto("Polysilicon-1-Pin"); PortProto ppinport = ppin.getPort(0); double[] ppinbox = {-ppin.getDefWidth()/2, ppin.getDefWidth()/2, -ppin.getDefHeight()/2, ppin.getDefHeight()/2}; NodeProto m1pin = tech.findNodeProto("Metal-1-Pin"); PortProto m1pinport = m1pin.getPort(0); double[] m1pinbox = {-m1pin.getDefWidth()/2-lambda/2, m1pin.getDefWidth()/2+lambda/2, -m1pin.getDefHeight()/2-lambda/2, m1pin.getDefHeight()/2+lambda/2}; NodeProto m2pin = tech.findNodeProto("Metal-2-Pin"); PortProto m2pinport = m2pin.getPort(0); double[] m2pinbox = {-m1pin.getDefWidth()/2-lambda/2, m1pin.getDefWidth()/2+lambda/2, -m1pin.getDefHeight()/2-lambda/2, m1pin.getDefHeight()/2+lambda/2}; NodeProto pwnode = tech.findNodeProto("P-Well-Node"); double mx = 5; NodeProto mpc = tech.findNodeProto("Metal-1-Polysilicon-1-Con"); PortProto mpcport = mpc.getPort(0); double[] mpcbox = {-mx*lambda/2, mx*lambda/2, -mx*lambda/2, mx*lambda/2}; NodeProto m1m2c = tech.findNodeProto("Metal-1-Metal-2-Con"); PortProto m1m2cport = m1m2c.getPort(0); double[] m1m2cbox = {-5*lambda/2, 5*lambda/2, -5*lambda/2, 5*lambda/2}; NodeProto mnac = tech.findNodeProto("Metal-1-N-Active-Con"); PortProto mnacport = mnac.getPort(0); double aaa = 17; double[] mnacbox = {-aaa*lambda/2, aaa*lambda/2, -aaa*lambda/2, aaa*lambda/2}; // centers around 6 goes up by multiples of 2 ArcProto parc = tech.findArcProto("Polysilicon-1"); ArcProto m1arc = tech.findArcProto("Metal-1"); ArcProto m2arc = tech.findArcProto("Metal-2"); ArcProto ndiffarc = tech.findArcProto("N-Active");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -