📄 romgenerator.java
字号:
// create a cell called cellname+"{lay}" in the destination library Cell decn = Cell.newInstance(destLib, cellname+"{lay}"); NodeProto nsnode = tech.findNodeProto("N-Select-Node"); makeCStyleNodeInst(pwnode,0,(8*lambda*(2*bits+1)), 0,8*lambda*(wordlines+1),0,0,decn); makeCStyleNodeInst(nsnode,0,(8*lambda*(2*bits+1)), 0,8*lambda*(wordlines+1),0,0,decn); // Create instances of objects on decoder nmos plane x = 0; for (i=0; i<inputs+1; i++) { x += 8*lambda; y = 0; if (i%2 ==1) { x += 0*lambda; } if (i < inputs) { if (top == true) { ortrans[0][i] = makeCStyleNodeInst(ppin, ppinbox[0]+x, ppinbox[1]+x, ppinbox[2], ppinbox[3], 0, 0, decn); } else { ortrans[0][i] = makeCStyleNodeInst(mpc, mpcbox[0]+x, mpcbox[1]+x, mpcbox[2], mpcbox[3], 0, 0, decn); } } for (m=0; m<wordlines; m++) { y += 8*lambda; if (i%2 == 1) { vddpins[m][i/2] = makeCStyleNodeInst(mnac, mnacbox[0]+x-4*lambda, mnacbox[1]+x-4*lambda, mnacbox[2]+y, mnacbox[3]+y, 0, 0, decn); vddports[m][i/2] = mnacport; if (m == (wordlines-1)) { pwrpins[i/2] = makeCStyleNodeInst(m1pin, m1pinbox[0]+x-4*lambda, m1pinbox[1]+x-4*lambda, m1pinbox[2]+y+(8*lambda), m1pinbox[3]+y+(8*lambda), 0, 0, decn); pwrports[i/2] = m1pinport; } } if (i < inputs) { if (romplane[m][i] == 1) { // create a transistor ortrans[m+1][i] = makeCStyleNodeInst(nmos, nmosbox[0]+x, nmosbox[1]+x, nmosbox[2]+y, nmosbox[3]+y, 1, 0, decn); } else { ortrans[m+1][i] = makeCStyleNodeInst(ppin, ppinbox[0]+x, ppinbox[1]+x, ppinbox[2]+y, ppinbox[3]+y, 0, 0, decn); } if (m == wordlines-1) { if (top == true) { ortrans[m+2][i] = makeCStyleNodeInst(mpc, mpcbox[0]+x, mpcbox[1]+x, mpcbox[2]+y+16*lambda, mpcbox[3]+y+16*lambda, 0, 0, decn); } else { ortrans[m+2][i] = makeCStyleNodeInst(ppin, ppinbox[0]+x, ppinbox[1]+x, ppinbox[2]+y+4*lambda, ppinbox[3]+y+4*lambda, 0, 0, decn); } } } boolean transcont = false; if (i < inputs) transcont = (romplane[m][i] == 1); if (i > 1) transcont |= (romplane[m][i-1] == 1); if (i%2 == 0 && transcont) { minpins[m][i] = makeCStyleNodeInst(mnac, mnacbox[0]+x-4*lambda, mnacbox[1]+x-4*lambda, mnacbox[2]+y, mnacbox[3]+y, 0, 0, decn); minports[m][i] = mnacport; m1m2pins[m][i] = makeCStyleNodeInst(m1m2c, m1m2cbox[0]+x-4*lambda, m1m2cbox[1]+x-4*lambda, m1m2cbox[2]+y, m1m2cbox[3]+y, 0, 0, decn); m1m2ports[m][i] = m1m2cport; } else { minpins[m][i] = makeCStyleNodeInst(m2pin, m2pinbox[0]+x-4*lambda, m2pinbox[1]+x-4*lambda, m2pinbox[2]+y, m2pinbox[3]+y, 0, 0, decn); minports[m][i] = m2pinport; if (i==0) { m1m2pins[m][i] = makeCStyleNodeInst(m1m2c, m1m2cbox[0]+x-4*lambda, m1m2cbox[1]+x-4*lambda, m1m2cbox[2]+y, m1m2cbox[3]+y, 0, 0, decn); m1m2ports[m][i] = m1m2cport; } else { m1m2pins[m][i] = makeCStyleNodeInst(m2pin, m2pinbox[0]+x-4*lambda, m2pinbox[1]+x-4*lambda, m2pinbox[2]+y, m2pinbox[3]+y, 0, 0, decn); m1m2ports[m][i] = m2pinport; } } if (i==0) { ap1 = m1m2pins[m][i]; apport1 = m1m2ports[m][i]; makeCStyleExport(decn, ap1, apport1, "mid"+m, PortCharacteristic.IN); } } } // finished making instances, start making arcs ap1 = pwrpins[0]; apport1 = pwrports[0]; appos1 = getCStylePortPosition(ap1, apport1); for (i=1; i<inputs/2; i++) { ap2 = pwrpins[i]; apport2 = pwrports[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; } makeCStyleExport(decn, ap1, apport1, "gnd", PortCharacteristic.GND); m = wordlines - 1; for (i=0; i<inputs/2; i++) { ap1 = vddpins[m][i]; apport1 = vddports[m][i]; appos1 = getCStylePortPosition(ap1, apport1); ap2 = pwrpins[i]; apport2 = pwrports[i]; appos2 = getCStylePortPosition(ap2, apport2); makeCStyleArcInst(m1arc, 4*lambda, ap1, apport1, appos1[0], appos1[1], ap2, apport2, appos2[0], appos2[1]); } // connect polysilicon gates for (i=0; i<inputs; i++) { ap1 = ortrans[wordlines+1][i]; if (top == true) { apport1 = mpcport; } else { apport1 = ppinport; } appos1 = getCStylePortPosition(ap1, apport1); if (i%2 == 0) { makeCStyleExport(decn, ap1, apport1, "top_in"+(i/2), PortCharacteristic.IN); } else { makeCStyleExport(decn, ap1, apport1, "top_in"+((i-1)/2)+"_b", PortCharacteristic.IN); } ap1 = ortrans[0][i]; if (top == true) { apport1 = ppinport; } else { apport1 = mpcport; } appos1 = getCStylePortPosition(ap1, apport1); if (i%2 == 0) { makeCStyleExport(decn, ap1, apport1, "bot_in"+(i/2), PortCharacteristic.IN); } else { makeCStyleExport(decn, ap1, apport1, "bot_in"+((i-1)/2)+"_b", PortCharacteristic.IN); } for (m=1; m<wordlines+1; m++) { ap2 = ortrans[m][i]; if (romplane[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; } ap2 = ortrans[wordlines+1][i]; if (top == true) { apport2 = mpcport; apport3 = mpcport; } 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]); } // connect m2 wordline lines for (m=0; m<wordlines; m++) { ap1 = m1m2pins[m][0]; apport1 = m1m2ports[m][0]; appos1 = getCStylePortPosition(ap1, apport1); for (i=1; i<inputs+1; i++) { ap2 = m1m2pins[m][i]; apport2 = m1m2ports[m][i]; appos2 = getCStylePortPosition(ap2, apport2); makeCStyleArcInst(m2arc, 4*lambda, ap1, apport1, appos1[0], appos1[1], ap2, apport2, appos2[0], appos2[1]); ap1 = ap2; apport1 = apport2; appos1 = appos2; } makeCStyleExport(decn, ap1, apport1, "word"+m, PortCharacteristic.OUT); } // connect transistors to wordline lines for (m=0; m<wordlines; m++) { for (i=0; i<inputs; i++) { if (romplane[m][i] == 1) { // connect transistor ap1 = ortrans[m+1][i]; vdd1 = ap1; if (i%2 == 0) { apport1 = nmosd1port; vddport1 = nmosd2port; ap2 = minpins[m][i]; ap3 = m1m2pins[m][i]; vdd2 = vddpins[m][i/2]; } else { apport1 = nmosd2port; vddport1 = nmosd1port; ap2 = minpins[m][i+1]; ap3 = m1m2pins[m][i+1]; vdd2 = vddpins[m][i/2]; } apport2 = mnacport; apport3 = m1m2cport; vddport2 = mnacport; appos1 = getCStylePortPosition(ap1, apport1); vddpos1 = getCStylePortPosition(vdd1, vddport1); appos2 = getCStylePortPosition(ap2, apport2); appos3 = getCStylePortPosition(ap3, apport3); vddpos2 = getCStylePortPosition(vdd2, vddport2); // ndiffarc size centers around 12 and goes up by multiples of 2 makeCStyleArcInst(ndiffarc, 4/*16*/*lambda, ap1, apport1, appos1[0], appos1[1], ap2, apport2, appos2[0], appos2[1]); makeCStyleArcInst(ndiffarc, 4/*16*/*lambda, vdd1, vddport1, vddpos1[0], vddpos1[1], vdd2, vddport2, vddpos2[0], vddpos2[1]); makeCStyleArcInst(m1arc, 4*lambda, ap2, apport2, appos2[0], appos2[1], ap3, apport3, appos3[0], appos3[1]); } } } // connect vdd lines for (i=0; i<inputs/2; i++) { ap1 = vddpins[0][i]; apport1 = vddports[0][i]; appos1 = getCStylePortPosition(ap1, apport1); for (m=1; m<wordlines; m++) { ap2 = vddpins[m][i]; apport2 = vddports[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; } } } /** */ private static void decoderpmos(Library destLib, double lambda, int bits, String cellname, boolean top) { int[][] romplane = generateplane(bits); int i, m; double x, y; NodeInst ap1, ap2, ap3, apx, apy; PortProto apport1, apport2, apport3, apportx, apporty; double[] appos1, appos2, appos3, apposx, apposy; int inputs = romplane[0].length; int wordlines = romplane.length; NodeInst[][] andtrans = new NodeInst[wordlines+2][inputs+2]; NodeInst[][] minpins = new NodeInst[wordlines+3][inputs+2]; NodeInst[] m1m2pins = new NodeInst[wordlines+2]; NodeInst[] m2pins = new NodeInst[wordlines+2]; NodeInst vddpin = null; NodeInst vddbpin = null; NodeInst vddcpin = null; PortProto[][] minports = new PortProto[wordlines+2][inputs+2]; PortProto[] m1m2ports = new PortProto[wordlines+2]; PortProto[] m2ports = new PortProto[wordlines+2]; PortProto vddport = null; PortProto vddbport = null; PortProto vddcport = null; // get pointers to primitives NodeProto pmos = tech.findNodeProto("P-Transistor"); PortProto pmosg1port = pmos.findPortProto("p-trans-poly-right"); PortProto pmosg2port = pmos.findPortProto("p-trans-poly-left"); PortProto pmosd1port = pmos.findPortProto("p-trans-diff-top"); PortProto pmosd2port = pmos.findPortProto("p-trans-diff-bottom"); double[] pmosbox = {-pmos.getDefWidth()/2-lambda/2, pmos.getDefWidth()/2+lambda/2, -pmos.getDefHeight()/2, pmos.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}; 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 m1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -