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

📄 romgenerator.java

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