Transistor Layout in Progress
This commit is contained in:
parent
b3fa237ea7
commit
51a72fc639
|
@ -6,9 +6,11 @@
|
|||
<rule name="transistorMaxW" value="1500.0" ref="2-1"/>
|
||||
|
||||
<rule name="minWidth" layer="cut0" value="0.16" ref="19-1"/>
|
||||
<rule name="minSpacing" layer="cut0" value="0.18" ref="19-2.a"/>
|
||||
<arule name="minExtension" layer1="poly" layer2="cut0" value="0.07" ref="19-3"/>
|
||||
|
||||
<arule name="minExtension" layer1="nImplant" layer2="poly" value="0.2" ref="16-17"/>
|
||||
<arule name="minGateEnclosure" layer1="nImplant" layer2="poly" value="0.4" ref="16-6"/>
|
||||
<arule name="minEnclosure" layer1="nImplant" layer2="poly" value="0.2" ref="16-17"/>
|
||||
<arule name="minExtension" layer1="nImplant" layer2="active" value="0.18" ref="16-8"/>
|
||||
|
||||
<arule name="minGateEnclosure" layer1="pImplant" layer2="poly" value="0.4" ref="17-6"/>
|
||||
|
@ -19,8 +21,10 @@
|
|||
<arule name="minExtension" layer1="pImplant" layer2="cut0" value="0.09" ref="19-4.b"/>
|
||||
<arule name="minExtension" layer1="nImplant" layer2="cut0" value="0.09" ref="19-4.c"/>
|
||||
|
||||
<rule name="minSpacing" layer1="active" layer2="cut0" value="0.14" ref="19-5"/>
|
||||
<rule name="minSpacing" layer1="active" layer2="poly" value="0.07" ref="13-5"/>
|
||||
<rule name="minSpacing" layer1="active" layer2="cut0" value="0.14" ref="19-5"/>
|
||||
<arule name="minGateSpacing" layer1="cut0" layer2="active" value="0.11" ref="19-6.a"/>
|
||||
<rule name="minSpacing" layer1="active" layer2="poly" value="0.07" ref="13-5"/>
|
||||
<arule name="minSourceDrainWidth" layer1="active" layer2="poly" value="0.23" ref="13-6"/>
|
||||
|
||||
<arule name="minExtension" layer1="poly" layer2="active" value="0.18" ref="13-7"/>
|
||||
|
||||
|
|
|
@ -157,20 +157,30 @@ void Transistor::createLayout() {
|
|||
ATechnology* atechno = AEnv::getATechnology();
|
||||
|
||||
DbU::Unit widthCut0 = atechno->getPhysicalRule("minWidth", getLayer(techno, "cut0"))->getValue();
|
||||
DbU::Unit spacingCut0 = atechno->getPhysicalRule("minSpacing", getLayer(techno, "cut0"))->getValue();
|
||||
DbU::Unit extGateActive = atechno->getPhysicalRule("minExtension",
|
||||
getLayer(techno, "poly"), getLayer(techno, "active"))->getValue();
|
||||
DbU::Unit extPolyCut0 = atechno->getPhysicalRule("minExtension",
|
||||
getLayer(techno, "poly"), getLayer(techno, "cut0"))->getValue();
|
||||
DbU::Unit spacingActiveCut0 = atechno->getPhysicalRule("minSpacing",
|
||||
getLayer(techno, "active"), getLayer(techno, "cut0"))->getValue();
|
||||
DbU::Unit spacingGateCut0 = atechno->getPhysicalRule("minGateSpacing",
|
||||
getLayer(techno, "cut0"), getLayer(techno, "active"))->getValue();
|
||||
DbU::Unit spacingActivePoly = atechno->getPhysicalRule("minSpacing",
|
||||
getLayer(techno, "active"), getLayer(techno, "poly"))->getValue();
|
||||
DbU::Unit sourceDrainWidth = atechno->getPhysicalRule("minSourceDrainWidth",
|
||||
getLayer(techno, "active"), getLayer(techno, "poly"))->getValue();
|
||||
DbU::Unit extActiveCut0 = atechno->getPhysicalRule("minExtension",
|
||||
getLayer(techno, "active"), getLayer(techno, "cut0"))->getValue();
|
||||
DbU::Unit enclosureImplantPoly = 0;
|
||||
DbU::Unit enclosureGateImplant = 0;
|
||||
DbU::Unit extImplantActive = 0;
|
||||
DbU::Unit extImplantCut0 = 0;
|
||||
if (_polarity == Polarity::N) {
|
||||
enclosureImplantPoly = atechno->getPhysicalRule("minEnclosure",
|
||||
getLayer(techno, "nImplant"), getLayer(techno, "poly"))->getValue();
|
||||
enclosureGateImplant = atechno->getPhysicalRule("minGateEnclosure",
|
||||
getLayer(techno, "nImplant"), getLayer(techno, "poly"))->getValue();
|
||||
extImplantActive = atechno->getPhysicalRule("minExtension",
|
||||
getLayer(techno, "nImplant"), getLayer(techno, "active"))->getValue();
|
||||
extImplantCut0 = atechno->getPhysicalRule("minExtension",
|
||||
|
@ -178,6 +188,8 @@ void Transistor::createLayout() {
|
|||
} else {
|
||||
enclosureImplantPoly = atechno->getPhysicalRule("minEnclosure",
|
||||
getLayer(techno, "pImplant"), getLayer(techno, "poly"))->getValue();
|
||||
enclosureGateImplant = atechno->getPhysicalRule("minGateEnclosure",
|
||||
getLayer(techno, "nImplant"), getLayer(techno, "poly"))->getValue();
|
||||
extImplantActive = atechno->getPhysicalRule("minExtension",
|
||||
getLayer(techno, "pImplant"), getLayer(techno, "active"))->getValue();
|
||||
extImplantCut0 = atechno->getPhysicalRule("minExtension",
|
||||
|
@ -191,10 +203,8 @@ void Transistor::createLayout() {
|
|||
DbU::Unit x00 = 0;
|
||||
DbU::Unit y00 = -extGateActive;
|
||||
DbU::Unit dx00 = _l;
|
||||
DbU::Unit dy00 = _w - y00*2;
|
||||
Box box00(x00, y00, dx00, dy00);
|
||||
cerr << _w << endl;
|
||||
cerr << box00 << endl;
|
||||
DbU::Unit dy00 = _w + extGateActive;
|
||||
Box box00(x00, y00, x00 + dx00, y00 + dy00);
|
||||
_grid00->setBoundingBox(box00);
|
||||
|
||||
//grid30
|
||||
|
@ -210,7 +220,7 @@ void Transistor::createLayout() {
|
|||
y30 = _w + spacingActiveCut0;
|
||||
}
|
||||
x30 = x00 + dx00/2 - dx30/2;
|
||||
Box box30(x30, y30, dx30, dy30);
|
||||
Box box30(x30, y30, x30 + dx30, y30 + dy30);
|
||||
_grid30->setBoundingBox(box30);
|
||||
|
||||
//grid31
|
||||
|
@ -218,7 +228,7 @@ void Transistor::createLayout() {
|
|||
DbU::Unit dy31 = dy30 + 2*extPolyCut0;
|
||||
DbU::Unit x31 = x30 - extPolyCut0;
|
||||
DbU::Unit y31 = y30 - extPolyCut0;
|
||||
Box box31(x31, y31, dx31, dy31);
|
||||
Box box31(x31, y31, x31 + dx31, y31 + dy31);
|
||||
_grid31->setBoundingBox(box31);
|
||||
|
||||
//grid01
|
||||
|
@ -231,7 +241,7 @@ void Transistor::createLayout() {
|
|||
dx01 = dx00;
|
||||
dy01 = y31 - (y00 + dy00);
|
||||
}
|
||||
Box box01(x01, y01, dx01, dy01);
|
||||
Box box01(x01, y01, x01 + dx01, y01 + dy01);
|
||||
_grid01->setBoundingBox(box01);
|
||||
|
||||
//anonymous12
|
||||
|
@ -241,10 +251,70 @@ void Transistor::createLayout() {
|
|||
DbU::Unit yMax = max( max(y30 + dy30 + extImplantCut0, max(y31 + dy31, y00 + dy00) + enclosureImplantPoly), _w + extImplantActive);
|
||||
DbU::Unit dy12 = yMax - y12;
|
||||
|
||||
Box box12(x12, y12, dx12, dy12);
|
||||
Box box12(x12, y12, x12 + dx12, y12 + dy12);
|
||||
_anonymous12->setBoundingBox(box12);
|
||||
|
||||
//_source20
|
||||
DbU::Unit y20 = extActiveCut0;
|
||||
DbU::Unit dy20 = _w - 2 * extActiveCut0;
|
||||
unsigned sourceColumnNumber = 1;
|
||||
DbU::Unit dx20 = sourceColumnNumber * widthCut0 + (sourceColumnNumber - 1) * spacingCut0;
|
||||
DbU::Unit x20 = -(dx20 + spacingGateCut0);
|
||||
Box box20(x20, y20, x20 + dx20, y20 + dy20);
|
||||
_source20->setBoundingBox(box20);
|
||||
|
||||
//_drain40
|
||||
DbU::Unit y40 = y20;
|
||||
DbU::Unit x40 = x00 + dx00 + spacingGateCut0;
|
||||
unsigned drainColumnNumber = 1;
|
||||
DbU::Unit dx40 = drainColumnNumber * widthCut0 + (drainColumnNumber - 1) * (spacingCut0);
|
||||
DbU::Unit dy40 = dy20;
|
||||
|
||||
Box box40(x40, y40, x40 + dx40, y40 + dy40);
|
||||
_drain40->setBoundingBox(box40);
|
||||
|
||||
//_anonymous10
|
||||
DbU::Unit y10 = 0;
|
||||
DbU::Unit x10 = min(x20 - spacingActiveCut0, sourceDrainWidth);
|
||||
DbU::Unit dy10 = _w;
|
||||
DbU::Unit extension10 = max(x40 + dx40 + spacingActiveCut0, dx00 + sourceDrainWidth);
|
||||
DbU::Unit dx10 = -x10 + extension10;
|
||||
|
||||
Box box10(x10, y10, x10 + dx10, y10 + dy10);
|
||||
_anonymous10->setBoundingBox(box10);
|
||||
|
||||
//Rectangle 23
|
||||
DbU::Unit x23 = x10;
|
||||
DbU::Unit y23 = y10;
|
||||
DbU::Unit dx23 = x10;
|
||||
DbU::Unit dy23 = _w;
|
||||
|
||||
//_anonymous11
|
||||
DbU::Unit extension11_1 = enclosureGateImplant;
|
||||
DbU::Unit extension11_2 = extImplantCut0 - x20;
|
||||
DbU::Unit extension11_3 = extImplantActive - x10;
|
||||
|
||||
DbU::Unit extension11_4 = max(max(extension11_1, extension11_2), extension11_3);
|
||||
|
||||
DbU::Unit x11 = extension11_4;
|
||||
|
||||
extension11_1 = enclosureGateImplant + x00 + dx00;
|
||||
extension11_2 = extImplantCut0 + x40 + dx40;
|
||||
extension11_3 = extImplantActive + x10 + dx10;
|
||||
|
||||
extension11_4 = max(max(extension11_1, extension11_2), extension11_3);
|
||||
|
||||
DbU::Unit dx11 = -x11 + extension11_4;
|
||||
|
||||
DbU::Unit y11 = min(y20 - extImplantCut0, y23 - extImplantActive);
|
||||
DbU::Unit dy11 = max(y20 + dy20 + extImplantCut0, y23 + dy23 + extImplantActive) - y11;
|
||||
|
||||
Box box11(x11, y11, x11 + dx11, y11 + dy11);
|
||||
_anonymous11->setBoundingBox(box11);
|
||||
|
||||
#if 0
|
||||
//setAbutmentBox(getAbutmentBox());
|
||||
#endif
|
||||
UpdateSession::close();
|
||||
}
|
||||
|
||||
|
|
|
@ -99,19 +99,11 @@ class ATechnology : public PrivateProperty {
|
|||
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
// Inspector Support for : "ATechnology::LayerPair&".
|
||||
// Inspector Support for : "ATechnology::LayerPair".
|
||||
|
||||
template<>
|
||||
inline std::string getString<ATechnology::LayerPair&> (ATechnology::LayerPair& lp) {
|
||||
return "<LayerPair layer1=" + getString(lp.first) + ", layer2=" + getString(lp.second);
|
||||
}
|
||||
|
||||
template<>
|
||||
inline Hurricane::Record* getRecord<ATechnology::LayerPair&> (ATechnology::LayerPair& lp) {
|
||||
Hurricane::Record* record = new Hurricane::Record(getString(&lp));
|
||||
record->add(getSlot("Layer1", lp.first));
|
||||
record->add(getSlot("Layer2", lp.second));
|
||||
return record;
|
||||
inline std::string getString<ATechnology::LayerPair> (ATechnology::LayerPair lp) {
|
||||
return "<LayerPair layer1=" + getString(lp.first) + ", layer2=" + getString(lp.second) + ">";
|
||||
}
|
||||
|
||||
INSPECTOR_P_SUPPORT(ATechnology);
|
||||
|
|
|
@ -41,8 +41,8 @@ int main(int argc, char* argv[]) {
|
|||
DbU::Unit transistorMinW = aTechnology->getPhysicalRule("transistorMinW")->getValue();
|
||||
|
||||
DbU::Unit L = transistorMinL;
|
||||
DbU::Unit W = transistorMinW;
|
||||
Transistor* trans = Transistor::create(userLibrary, Name("TEST"), Transistor::Polarity::P, L, W);
|
||||
DbU::Unit W = 2 * transistorMinW;
|
||||
Transistor* trans = Transistor::create(userLibrary, Name("TEST"), Transistor::Polarity::N, L, W);
|
||||
trans->createLayout();
|
||||
CellViewer* viewer = new CellViewer ( trans );
|
||||
viewer->show();
|
||||
|
|
Loading…
Reference in New Issue