⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 romgenerator.java

📁 The ElectricTM VLSI Design System is an open-source Electronic Design Automation (EDA) system that c
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
												 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 + -