newdesign("default_test");
newcell("cell_1");
opencell("cell_1");
Inverter({0,0},10,3,30,3);
Inverter(getpoint(),20,2,60,2);
|
»»»Home «««
»»»TELL «««
»»»Toped «««
»»»Ifaces «««
|
TELL ExampleA basic functions to draw a CMOS transistors, using W and L as an input parameters. The design rules are not listed, their names start with underscore. The lines below demonstrate the use of TELL functions. After creating a new design and opening a cell, two inverters will be created. The second call will wait for a binding point to be selected from the user. newdesign("default_test");
newcell("cell_1");
opencell("cell_1");
Inverter({0,0},10,3,30,3);
Inverter(getpoint(),20,2,60,2);
Invertor
#include "desrul.tll"
box MOStran(point bound, real W, real L) {
// active
real activeW = L + 2*_gate2cont + 2*_mincont + 2*_actOverCont;
addbox(bound,activeW,W,2);
// gate
point gateB = {bound.x + (activeW - L)/2, bound.y -_polyOverActive};
addbox(gateB, L, W + 2*_polyOverActive,4); // as above
// add contacts...
point contBL = bound /| _actOverCont;
point contBR = bound |\ _actOverCont;
contBR = {contBR.x + activeW, contBR.y};
point metlBL = contBL |/ _metalovercont;
point metlBR = contBR \| _metalovercont;
box zerobox = {{0,0},{0,0}};
box contactL = zerobox /| _mincont;
box contactR = zerobox |\ _mincont;
// calculate the number of contacts
if (W < 2*_actOverCont + _mincont) {
echo("Can't fit even a single contact !")
}
else {
usinglayer(7);
real numconts = (W - 2*_actOverCont) / (_mincont + _contspace);
while (numconts > 0) {
addbox(contactL+contBL);
addbox(contactR+contBR);
contBL.y = contBL.y + _contspace + _mincont;
contBR.y = contBR.y + _contspace + _mincont;
numconts = numconts - 1;
};
usinglayer(8);
point metlTL = {contBL.x + _metalovercont + _mincont ,
contBL.y - _contspace + _metalovercont};
point metlTR = {contBR.x - _metalovercont - _mincont ,
contBR.y - _contspace + _metalovercont};
addbox(metlBL, metlTL);
addbox(metlBR, metlTR);
};
return {{bound.x, bound.y}, {bound.x + activeW, bound.y + W}};
}
void Invertor(point bound, real NW, real NL, real PW, real PL) {
MOStran(bound,NW,NL);
bound.y = bound.y + NW + _nwelltonactive + _welloverpwell;
box ptrActive = MOStran(bound,PW,PL);
addbox((ptrActive /| _welloverpwell ) |/ _welloverpwell , 1);
addbox((ptrActive /| _implantoveract) |/ _implantoveract, 6);
}
|