merging
This commit is contained in:
parent
40c410cabf
commit
97747ddfdc
|
@ -1,8 +1,6 @@
|
||||||
INCLUDE_DIRECTORIES(${CHAMSIN_SOURCE_DIR}/src/dtr ${HURRICANE_INCLUDE_DIR} ${source_dir})
|
INCLUDE_DIRECTORIES(${CHAMSIN_SOURCE_DIR}/src/dtr ${HURRICANE_INCLUDE_DIR} ${source_dir})
|
||||||
|
|
||||||
ADD_LIBRARY(analogic SHARED
|
ADD_LIBRARY(analogic SHARED
|
||||||
GenV1Trans.cpp
|
|
||||||
MetaTransistor.cpp
|
|
||||||
Transistor.cpp)
|
Transistor.cpp)
|
||||||
|
|
||||||
TARGET_LINK_LIBRARIES(analogic dtr ${HURRICANE_LIBRARIES})
|
TARGET_LINK_LIBRARIES(analogic dtr ${HURRICANE_LIBRARIES})
|
||||||
|
|
|
@ -13,154 +13,6 @@
|
||||||
#include "Box.h"
|
#include "Box.h"
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
|
||||||
// Macro Method : "MAXLONG(a,b), MINLONG(a,b)"
|
|
||||||
// Comparaison Method Macro For Calculate Rectangles.
|
|
||||||
|
|
||||||
#define MAXLONG(a,b) (a>b?a:b)
|
|
||||||
#define MINLONG(a,b) (a>b?b:a)
|
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
|
||||||
// Macro Method : "GET_RULE(s)"
|
|
||||||
// This Method Macro is For geting The Value in RdsUnit of a DRM Rule.
|
|
||||||
// To Use This Macro, you must predefine Pointeur dtraccess.
|
|
||||||
|
|
||||||
#define GET_RULE(s) \
|
|
||||||
dtraccess->getSingleRdsRuleByLabel(string(s))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
|
||||||
// Macro Method "GET_RULE_BYNP(prefix, type, suffix)"
|
|
||||||
// This Method Macro is For geting The Value in RdsUnit of a DRM Rule
|
|
||||||
// selected by string type which is mostype .
|
|
||||||
|
|
||||||
/* \prefix must be a chain character.
|
|
||||||
* \type mos type('N'/'P'), must be a string.
|
|
||||||
* \suffix must be a chain character.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// To Use This Macro, you must Predefine Pointeur dtraccess.
|
|
||||||
|
|
||||||
#define GET_RULE_BYNP(prefix, type, suffix) \
|
|
||||||
dtraccess->getSingleRdsRuleByLabel(prefix, type, suffix)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
|
||||||
// Macro Method : "get_LAYER_BYNP(prefix, type, suffix)"
|
|
||||||
// This Method Macro is For geting the Layer of a Layer Rule Selected
|
|
||||||
// by string type which is mostype. To Use This Macro, you must predefine
|
|
||||||
// Pointeur dtraccess.
|
|
||||||
|
|
||||||
/* \prefix must be a chain of character.
|
|
||||||
* \type mos type('N'/'P'), must be a string.
|
|
||||||
* \suffix must be a string.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// To Use This Macro, you must Predefine Pointeur dtraccess.
|
|
||||||
|
|
||||||
#define GET_LAYER_BYNP(prefix, type, suffix) \
|
|
||||||
dtraccess->getSingleLayerByLabel(prefix, type, suffix)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
|
||||||
// Macro Method : "SAVE_RECTANGLE(S, x, y, dx, dy)"
|
|
||||||
// This Method Macro is For Saving A Rectangle in a map .
|
|
||||||
|
|
||||||
/* \s name of rectangle, must be a chain of character.
|
|
||||||
* \x xmin, must be a long.
|
|
||||||
* \y ymin, must be a long.
|
|
||||||
* \dx width, must be a long.
|
|
||||||
* \dy height, must be a long.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// This Method Macro must be used in Membre Function Calculate.
|
|
||||||
|
|
||||||
#define SAVE_RECTANGLE(s, x, y, dx, dy) \
|
|
||||||
_mapString2Box[string(s)] = Box(getUnit(x), getUnit(y), getUnit(x+dx), getUnit(y+dy)); \
|
|
||||||
xmin = MINLONG(xmin, getUnit(x)); \
|
|
||||||
ymin = MINLONG(ymin, getUnit(y));
|
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
|
||||||
// Macro Method : "GET_BOX(s)"
|
|
||||||
// This Method Macro is For get the box According to the its name.
|
|
||||||
|
|
||||||
/*
|
|
||||||
* \s name of rectangle, must be a string.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// This Method Macro must be used in member function of Class GenTrans.
|
|
||||||
//
|
|
||||||
|
|
||||||
#define GET_BOX(s) \
|
|
||||||
_mapString2Box[s]
|
|
||||||
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------
|
|
||||||
// Macro Method : "CREATE_CONTACT_MATRIX_UNDER(boxname, nbcolumn, layer, net)"
|
|
||||||
// This Method Macro is For Create a matrix of Contact under a zone for
|
|
||||||
// a net specified.
|
|
||||||
|
|
||||||
/* \underbox A rectangle under which contacts will be placed, must be a objet Box.
|
|
||||||
* \nbcolumn the number of column, must be a integer.
|
|
||||||
* \layer the layer of contact, must be a pointer of type Layer*.
|
|
||||||
* \net the net to be hooked, must be a pointer of type Net*.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// To use this Macro Function. You Must also définir variable nbcontact,
|
|
||||||
// tmp_xcenter, tmp_ycenter, rw_cont, rd_cont.
|
|
||||||
//
|
|
||||||
|
|
||||||
#define CREATE_CONTACT_MATRIX_UNDER(underbox, nbcolumn, layer, net) \
|
|
||||||
\
|
|
||||||
if(underbox.getHeight()<rw_cont) \
|
|
||||||
nbcontact = 0; \
|
|
||||||
else \
|
|
||||||
nbcontact = (underbox.getHeight()-rw_cont)/(rw_cont + rd_cont) + 1 ;\
|
|
||||||
\
|
|
||||||
\
|
|
||||||
tmp_xcenter = underbox.getXMin() + (rw_cont/2); \
|
|
||||||
tmp_ycenter = underbox.getYMin() + (rw_cont/2); \
|
|
||||||
\
|
|
||||||
\
|
|
||||||
for(unsigned i=0; i<nbcolumn; i++) { \
|
|
||||||
\
|
|
||||||
for(unsigned j=0; j<nbcontact; j++) { \
|
|
||||||
Contact::create(net, layer \
|
|
||||||
, tmp_xcenter \
|
|
||||||
, tmp_ycenter \
|
|
||||||
, rw_cont \
|
|
||||||
, rw_cont \
|
|
||||||
); \
|
|
||||||
\
|
|
||||||
tmp_ycenter += (rw_cont + rd_cont); \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
tmp_xcenter += (rw_cont + rd_cont); \
|
|
||||||
tmp_ycenter = underbox.getYMin() + (rw_cont/2); \
|
|
||||||
}
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------
|
|
||||||
// Macro Function : "BOX_IS_VALID(box)"
|
|
||||||
// This Macro Function is for check if the box is correctly in the
|
|
||||||
// grille of fondor. It will check if the value of x,y,dx,dy are all
|
|
||||||
// pair.
|
|
||||||
|
|
||||||
/*
|
|
||||||
* box the box is to check. must be a objet Box.
|
|
||||||
*/
|
|
||||||
|
|
||||||
# define BOX_IS_VALID(box) \
|
|
||||||
( (long)(getValue(box.getXMin()))%2==0 )&& \
|
|
||||||
( (long)(getValue(box.getXMax()))%2==0 )&& \
|
|
||||||
( (long)(getValue(box.getYMin()))%2==0 )&& \
|
|
||||||
( (long)(getValue(box.getYMax()))%2==0 )
|
|
||||||
|
|
||||||
|
|
||||||
namespace Hurricane {
|
namespace Hurricane {
|
||||||
|
|
||||||
class GenTrans {
|
class GenTrans {
|
||||||
|
|
|
@ -13,6 +13,53 @@
|
||||||
#include "AnalogicalCommons.h"
|
#include "AnalogicalCommons.h"
|
||||||
#include "GenTrans.h"
|
#include "GenTrans.h"
|
||||||
|
|
||||||
|
#define MAXLONG(a,b) (a>b?a:b)
|
||||||
|
#define MINLONG(a,b) (a>b?b:a)
|
||||||
|
|
||||||
|
#define SAVE_RECTANGLE(s, x, y, dx, dy) \
|
||||||
|
_mapString2Box[string(s)] = Box(getUnit(x), getUnit(y), getUnit(x+dx), getUnit(y+dy)); \
|
||||||
|
xmin = MINLONG(xmin, getUnit(x)); \
|
||||||
|
ymin = MINLONG(ymin, getUnit(y));
|
||||||
|
|
||||||
|
#define GET_RULE(s) \
|
||||||
|
dtraccess->getSingleRdsRuleByLabel(string(s))
|
||||||
|
|
||||||
|
#define BOX_IS_VALID(box) \
|
||||||
|
( (long)(getValue(box.getXMin()))%2==0 )&& \
|
||||||
|
( (long)(getValue(box.getXMax()))%2==0 )&& \
|
||||||
|
( (long)(getValue(box.getYMin()))%2==0 )&& \
|
||||||
|
( (long)(getValue(box.getYMax()))%2==0 )
|
||||||
|
|
||||||
|
#define CREATE_CONTACT_MATRIX_UNDER(underbox, nbcolumn, layer, net) \
|
||||||
|
\
|
||||||
|
if(underbox.getHeight()<rw_cont) \
|
||||||
|
nbcontact = 0; \
|
||||||
|
else \
|
||||||
|
nbcontact = (underbox.getHeight()-rw_cont)/(rw_cont + rd_cont) + 1 ;\
|
||||||
|
\
|
||||||
|
\
|
||||||
|
tmp_xcenter = underbox.getXMin() + (rw_cont/2); \
|
||||||
|
tmp_ycenter = underbox.getYMin() + (rw_cont/2); \
|
||||||
|
\
|
||||||
|
\
|
||||||
|
for(unsigned i=0; i<nbcolumn; i++) { \
|
||||||
|
\
|
||||||
|
for(unsigned j=0; j<nbcontact; j++) { \
|
||||||
|
Contact::create(net, layer \
|
||||||
|
, tmp_xcenter \
|
||||||
|
, tmp_ycenter \
|
||||||
|
, rw_cont \
|
||||||
|
, rw_cont \
|
||||||
|
); \
|
||||||
|
\
|
||||||
|
tmp_ycenter += (rw_cont + rd_cont); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
tmp_xcenter += (rw_cont + rd_cont); \
|
||||||
|
tmp_ycenter = underbox.getYMin() + (rw_cont/2); \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
namespace Hurricane {
|
namespace Hurricane {
|
||||||
|
|
||||||
|
@ -20,8 +67,8 @@ namespace Hurricane {
|
||||||
// ****************************************************************************************************
|
// ****************************************************************************************************
|
||||||
// Globals Datas
|
// Globals Datas
|
||||||
// ****************************************************************************************************
|
// ****************************************************************************************************
|
||||||
string segsforsource[] = {string("20"), string("23")};
|
string segsforsource[] = {string("20"), string("22")};
|
||||||
string segsfordrain[] = {string("40"), string("43")};
|
string segsfordrain[] = {string("40"), string("42")};
|
||||||
string segsforgrid[] = {string("00"), string("01"), string("30"), string("31")};
|
string segsforgrid[] = {string("00"), string("01"), string("30"), string("31")};
|
||||||
//string segsforgrid[] = {string("00"), string("30") };
|
//string segsforgrid[] = {string("00"), string("30") };
|
||||||
string segsforanonym[] = {string("10"), string("11"), string("12"), string("50")};
|
string segsforanonym[] = {string("10"), string("11"), string("12"), string("50")};
|
||||||
|
@ -109,44 +156,44 @@ void GenV1Trans::Calculate(Transistor* transistor)
|
||||||
// Begin Calculate.
|
// Begin Calculate.
|
||||||
|
|
||||||
//long re_imp_acti = GET_RULE_BYNP("RE_", mostype, "IMP_ACTI");
|
//long re_imp_acti = GET_RULE_BYNP("RE_", mostype, "IMP_ACTI");
|
||||||
long re_imp_acti = GET_RULE_BYNP("RE_", mostype, "IMP_ACTI");
|
long re_imp_acti = dtraccess->getSingleRdsRuleByLabel("RE_", mostype, "IMP_ACTI");
|
||||||
long re_imp_poly = GET_RULE_BYNP("RE_", mostype, "IMP_POLY");
|
long re_imp_poly = dtraccess->getSingleRdsRuleByLabel("RE_", mostype, "IMP_POLY");
|
||||||
long re_imp_cont = GET_RULE_BYNP("RE_", mostype, "IMP_CONT");
|
long re_imp_cont = dtraccess->getSingleRdsRuleByLabel("RE_", mostype, "IMP_CONT");
|
||||||
long re_imp_gate = GET_RULE_BYNP("RE_", mostype, "IMP_GATE");
|
long re_imp_gate = dtraccess->getSingleRdsRuleByLabel("RE_", mostype, "IMP_GATE");
|
||||||
//long re_well_acti = GET_RULE_BYNP("RE_", mostype, "WELL_ACTI");
|
//long re_well_acti = GET_RULE_BYNP("RE_", mostype, "WELL_ACTI");
|
||||||
|
|
||||||
// Calculate Rectangle 00
|
// Calculate Rectangle 00
|
||||||
// **********************
|
// **********************
|
||||||
x00 = 0;
|
x00 = 0;
|
||||||
y00 = -( GET_RULE("RE_GATE_ACTI") );
|
y00 = -dtraccess->getSingleRdsRuleByLabel("RE_GATE_ACTI");
|
||||||
|
|
||||||
dx00 = ConvertRealToRdsUnit(_masqueV1Info->getL());
|
dx00 = ConvertRealToRdsUnit(_masqueV1Info->getL());
|
||||||
realw = ConvertRealToRdsUnit(_masqueV1Info->getW());
|
realw = ConvertRealToRdsUnit(_masqueV1Info->getW());
|
||||||
|
|
||||||
dy00 = realw + 2*(-y00);
|
dy00 = realw + 2*(-y00);
|
||||||
|
|
||||||
SAVE_RECTANGLE("00", x00, y00, dx00, dy00)
|
SAVE_RECTANGLE("00", x00, y00, dx00, dy00);
|
||||||
|
|
||||||
|
|
||||||
// Calculate Rectangle 30
|
// Calculate Rectangle 30
|
||||||
// **********************
|
// **********************
|
||||||
|
|
||||||
// cout << "RD_ACTI_CONT is " << GET_RULE("RD_ACTI_CONT")<<endl;
|
// cout << "RD_ACTI_CONT is " << dtraccess->getSingleRdsRuleByLabel("RD_ACTI_CONT")<<endl;
|
||||||
// cout << "RD_ACTI_POLY is " << GET_RULE("RD_ACTI_POLY")<<endl;
|
// cout << "RD_ACTI_POLY is " << dtraccess->getSingleRdsRuleByLabel("RD_ACTI_POLY")<<endl;
|
||||||
// cout << "RE_POLY_CONT is " << GET_RULE("RE_POLY_CONT")<<endl;
|
// cout << "RE_POLY_CONT is " << dtraccess->getSingleRdsRuleByLabel("RE_POLY_CONT")<<endl;
|
||||||
// cout << "MAX RD_ACTI_POLY is " << (MAXLONG(GET_RULE("RD_ACTI_CONT"), GET_RULE("RD_ACTI_POLY") + GET_RULE("RE_POLY_CONT"))) <<endl;
|
// cout << "MAX RD_ACTI_POLY is " << (MAXLONG(dtraccess->getSingleRdsRuleByLabel("RD_ACTI_CONT"), GET_RULE("RD_ACTI_POLY") + GET_RULE("RE_POLY_CONT"))) <<endl;
|
||||||
//
|
//
|
||||||
|
|
||||||
dx31 = GET_RULE("RW_CONT") + 2*GET_RULE("RE_POLY_CONT");
|
dx31 = dtraccess->getSingleRdsRuleByLabel("RW_CONT") + 2*GET_RULE("RE_POLY_CONT");
|
||||||
if (dx31 >= dx00) {
|
if (dx31 >= dx00) {
|
||||||
dx30 = GET_RULE("RW_CONT");
|
dx30 = dtraccess->getSingleRdsRuleByLabel("RW_CONT");
|
||||||
dy30 = dx30;
|
dy30 = dx30;
|
||||||
y30 = 0 + realw + MAXLONG(GET_RULE("RD_ACTI_CONT"), GET_RULE("RD_ACTI_POLY") + GET_RULE("RE_POLY_CONT"));
|
y30 = 0 + realw + MAXLONG(dtraccess->getSingleRdsRuleByLabel("RD_ACTI_CONT"), GET_RULE("RD_ACTI_POLY") + GET_RULE("RE_POLY_CONT"));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
dx30 = dx00 - 2*GET_RULE("RE_POLY_CONT");
|
dx30 = dx00 - 2*dtraccess->getSingleRdsRuleByLabel("RE_POLY_CONT");
|
||||||
dy30 = GET_RULE("RW_CONT");
|
dy30 = dtraccess->getSingleRdsRuleByLabel("RW_CONT");
|
||||||
y30 = 0 + realw + GET_RULE("RD_ACTI_CONT");
|
y30 = 0 + realw + dtraccess->getSingleRdsRuleByLabel("RD_ACTI_CONT");
|
||||||
}
|
}
|
||||||
|
|
||||||
x30 = x00 + dx00/2 - dx30/2;
|
x30 = x00 + dx00/2 - dx30/2;
|
||||||
|
@ -156,10 +203,10 @@ void GenV1Trans::Calculate(Transistor* transistor)
|
||||||
|
|
||||||
// Calculate Rectangle 31
|
// Calculate Rectangle 31
|
||||||
// **********************
|
// **********************
|
||||||
dx31 = dx30 + 2*GET_RULE("RE_POLY_CONT");
|
dx31 = dx30 + 2*dtraccess->getSingleRdsRuleByLabel("RE_POLY_CONT");
|
||||||
dy31 = dy30 + 2*GET_RULE("RE_POLY_CONT");
|
dy31 = dy30 + 2*dtraccess->getSingleRdsRuleByLabel("RE_POLY_CONT");
|
||||||
x31 = x30 - GET_RULE("RE_POLY_CONT");
|
x31 = x30 - dtraccess->getSingleRdsRuleByLabel("RE_POLY_CONT");
|
||||||
y31 = y30 - GET_RULE("RE_POLY_CONT");
|
y31 = y30 - dtraccess->getSingleRdsRuleByLabel("RE_POLY_CONT");
|
||||||
|
|
||||||
SAVE_RECTANGLE("31", x31, y31, dx31, dy31)
|
SAVE_RECTANGLE("31", x31, y31, dx31, dy31)
|
||||||
|
|
||||||
|
@ -196,11 +243,11 @@ void GenV1Trans::Calculate(Transistor* transistor)
|
||||||
|
|
||||||
// Calculate Rectangle 20
|
// Calculate Rectangle 20
|
||||||
// **********************
|
// **********************
|
||||||
y20 = 0 + GET_RULE("RE_ACTI_CONT");
|
y20 = 0 + dtraccess->getSingleRdsRuleByLabel("RE_ACTI_CONT");
|
||||||
dy20 = realw - 2 * GET_RULE("RE_ACTI_CONT");
|
dy20 = realw - 2 * dtraccess->getSingleRdsRuleByLabel("RE_ACTI_CONT");
|
||||||
dx20 = (_masqueV1Info->getNbSourceColumn()) * GET_RULE("RW_CONT") +
|
dx20 = (_masqueV1Info->getNbSourceColumn()) * dtraccess->getSingleRdsRuleByLabel("RW_CONT") +
|
||||||
((_masqueV1Info->getNbSourceColumn()) - 1) * GET_RULE("RD_CONT");
|
((_masqueV1Info->getNbSourceColumn()) - 1) * dtraccess->getSingleRdsRuleByLabel("RD_CONT");
|
||||||
x20 = 0 - ( dx20 + GET_RULE("RD_CONT_GATE") );
|
x20 = 0 - ( dx20 + dtraccess->getSingleRdsRuleByLabel("RD_CONT_GATE") );
|
||||||
|
|
||||||
SAVE_RECTANGLE("20", x20, y20, dx20, dy20)
|
SAVE_RECTANGLE("20", x20, y20, dx20, dy20)
|
||||||
|
|
||||||
|
@ -208,9 +255,9 @@ void GenV1Trans::Calculate(Transistor* transistor)
|
||||||
// Calculate Rectangle 40
|
// Calculate Rectangle 40
|
||||||
// **********************
|
// **********************
|
||||||
y40 = y20;
|
y40 = y20;
|
||||||
x40 = x00 + dx00 + GET_RULE("RD_CONT_GATE");
|
x40 = x00 + dx00 + dtraccess->getSingleRdsRuleByLabel("RD_CONT_GATE");
|
||||||
dx40 = (_masqueV1Info->getNbDrainColumn()) * GET_RULE("RW_CONT") +
|
dx40 = (_masqueV1Info->getNbDrainColumn()) * dtraccess->getSingleRdsRuleByLabel("RW_CONT") +
|
||||||
((_masqueV1Info->getNbDrainColumn()) - 1) * GET_RULE("RD_CONT");
|
((_masqueV1Info->getNbDrainColumn()) - 1) * dtraccess->getSingleRdsRuleByLabel("RD_CONT");
|
||||||
dy40 = dy20;
|
dy40 = dy20;
|
||||||
|
|
||||||
SAVE_RECTANGLE("40", x40, y40, dx40, dy40)
|
SAVE_RECTANGLE("40", x40, y40, dx40, dy40)
|
||||||
|
@ -218,10 +265,10 @@ void GenV1Trans::Calculate(Transistor* transistor)
|
||||||
// Calculate Rectangle 10
|
// Calculate Rectangle 10
|
||||||
// **********************
|
// **********************
|
||||||
y10 = 0;
|
y10 = 0;
|
||||||
x10 = MINLONG(x20 - GET_RULE("RE_ACTI_CONT"), 0 - GET_RULE("RE_ACTI_GATE"));
|
x10 = MINLONG(x20 - dtraccess->getSingleRdsRuleByLabel("RE_ACTI_CONT"), 0 - GET_RULE("RE_ACTI_GATE"));
|
||||||
dy10 = realw;
|
dy10 = realw;
|
||||||
|
|
||||||
extension1 = MAXLONG(0 + x40 + dx40 + GET_RULE("RE_ACTI_CONT"), dx00 + GET_RULE("RE_ACTI_GATE"));
|
extension1 = MAXLONG(0 + x40 + dx40 + dtraccess->getSingleRdsRuleByLabel("RE_ACTI_CONT"), dx00 + GET_RULE("RE_ACTI_GATE"));
|
||||||
|
|
||||||
dx10 = 0 - x10 + extension1;
|
dx10 = 0 - x10 + extension1;
|
||||||
|
|
||||||
|
@ -278,10 +325,10 @@ void GenV1Trans::Calculate(Transistor* transistor)
|
||||||
// Calculate Rectangle 50 just for PMOS.
|
// Calculate Rectangle 50 just for PMOS.
|
||||||
// -------------------------------------------------------------
|
// -------------------------------------------------------------
|
||||||
if (transistor->isPmos()) { // Calculate Rectangle 50 for PMos.
|
if (transistor->isPmos()) { // Calculate Rectangle 50 for PMos.
|
||||||
x50 = x10 - GET_RULE("RE_NWELL_ACTI");
|
x50 = x10 - dtraccess->getSingleRdsRuleByLabel("RE_NWELL_ACTI");
|
||||||
y50 = y10 - GET_RULE("RE_NWELL_ACTI");
|
y50 = y10 - dtraccess->getSingleRdsRuleByLabel("RE_NWELL_ACTI");
|
||||||
dx50 = dx10 + 2 * GET_RULE("RE_NWELL_ACTI");
|
dx50 = dx10 + 2 * dtraccess->getSingleRdsRuleByLabel("RE_NWELL_ACTI");
|
||||||
dy50 = dy10 + 2 * GET_RULE("RE_NWELL_ACTI");
|
dy50 = dy10 + 2 * dtraccess->getSingleRdsRuleByLabel("RE_NWELL_ACTI");
|
||||||
|
|
||||||
SAVE_RECTANGLE("50", x50, y50, dx50, dy50);
|
SAVE_RECTANGLE("50", x50, y50, dx50, dy50);
|
||||||
}
|
}
|
||||||
|
@ -327,8 +374,8 @@ void GenV1Trans::Generate(Transistor* transistor)
|
||||||
else
|
else
|
||||||
mostype='P';
|
mostype='P';
|
||||||
|
|
||||||
long rw_cont = getUnit(GET_RULE("RW_CONT"));
|
long rw_cont = getUnit(dtraccess->getSingleRdsRuleByLabel("RW_CONT"));
|
||||||
long rd_cont = getUnit(GET_RULE("RD_CONT"));
|
long rd_cont = getUnit(dtraccess->getSingleRdsRuleByLabel("RD_CONT"));
|
||||||
unsigned nbcontact = 0;
|
unsigned nbcontact = 0;
|
||||||
long tmp_xcenter = 0;
|
long tmp_xcenter = 0;
|
||||||
long tmp_ycenter = 0;
|
long tmp_ycenter = 0;
|
||||||
|
@ -339,9 +386,9 @@ void GenV1Trans::Generate(Transistor* transistor)
|
||||||
|
|
||||||
//Technology * tech = db->getTechnology();
|
//Technology * tech = db->getTechnology();
|
||||||
|
|
||||||
Layer * layer_20 = GET_LAYER_BYNP("TRANS_",mostype,"_LAYER_20");
|
Layer* layer_20 = dtraccess->getSingleLayerByLabel("M1TRANS_",mostype,"_LAYER_20");
|
||||||
Layer * layer_30 = GET_LAYER_BYNP("TRANS_",mostype,"_LAYER_30");
|
Layer* layer_30 = dtraccess->getSingleLayerByLabel("M1TRANS_",mostype,"_LAYER_30");
|
||||||
Layer * layer_40 = GET_LAYER_BYNP("TRANS_",mostype,"_LAYER_40");
|
Layer* layer_40 = dtraccess->getSingleLayerByLabel("M1TRANS_",mostype,"_LAYER_40");
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------------------------
|
// -------------------------------------------------------------
|
||||||
|
@ -356,18 +403,18 @@ END_IF
|
||||||
for(size_t i=0; i<sizeof(segsforsource)/sizeof(string); i++) {
|
for(size_t i=0; i<sizeof(segsforsource)/sizeof(string); i++) {
|
||||||
|
|
||||||
if(segsforsource[i]=="20") {
|
if(segsforsource[i]=="20") {
|
||||||
//cout << " Begin create contact for source , Under Box is " << getString(GET_BOX(segsforsource[i])) <<endl;
|
//cout << " Begin create contact for source , Under Box is " << getString(_mapString2Box[segsforsource[i])) <<endl;
|
||||||
Box underbox = GET_BOX(segsforsource[i]);
|
Box underbox = _mapString2Box[segsforsource[i]];
|
||||||
CREATE_CONTACT_MATRIX_UNDER(underbox, transistor->getNbSourceColumn(), layer_20, source)
|
CREATE_CONTACT_MATRIX_UNDER(underbox, transistor->getNbSourceColumn(), layer_20, source)
|
||||||
//cout << " Finish create contact for source " <<endl;
|
//cout << " Finish create contact for source " <<endl;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Contact::create(source, GET_LAYER_BYNP("TRANS_",mostype,"_LAYER_"+segsforsource[i])
|
// Contact::create(source, dtraccess->getSingleLayerByLabel("M1TRANS_",mostype,"_LAYER_"+segsforsource[i])
|
||||||
, GET_BOX(segsforsource[i]).getXCenter()
|
// , _mapString2Box[segsforsource[i]].getXCenter()
|
||||||
, GET_BOX(segsforsource[i]).getYCenter()
|
// , _mapString2Box[segsforsource[i]].getYCenter()
|
||||||
, GET_BOX(segsforsource[i]).getWidth()
|
// , _mapString2Box[segsforsource[i]].getWidth()
|
||||||
, GET_BOX(segsforsource[i]).getHeight()
|
// , _mapString2Box[segsforsource[i]].getHeight()
|
||||||
);
|
// );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -383,32 +430,32 @@ IF_DEBUG_HUR_ANALOG
|
||||||
END_IF
|
END_IF
|
||||||
for(size_t i=0; i<sizeof(segsforgrid)/sizeof(string); i++) {
|
for(size_t i=0; i<sizeof(segsforgrid)/sizeof(string); i++) {
|
||||||
if(segsforgrid[i]=="30"){
|
if(segsforgrid[i]=="30"){
|
||||||
if( GET_BOX(segsforgrid[i]).getWidth()==GET_RULE("RW_CONT") ) {
|
if( _mapString2Box[segsforgrid[i]].getWidth()==dtraccess->getSingleRdsRuleByLabel("RW_CONT") ) {
|
||||||
Contact::create(grid, GET_LAYER_BYNP("TRANS_",mostype,"_LAYER_"+segsforgrid[i])
|
Contact::create(grid, dtraccess->getSingleLayerByLabel("M1TRANS_",mostype,"_LAYER_"+segsforgrid[i])
|
||||||
, GET_BOX(segsforgrid[i]).getXCenter()
|
, _mapString2Box[segsforgrid[i]].getXCenter()
|
||||||
, GET_BOX(segsforgrid[i]).getYCenter()
|
, _mapString2Box[segsforgrid[i]].getYCenter()
|
||||||
, GET_BOX(segsforgrid[i]).getWidth()
|
, _mapString2Box[segsforgrid[i]].getWidth()
|
||||||
, GET_BOX(segsforgrid[i]).getHeight()
|
, _mapString2Box[segsforgrid[i]].getHeight()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
unsigned int nbcolumn = (GET_BOX(segsforgrid[i]).getWidth()-rw_cont)/(rw_cont + rd_cont) + 1;
|
unsigned int nbcolumn = (_mapString2Box[segsforgrid[i]].getWidth()-rw_cont)/(rw_cont + rd_cont) + 1;
|
||||||
|
|
||||||
IF_DEBUG_HUR_ANALOG
|
IF_DEBUG_HUR_ANALOG
|
||||||
cout << "nbcolumn in rectangle 30 is " << nbcolumn <<endl;
|
cout << "nbcolumn in rectangle 30 is " << nbcolumn <<endl;
|
||||||
END_IF
|
END_IF
|
||||||
|
|
||||||
Box underbox = GET_BOX(segsforgrid[i]);
|
Box underbox = _mapString2Box[segsforgrid[i]];
|
||||||
CREATE_CONTACT_MATRIX_UNDER(underbox, nbcolumn, layer_30, grid)
|
CREATE_CONTACT_MATRIX_UNDER(underbox, nbcolumn, layer_30, grid)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if(GET_BOX(segsforgrid[i]).getXMin() < GET_BOX(segsforgrid[i]).getXMax()) {
|
if(_mapString2Box[segsforgrid[i]].getXMin() < _mapString2Box[segsforgrid[i]].getXMax()) {
|
||||||
Contact::create(grid, GET_LAYER_BYNP("TRANS_",mostype,"_LAYER_"+segsforgrid[i])
|
Contact::create(grid, dtraccess->getSingleLayerByLabel("M1TRANS_",mostype,"_LAYER_"+segsforgrid[i])
|
||||||
, GET_BOX(segsforgrid[i]).getXCenter()
|
, _mapString2Box[segsforgrid[i]].getXCenter()
|
||||||
, GET_BOX(segsforgrid[i]).getYCenter()
|
, _mapString2Box[segsforgrid[i]].getYCenter()
|
||||||
, GET_BOX(segsforgrid[i]).getWidth()
|
, _mapString2Box[segsforgrid[i]].getWidth()
|
||||||
, GET_BOX(segsforgrid[i]).getHeight()
|
, _mapString2Box[segsforgrid[i]].getHeight()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -428,17 +475,17 @@ END_IF
|
||||||
for(size_t i=0; i<sizeof(segsfordrain)/sizeof(string); i++) {
|
for(size_t i=0; i<sizeof(segsfordrain)/sizeof(string); i++) {
|
||||||
|
|
||||||
if(segsfordrain[i]=="40") {
|
if(segsfordrain[i]=="40") {
|
||||||
//cout << " Begin create contact for drain, Under Box is " << getString(GET_BOX(segsforsource[i])) <<endl;
|
//cout << " Begin create contact for drain, Under Box is " << getString(_mapString2Box[segsforsource[i])) <<endl;
|
||||||
Box underbox = GET_BOX(segsfordrain[i]);
|
Box underbox = _mapString2Box[segsfordrain[i]];
|
||||||
CREATE_CONTACT_MATRIX_UNDER(underbox, transistor->getNbDrainColumn(), layer_40, drain)
|
CREATE_CONTACT_MATRIX_UNDER(underbox, transistor->getNbDrainColumn(), layer_40, drain)
|
||||||
//cout << " Finish create contact for drain" <<endl;
|
//cout << " Finish create contact for drain" <<endl;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Contact::create(drain, GET_LAYER_BYNP("TRANS_",mostype,"_LAYER_"+segsfordrain[i])
|
Contact::create(drain, dtraccess->getSingleLayerByLabel("M1TRANS_",mostype,"_LAYER_"+segsfordrain[i])
|
||||||
, GET_BOX(segsfordrain[i]).getXCenter()
|
, _mapString2Box[segsfordrain[i]].getXCenter()
|
||||||
, GET_BOX(segsfordrain[i]).getYCenter()
|
, _mapString2Box[segsfordrain[i]].getYCenter()
|
||||||
, GET_BOX(segsfordrain[i]).getWidth()
|
, _mapString2Box[segsfordrain[i]].getWidth()
|
||||||
, GET_BOX(segsfordrain[i]).getHeight()
|
, _mapString2Box[segsfordrain[i]].getHeight()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -457,11 +504,11 @@ END_IF
|
||||||
if(transistor->isNmos() && segsforanonym[i]=="50")
|
if(transistor->isNmos() && segsforanonym[i]=="50")
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
Contact::create(anonym, GET_LAYER_BYNP("TRANS_",mostype,"_LAYER_"+segsforanonym[i])
|
Contact::create(anonym, dtraccess->getSingleLayerByLabel("M1TRANS_",mostype,"_LAYER_"+segsforanonym[i])
|
||||||
, GET_BOX(segsforanonym[i]).getXCenter()
|
, _mapString2Box[segsforanonym[i]].getXCenter()
|
||||||
, GET_BOX(segsforanonym[i]).getYCenter()
|
, _mapString2Box[segsforanonym[i]].getYCenter()
|
||||||
, GET_BOX(segsforanonym[i]).getWidth()
|
, _mapString2Box[segsforanonym[i]].getWidth()
|
||||||
, GET_BOX(segsforanonym[i]).getHeight()
|
, _mapString2Box[segsforanonym[i]].getHeight()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -489,36 +536,36 @@ END_IF
|
||||||
switch(transistor->getAbutmentType().getCode()) {
|
switch(transistor->getAbutmentType().getCode()) {
|
||||||
|
|
||||||
case Transistor::Type::INTERNAL :
|
case Transistor::Type::INTERNAL :
|
||||||
transistor->setAbutmentBox( Box(GET_BOX(string("20")).getXCenter()
|
transistor->setAbutmentBox( Box(_mapString2Box[string("20")].getXCenter()
|
||||||
, transistor->getBoundingBox().getYMin()
|
, transistor->getBoundingBox().getYMin()
|
||||||
, GET_BOX(string("40")).getXCenter()
|
, _mapString2Box[string("40")].getXCenter()
|
||||||
, transistor->getBoundingBox().getYMax()
|
, transistor->getBoundingBox().getYMax()
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Transistor::Type::LEFT:
|
case Transistor::Type::LEFT:
|
||||||
transistor->setAbutmentBox( Box(GET_BOX(string("11")).getXMin()
|
transistor->setAbutmentBox( Box(_mapString2Box[string("11")].getXMin()
|
||||||
, transistor->getBoundingBox().getYMin()
|
, transistor->getBoundingBox().getYMin()
|
||||||
, GET_BOX(string("40")).getXCenter()
|
, _mapString2Box[string("40")].getXCenter()
|
||||||
, transistor->getBoundingBox().getYMax()
|
, transistor->getBoundingBox().getYMax()
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
break ;
|
break ;
|
||||||
|
|
||||||
case Transistor::Type::RIGHT:
|
case Transistor::Type::RIGHT:
|
||||||
transistor->setAbutmentBox( Box(GET_BOX(string("20")).getXCenter()
|
transistor->setAbutmentBox( Box(_mapString2Box[string("20")].getXCenter()
|
||||||
, transistor->getBoundingBox().getYMin()
|
, transistor->getBoundingBox().getYMin()
|
||||||
, GET_BOX(string("11")).getXMax()
|
, _mapString2Box[string("11")].getXMax()
|
||||||
, transistor->getBoundingBox().getYMax()
|
, transistor->getBoundingBox().getYMax()
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
break ;
|
break ;
|
||||||
|
|
||||||
case Transistor::Type::SINGLE:
|
case Transistor::Type::SINGLE:
|
||||||
transistor->setAbutmentBox( Box(GET_BOX(string("11")).getXMin()
|
transistor->setAbutmentBox( Box(_mapString2Box[string("11")].getXMin()
|
||||||
, transistor->getBoundingBox().getYMin()
|
, transistor->getBoundingBox().getYMin()
|
||||||
, GET_BOX(string("11")).getXMax()
|
, _mapString2Box[string("11")].getXMax()
|
||||||
, transistor->getBoundingBox().getYMax()
|
, transistor->getBoundingBox().getYMax()
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,462 +1 @@
|
||||||
// ****************************************************************************************************
|
|
||||||
// File: Transistor.h
|
|
||||||
// Authors: Wu YiFei
|
|
||||||
// Date : 21/12/2006
|
|
||||||
// ****************************************************************************************************
|
|
||||||
|
|
||||||
#include "Vertical.h"
|
|
||||||
#include "Horizontal.h"
|
|
||||||
#include "UpdateSession.h"
|
|
||||||
using namespace Hurricane;
|
|
||||||
|
|
||||||
#include "AnalogicalCommons.h"
|
|
||||||
#include "GenTrans.h"
|
|
||||||
|
|
||||||
#include "Transistor.h"
|
#include "Transistor.h"
|
||||||
|
|
||||||
namespace Hurricane {
|
|
||||||
|
|
||||||
// ****************************************************************************************************
|
|
||||||
// Transistor::Polarity implementation
|
|
||||||
// ****************************************************************************************************
|
|
||||||
|
|
||||||
Transistor::Polarity::Polarity(const Code& code) :_code(code)
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
Transistor::Polarity::Polarity(const Polarity& type) :_code(type._code)
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
Transistor::Polarity& Transistor::Polarity::operator=(const Polarity& type) {
|
|
||||||
_code = type._code;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
string Transistor::Polarity::_getString() const {
|
|
||||||
switch(_code) {
|
|
||||||
case N : return "N";
|
|
||||||
case P : return "P";
|
|
||||||
}
|
|
||||||
return "ABNORMAL";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Record* Transistor::Polarity::_getRecord() const
|
|
||||||
// *****************************************
|
|
||||||
{
|
|
||||||
Record* record = new Record(getString(this));
|
|
||||||
record->add(getSlot("Code", _code));
|
|
||||||
return record;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ****************************************************************************************************
|
|
||||||
// Transistor::MaskVersion implementation
|
|
||||||
// ****************************************************************************************************
|
|
||||||
Transistor::MaskVersion::MaskVersion(const Code& code)
|
|
||||||
// *******************************************************
|
|
||||||
:_code(code)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
Transistor::MaskVersion::MaskVersion(const MaskVersion& version)
|
|
||||||
// *******************************************************************
|
|
||||||
:_code(version._code)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Transistor::MaskVersion& Transistor::MaskVersion::operator=(const MaskVersion& version)
|
|
||||||
// ******************************************************************************************
|
|
||||||
{
|
|
||||||
_code = version._code;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
string Transistor::MaskVersion::_getString() const
|
|
||||||
// *************************************************
|
|
||||||
{
|
|
||||||
switch(_code) {
|
|
||||||
case VERSION1 : return "VERSION1";
|
|
||||||
}
|
|
||||||
return "ABNORMAL";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Record* Transistor::MaskVersion::_getRecord() const
|
|
||||||
// **************************************************
|
|
||||||
{
|
|
||||||
Record* record = new Record(getString(this));
|
|
||||||
record->add(getSlot("Code", _code));
|
|
||||||
return record;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ****************************************************************************************************
|
|
||||||
// Transistor::Type implementation
|
|
||||||
// ****************************************************************************************************
|
|
||||||
Transistor::Type::Type(const Code& code)
|
|
||||||
// *************************************
|
|
||||||
:_code(code)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Transistor::Type::Type(const Type& type)
|
|
||||||
// *************************************
|
|
||||||
:_code(type._code)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Transistor::Type& Transistor::Type::operator=(const Type& type)
|
|
||||||
// ************************************************************
|
|
||||||
{
|
|
||||||
_code = type._code;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
string Transistor::Type::_getString() const
|
|
||||||
// *****************************************
|
|
||||||
{
|
|
||||||
switch(_code) {
|
|
||||||
case INTERNAL : return "INTERNAL";
|
|
||||||
case LEFT : return "LEFT";
|
|
||||||
case RIGHT : return "RIGHT";
|
|
||||||
case SINGLE : return "SINGLE";
|
|
||||||
}
|
|
||||||
|
|
||||||
return "ABNORMAL";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Record* Transistor::Type::_getRecord() const
|
|
||||||
// *****************************************
|
|
||||||
{
|
|
||||||
Record* record = new Record(getString(this));
|
|
||||||
record->add(getSlot("Code", _code));
|
|
||||||
return record;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ****************************************************************************************************
|
|
||||||
// Transistor::MaskInfo implementation
|
|
||||||
// ****************************************************************************************************
|
|
||||||
Transistor::MaskInfo::MaskInfo(const double& l, const double& w, const Type::Code& type
|
|
||||||
, const unsigned& nbDrainColumn
|
|
||||||
, const unsigned& nbSourceColumn)
|
|
||||||
// ****************************************************************************************************
|
|
||||||
: _l(l)
|
|
||||||
, _w(w)
|
|
||||||
, _type(type)
|
|
||||||
, _nbDrainColumn(nbDrainColumn)
|
|
||||||
, _nbSourceColumn(nbSourceColumn)
|
|
||||||
{};
|
|
||||||
|
|
||||||
|
|
||||||
Transistor::MaskInfo& Transistor::MaskInfo::operator=(const MaskInfo& masqueinfo)
|
|
||||||
// ************************************************************************************
|
|
||||||
{
|
|
||||||
_l = masqueinfo.getL();
|
|
||||||
_w = masqueinfo.getW();
|
|
||||||
_type= masqueinfo.getType();
|
|
||||||
_nbDrainColumn = masqueinfo.getNbDrainColumn();
|
|
||||||
_nbSourceColumn = masqueinfo.getNbSourceColumn();
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool Transistor::MaskInfo::operator==(const MaskInfo& masqueinfo)
|
|
||||||
// ******************************************************************
|
|
||||||
{
|
|
||||||
if(_l == masqueinfo.getL() &&
|
|
||||||
_w == masqueinfo.getW() &&
|
|
||||||
_type== masqueinfo.getType() &&
|
|
||||||
_nbDrainColumn == masqueinfo.getNbDrainColumn() &&
|
|
||||||
_nbSourceColumn == masqueinfo.getNbSourceColumn()
|
|
||||||
)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
string Transistor::MaskInfo::_getString() const
|
|
||||||
// **********************************************
|
|
||||||
{
|
|
||||||
string s = "<" + _getTypeName() + " "
|
|
||||||
+ getString(_l) + " "
|
|
||||||
+ getString(_w) + " "
|
|
||||||
+ _type._getString() + " "
|
|
||||||
+ getString(_nbSourceColumn) + " "
|
|
||||||
+ getString(_nbDrainColumn)
|
|
||||||
+ ">";
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Record* Transistor::MaskInfo::_getRecord() const
|
|
||||||
// ***********************************************
|
|
||||||
{
|
|
||||||
Record * record = new Record(_getString());
|
|
||||||
return record;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ****************************************************************************************************
|
|
||||||
// Transistor::MaskV1Info implementation
|
|
||||||
// ****************************************************************************************************
|
|
||||||
Transistor::MaskV1Info::MaskV1Info(const double& l, const double& w, const Type::Code& type
|
|
||||||
, const unsigned& nbDrainColumn
|
|
||||||
, const unsigned& nbSourceColumn)
|
|
||||||
// ****************************************************************************************************
|
|
||||||
: Inherit(l
|
|
||||||
, w
|
|
||||||
, type
|
|
||||||
, nbDrainColumn
|
|
||||||
, nbSourceColumn
|
|
||||||
)
|
|
||||||
{}
|
|
||||||
|
|
||||||
Transistor::MaskInfo& Transistor::MaskV1Info::operator=(const MaskInfo& masqueinfo)
|
|
||||||
// **************************************************************************************
|
|
||||||
{
|
|
||||||
// (*(static_cast<Inherit*>(this)))=masqueinfo;
|
|
||||||
Inherit::operator=(masqueinfo);
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Transistor::MaskV1Info::operator == (const MaskInfo& masqueinfo)
|
|
||||||
// **********************************************************************
|
|
||||||
{
|
|
||||||
//return (*(static_cast<Inherit*>(this)))==masqueinfo;
|
|
||||||
return Inherit::operator==(masqueinfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
string Transistor::MaskV1Info::_getString() const
|
|
||||||
// ************************************************
|
|
||||||
{
|
|
||||||
string s = Inherit::_getString();
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
Record* Transistor::MaskV1Info::_getRecord() const
|
|
||||||
// *************************************************
|
|
||||||
{
|
|
||||||
Record* record = Inherit::_getRecord();
|
|
||||||
return record;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ****************************************************************************************************
|
|
||||||
// Transistor implementation
|
|
||||||
// ****************************************************************************************************
|
|
||||||
|
|
||||||
Transistor::Transistor(Library* library, const Name& name, const Polarity& polarity) :
|
|
||||||
Inherit(library, name),
|
|
||||||
_polarity(polarity),
|
|
||||||
_masqueInfo(NULL),
|
|
||||||
_genTrans(NULL)
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
Transistor* Transistor::create(Library* library, const Name& name, const Polarity& polarity) {
|
|
||||||
Transistor* transistor = new Transistor(library, name, polarity);
|
|
||||||
|
|
||||||
transistor->_postCreate();
|
|
||||||
|
|
||||||
return transistor;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Transistor::_preDestroy() {
|
|
||||||
// Delete aggregated objets.
|
|
||||||
// *************************
|
|
||||||
if(_masqueInfo)
|
|
||||||
delete _masqueInfo;
|
|
||||||
|
|
||||||
if(_genTrans)
|
|
||||||
delete _genTrans;
|
|
||||||
|
|
||||||
Inherit::_preDestroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Transistor::_postCreate()
|
|
||||||
// *******************************
|
|
||||||
{
|
|
||||||
Inherit::_postCreate();
|
|
||||||
|
|
||||||
(Net::create(this, Name("DRAIN")))->setExternal(true);
|
|
||||||
(Net::create(this, Name("SOURCE")))->setExternal(true);
|
|
||||||
(Net::create(this, Name("GRID")))->setExternal(true);
|
|
||||||
(Net::create(this, Name("BULK")))->setExternal(true);
|
|
||||||
|
|
||||||
// By default, transistor's length and heigth is NULL, and is internal.
|
|
||||||
// ********************************************************************
|
|
||||||
_masqueInfo = new MaskV1Info(0.0, 0.0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
string Transistor::_getString() const {
|
|
||||||
string s = Inherit::_getString();
|
|
||||||
s.insert(s.length()-1, " " + getString(_polarity));
|
|
||||||
s.insert(s.length()-1, " " + getAbutmentType()._getString());
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Record* Transistor::_getRecord() const {
|
|
||||||
Record* record = Inherit::_getRecord();
|
|
||||||
return record;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Transistor::MaskVersion Transistor::_getMaskInfoVersion(MaskInfo* masqueinfo)
|
|
||||||
// ***************************************************************************************
|
|
||||||
{
|
|
||||||
if(!masqueinfo)
|
|
||||||
throw Error("Error : In Transistor::_getMaskInfoVersion, param masqueinfo is NULL");
|
|
||||||
|
|
||||||
if(dynamic_cast<MaskV1Info*>(masqueinfo))
|
|
||||||
return MaskVersion(MaskVersion::VERSION1);
|
|
||||||
|
|
||||||
throw Error("Error : In Transistor::_getMaskInfoVersion, can't dynamic cast param masqueinfo");
|
|
||||||
return MaskVersion(MaskVersion::VERSION1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Transistor::MaskInfo* Transistor::_createMaskInfo(const MaskVersion& version)
|
|
||||||
// *******************************************************************************
|
|
||||||
{
|
|
||||||
switch((const MaskVersion::Code&)version) {
|
|
||||||
case MaskVersion::VERSION1 :
|
|
||||||
return new MaskV1Info(0.0, 0.0);
|
|
||||||
|
|
||||||
default :
|
|
||||||
throw Error ("Error : In Transistor::_createMaskInfoBy, unknown param version");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Transistor::setMaskInfo(MaskInfo* masqueinfo)
|
|
||||||
// ***************************************************
|
|
||||||
{
|
|
||||||
if(!masqueinfo)
|
|
||||||
throw Error("Error : In Transistor::createLayout : masqueinfo is NULL");
|
|
||||||
|
|
||||||
// Set new Param.
|
|
||||||
// ***************
|
|
||||||
MaskVersion newversion = _getMaskInfoVersion(masqueinfo);
|
|
||||||
MaskVersion oldversion = _getMaskInfoVersion(_masqueInfo);
|
|
||||||
|
|
||||||
if(newversion == oldversion) { // If they are the same version.
|
|
||||||
if((*_masqueInfo)==(*masqueinfo)) // If they are identical.
|
|
||||||
return;
|
|
||||||
else
|
|
||||||
(*_masqueInfo)=(*masqueinfo);
|
|
||||||
}
|
|
||||||
else { // If change the version.
|
|
||||||
delete _masqueInfo;
|
|
||||||
_masqueInfo = _createMaskInfo(newversion);
|
|
||||||
(*_masqueInfo) == (*masqueinfo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Transistor::createLayout()
|
|
||||||
// ****************************
|
|
||||||
{
|
|
||||||
MaskVersion version = _getMaskInfoVersion(_masqueInfo);
|
|
||||||
MaskV1Info* masquev1info = NULL;
|
|
||||||
|
|
||||||
// Select algorithme with technology and masque version.
|
|
||||||
// *****************************************************
|
|
||||||
switch((const MaskVersion::Code&)version) {
|
|
||||||
|
|
||||||
case MaskVersion::VERSION1 :
|
|
||||||
masquev1info = dynamic_cast<MaskV1Info*>(_masqueInfo);
|
|
||||||
_genTrans = new GenV1Trans(masquev1info);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default :
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
setTerminal(false);
|
|
||||||
|
|
||||||
// Launch the selected algorithme.
|
|
||||||
// ******************************
|
|
||||||
_genTrans->Calculate(this);
|
|
||||||
_genTrans->Generate(this);
|
|
||||||
|
|
||||||
materialize();
|
|
||||||
|
|
||||||
delete _genTrans;
|
|
||||||
_genTrans = NULL;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Transistor::duplicateLayout(Transistor* transistor)
|
|
||||||
// *****************************************************
|
|
||||||
{
|
|
||||||
UpdateSession::open();
|
|
||||||
|
|
||||||
setTerminal(false);
|
|
||||||
|
|
||||||
Net * tmp = NULL;
|
|
||||||
Contact * con = NULL;
|
|
||||||
Segment * seg = NULL;
|
|
||||||
|
|
||||||
for_each_net(net, transistor->getNets())
|
|
||||||
if( !( tmp=getNet(net->getName()) ) ) { //
|
|
||||||
tmp = Net::create(this, net->getName());
|
|
||||||
tmp->setExternal(net->isExternal());
|
|
||||||
}
|
|
||||||
|
|
||||||
for_each_component(component, net->getComponents())
|
|
||||||
if( (con=dynamic_cast<Contact*>(component)) ){
|
|
||||||
Contact::create(tmp, component->getLayer(), con->getX(), con->getY(), con->getWidth(), con->getHeight());
|
|
||||||
}
|
|
||||||
else if( (seg=dynamic_cast<Vertical*>(component)) ) {
|
|
||||||
Vertical::create(tmp, component->getLayer(), seg->getSourceX(), seg->getWidth(), seg->getSourceY(),
|
|
||||||
seg->getTargetY());
|
|
||||||
}
|
|
||||||
else if( (seg=dynamic_cast<Horizontal*>(component)) ){
|
|
||||||
Horizontal::create(tmp, component->getLayer(), seg->getSourceY(), seg->getWidth(), seg->getSourceX(),
|
|
||||||
seg->getTargetX());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
throw Error ("Error : In Transistor::DuplicateLayout, find illegal elem : " + getString(component) +
|
|
||||||
"In Transistor, all component must be contact or segment" ) ;
|
|
||||||
end_for
|
|
||||||
end_for
|
|
||||||
|
|
||||||
setAbutmentBox(transistor->getAbutmentBox());
|
|
||||||
|
|
||||||
_mapNet2Box.clear();
|
|
||||||
|
|
||||||
map<Net*, Box>::iterator i = transistor->_getMapNet2Box()->begin(),
|
|
||||||
j = transistor->_getMapNet2Box()->end();
|
|
||||||
|
|
||||||
while(i!=j) {
|
|
||||||
_mapNet2Box[getNet((*i).first->getName())]=(*i).second;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
materialize();
|
|
||||||
|
|
||||||
UpdateSession::close();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,462 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Transistor.h
|
||||||
|
// Authors: Wu YiFei
|
||||||
|
// Date : 21/12/2006
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#include "Vertical.h"
|
||||||
|
#include "Horizontal.h"
|
||||||
|
#include "UpdateSession.h"
|
||||||
|
using namespace Hurricane;
|
||||||
|
|
||||||
|
#include "AnalogicalCommons.h"
|
||||||
|
#include "GenTrans.h"
|
||||||
|
|
||||||
|
#include "Transistor.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Transistor::Polarity implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Transistor::Polarity::Polarity(const Code& code) :_code(code)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
Transistor::Polarity::Polarity(const Polarity& type) :_code(type._code)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
Transistor::Polarity& Transistor::Polarity::operator=(const Polarity& type) {
|
||||||
|
_code = type._code;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
string Transistor::Polarity::_getString() const {
|
||||||
|
switch(_code) {
|
||||||
|
case N : return "N";
|
||||||
|
case P : return "P";
|
||||||
|
}
|
||||||
|
return "ABNORMAL";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Record* Transistor::Polarity::_getRecord() const
|
||||||
|
// *****************************************
|
||||||
|
{
|
||||||
|
Record* record = new Record(getString(this));
|
||||||
|
record->add(getSlot("Code", _code));
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Transistor::MaskVersion implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
Transistor::MaskVersion::MaskVersion(const Code& code)
|
||||||
|
// *******************************************************
|
||||||
|
:_code(code)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Transistor::MaskVersion::MaskVersion(const MaskVersion& version)
|
||||||
|
// *******************************************************************
|
||||||
|
:_code(version._code)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Transistor::MaskVersion& Transistor::MaskVersion::operator=(const MaskVersion& version)
|
||||||
|
// ******************************************************************************************
|
||||||
|
{
|
||||||
|
_code = version._code;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
string Transistor::MaskVersion::_getString() const
|
||||||
|
// *************************************************
|
||||||
|
{
|
||||||
|
switch(_code) {
|
||||||
|
case VERSION1 : return "VERSION1";
|
||||||
|
}
|
||||||
|
return "ABNORMAL";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Record* Transistor::MaskVersion::_getRecord() const
|
||||||
|
// **************************************************
|
||||||
|
{
|
||||||
|
Record* record = new Record(getString(this));
|
||||||
|
record->add(getSlot("Code", _code));
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Transistor::Type implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
Transistor::Type::Type(const Code& code)
|
||||||
|
// *************************************
|
||||||
|
:_code(code)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Transistor::Type::Type(const Type& type)
|
||||||
|
// *************************************
|
||||||
|
:_code(type._code)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Transistor::Type& Transistor::Type::operator=(const Type& type)
|
||||||
|
// ************************************************************
|
||||||
|
{
|
||||||
|
_code = type._code;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
string Transistor::Type::_getString() const
|
||||||
|
// *****************************************
|
||||||
|
{
|
||||||
|
switch(_code) {
|
||||||
|
case INTERNAL : return "INTERNAL";
|
||||||
|
case LEFT : return "LEFT";
|
||||||
|
case RIGHT : return "RIGHT";
|
||||||
|
case SINGLE : return "SINGLE";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "ABNORMAL";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Record* Transistor::Type::_getRecord() const
|
||||||
|
// *****************************************
|
||||||
|
{
|
||||||
|
Record* record = new Record(getString(this));
|
||||||
|
record->add(getSlot("Code", _code));
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Transistor::MaskInfo implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
Transistor::MaskInfo::MaskInfo(const double& l, const double& w, const Type::Code& type
|
||||||
|
, const unsigned& nbDrainColumn
|
||||||
|
, const unsigned& nbSourceColumn)
|
||||||
|
// ****************************************************************************************************
|
||||||
|
: _l(l)
|
||||||
|
, _w(w)
|
||||||
|
, _type(type)
|
||||||
|
, _nbDrainColumn(nbDrainColumn)
|
||||||
|
, _nbSourceColumn(nbSourceColumn)
|
||||||
|
{};
|
||||||
|
|
||||||
|
|
||||||
|
Transistor::MaskInfo& Transistor::MaskInfo::operator=(const MaskInfo& masqueinfo)
|
||||||
|
// ************************************************************************************
|
||||||
|
{
|
||||||
|
_l = masqueinfo.getL();
|
||||||
|
_w = masqueinfo.getW();
|
||||||
|
_type= masqueinfo.getType();
|
||||||
|
_nbDrainColumn = masqueinfo.getNbDrainColumn();
|
||||||
|
_nbSourceColumn = masqueinfo.getNbSourceColumn();
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Transistor::MaskInfo::operator==(const MaskInfo& masqueinfo)
|
||||||
|
// ******************************************************************
|
||||||
|
{
|
||||||
|
if(_l == masqueinfo.getL() &&
|
||||||
|
_w == masqueinfo.getW() &&
|
||||||
|
_type== masqueinfo.getType() &&
|
||||||
|
_nbDrainColumn == masqueinfo.getNbDrainColumn() &&
|
||||||
|
_nbSourceColumn == masqueinfo.getNbSourceColumn()
|
||||||
|
)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
string Transistor::MaskInfo::_getString() const
|
||||||
|
// **********************************************
|
||||||
|
{
|
||||||
|
string s = "<" + _getTypeName() + " "
|
||||||
|
+ getString(_l) + " "
|
||||||
|
+ getString(_w) + " "
|
||||||
|
+ _type._getString() + " "
|
||||||
|
+ getString(_nbSourceColumn) + " "
|
||||||
|
+ getString(_nbDrainColumn)
|
||||||
|
+ ">";
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Record* Transistor::MaskInfo::_getRecord() const
|
||||||
|
// ***********************************************
|
||||||
|
{
|
||||||
|
Record * record = new Record(_getString());
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Transistor::MaskV1Info implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
Transistor::MaskV1Info::MaskV1Info(const double& l, const double& w, const Type::Code& type
|
||||||
|
, const unsigned& nbDrainColumn
|
||||||
|
, const unsigned& nbSourceColumn)
|
||||||
|
// ****************************************************************************************************
|
||||||
|
: Inherit(l
|
||||||
|
, w
|
||||||
|
, type
|
||||||
|
, nbDrainColumn
|
||||||
|
, nbSourceColumn
|
||||||
|
)
|
||||||
|
{}
|
||||||
|
|
||||||
|
Transistor::MaskInfo& Transistor::MaskV1Info::operator=(const MaskInfo& masqueinfo)
|
||||||
|
// **************************************************************************************
|
||||||
|
{
|
||||||
|
// (*(static_cast<Inherit*>(this)))=masqueinfo;
|
||||||
|
Inherit::operator=(masqueinfo);
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Transistor::MaskV1Info::operator == (const MaskInfo& masqueinfo)
|
||||||
|
// **********************************************************************
|
||||||
|
{
|
||||||
|
//return (*(static_cast<Inherit*>(this)))==masqueinfo;
|
||||||
|
return Inherit::operator==(masqueinfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
string Transistor::MaskV1Info::_getString() const
|
||||||
|
// ************************************************
|
||||||
|
{
|
||||||
|
string s = Inherit::_getString();
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
Record* Transistor::MaskV1Info::_getRecord() const
|
||||||
|
// *************************************************
|
||||||
|
{
|
||||||
|
Record* record = Inherit::_getRecord();
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Transistor implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Transistor::Transistor(Library* library, const Name& name, const Polarity& polarity) :
|
||||||
|
Inherit(library, name),
|
||||||
|
_polarity(polarity),
|
||||||
|
_masqueInfo(NULL),
|
||||||
|
_genTrans(NULL)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
Transistor* Transistor::create(Library* library, const Name& name, const Polarity& polarity) {
|
||||||
|
Transistor* transistor = new Transistor(library, name, polarity);
|
||||||
|
|
||||||
|
transistor->_postCreate();
|
||||||
|
|
||||||
|
return transistor;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void Transistor::_preDestroy() {
|
||||||
|
// Delete aggregated objets.
|
||||||
|
// *************************
|
||||||
|
if(_masqueInfo)
|
||||||
|
delete _masqueInfo;
|
||||||
|
|
||||||
|
if(_genTrans)
|
||||||
|
delete _genTrans;
|
||||||
|
|
||||||
|
Inherit::_preDestroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Transistor::_postCreate()
|
||||||
|
// *******************************
|
||||||
|
{
|
||||||
|
Inherit::_postCreate();
|
||||||
|
|
||||||
|
(Net::create(this, Name("DRAIN")))->setExternal(true);
|
||||||
|
(Net::create(this, Name("SOURCE")))->setExternal(true);
|
||||||
|
(Net::create(this, Name("GRID")))->setExternal(true);
|
||||||
|
(Net::create(this, Name("BULK")))->setExternal(true);
|
||||||
|
|
||||||
|
// By default, transistor's length and heigth is NULL, and is internal.
|
||||||
|
// ********************************************************************
|
||||||
|
_masqueInfo = new MaskV1Info(0.0, 0.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
string Transistor::_getString() const {
|
||||||
|
string s = Inherit::_getString();
|
||||||
|
s.insert(s.length()-1, " " + getString(_polarity));
|
||||||
|
s.insert(s.length()-1, " " + getAbutmentType()._getString());
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Record* Transistor::_getRecord() const {
|
||||||
|
Record* record = Inherit::_getRecord();
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Transistor::MaskVersion Transistor::_getMaskInfoVersion(MaskInfo* masqueinfo)
|
||||||
|
// ***************************************************************************************
|
||||||
|
{
|
||||||
|
if(!masqueinfo)
|
||||||
|
throw Error("Error : In Transistor::_getMaskInfoVersion, param masqueinfo is NULL");
|
||||||
|
|
||||||
|
if(dynamic_cast<MaskV1Info*>(masqueinfo))
|
||||||
|
return MaskVersion(MaskVersion::VERSION1);
|
||||||
|
|
||||||
|
throw Error("Error : In Transistor::_getMaskInfoVersion, can't dynamic cast param masqueinfo");
|
||||||
|
return MaskVersion(MaskVersion::VERSION1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Transistor::MaskInfo* Transistor::_createMaskInfo(const MaskVersion& version)
|
||||||
|
// *******************************************************************************
|
||||||
|
{
|
||||||
|
switch((const MaskVersion::Code&)version) {
|
||||||
|
case MaskVersion::VERSION1 :
|
||||||
|
return new MaskV1Info(0.0, 0.0);
|
||||||
|
|
||||||
|
default :
|
||||||
|
throw Error ("Error : In Transistor::_createMaskInfoBy, unknown param version");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Transistor::setMaskInfo(MaskInfo* masqueinfo)
|
||||||
|
// ***************************************************
|
||||||
|
{
|
||||||
|
if(!masqueinfo)
|
||||||
|
throw Error("Error : In Transistor::createLayout : masqueinfo is NULL");
|
||||||
|
|
||||||
|
// Set new Param.
|
||||||
|
// ***************
|
||||||
|
MaskVersion newversion = _getMaskInfoVersion(masqueinfo);
|
||||||
|
MaskVersion oldversion = _getMaskInfoVersion(_masqueInfo);
|
||||||
|
|
||||||
|
if(newversion == oldversion) { // If they are the same version.
|
||||||
|
if((*_masqueInfo)==(*masqueinfo)) // If they are identical.
|
||||||
|
return;
|
||||||
|
else
|
||||||
|
(*_masqueInfo)=(*masqueinfo);
|
||||||
|
}
|
||||||
|
else { // If change the version.
|
||||||
|
delete _masqueInfo;
|
||||||
|
_masqueInfo = _createMaskInfo(newversion);
|
||||||
|
(*_masqueInfo) == (*masqueinfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Transistor::createLayout()
|
||||||
|
// ****************************
|
||||||
|
{
|
||||||
|
MaskVersion version = _getMaskInfoVersion(_masqueInfo);
|
||||||
|
MaskV1Info* masquev1info = NULL;
|
||||||
|
|
||||||
|
// Select algorithme with technology and masque version.
|
||||||
|
// *****************************************************
|
||||||
|
switch((const MaskVersion::Code&)version) {
|
||||||
|
|
||||||
|
case MaskVersion::VERSION1 :
|
||||||
|
masquev1info = dynamic_cast<MaskV1Info*>(_masqueInfo);
|
||||||
|
_genTrans = new GenV1Trans(masquev1info);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default :
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
setTerminal(false);
|
||||||
|
|
||||||
|
// Launch the selected algorithme.
|
||||||
|
// ******************************
|
||||||
|
_genTrans->Calculate(this);
|
||||||
|
_genTrans->Generate(this);
|
||||||
|
|
||||||
|
materialize();
|
||||||
|
|
||||||
|
delete _genTrans;
|
||||||
|
_genTrans = NULL;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Transistor::duplicateLayout(Transistor* transistor)
|
||||||
|
// *****************************************************
|
||||||
|
{
|
||||||
|
UpdateSession::open();
|
||||||
|
|
||||||
|
setTerminal(false);
|
||||||
|
|
||||||
|
Net * tmp = NULL;
|
||||||
|
Contact * con = NULL;
|
||||||
|
Segment * seg = NULL;
|
||||||
|
|
||||||
|
for_each_net(net, transistor->getNets())
|
||||||
|
if( !( tmp=getNet(net->getName()) ) ) { //
|
||||||
|
tmp = Net::create(this, net->getName());
|
||||||
|
tmp->setExternal(net->isExternal());
|
||||||
|
}
|
||||||
|
|
||||||
|
for_each_component(component, net->getComponents())
|
||||||
|
if( (con=dynamic_cast<Contact*>(component)) ){
|
||||||
|
Contact::create(tmp, component->getLayer(), con->getX(), con->getY(), con->getWidth(), con->getHeight());
|
||||||
|
}
|
||||||
|
else if( (seg=dynamic_cast<Vertical*>(component)) ) {
|
||||||
|
Vertical::create(tmp, component->getLayer(), seg->getSourceX(), seg->getWidth(), seg->getSourceY(),
|
||||||
|
seg->getTargetY());
|
||||||
|
}
|
||||||
|
else if( (seg=dynamic_cast<Horizontal*>(component)) ){
|
||||||
|
Horizontal::create(tmp, component->getLayer(), seg->getSourceY(), seg->getWidth(), seg->getSourceX(),
|
||||||
|
seg->getTargetX());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
throw Error ("Error : In Transistor::DuplicateLayout, find illegal elem : " + getString(component) +
|
||||||
|
"In Transistor, all component must be contact or segment" ) ;
|
||||||
|
end_for
|
||||||
|
end_for
|
||||||
|
|
||||||
|
setAbutmentBox(transistor->getAbutmentBox());
|
||||||
|
|
||||||
|
_mapNet2Box.clear();
|
||||||
|
|
||||||
|
map<Net*, Box>::iterator i = transistor->_getMapNet2Box()->begin(),
|
||||||
|
j = transistor->_getMapNet2Box()->end();
|
||||||
|
|
||||||
|
while(i!=j) {
|
||||||
|
_mapNet2Box[getNet((*i).first->getName())]=(*i).second;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
materialize();
|
||||||
|
|
||||||
|
UpdateSession::close();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,378 +1,34 @@
|
||||||
// ****************************************************************************************************
|
#ifndef TRANSISTOR_H
|
||||||
// File: Transistor.h
|
#define TRANSISTOR_H
|
||||||
// Authors: Wu YiFei
|
|
||||||
// Date : 21/12/2006
|
|
||||||
// ****************************************************************************************************
|
|
||||||
|
|
||||||
#ifndef HURRICANE_TRANSISTOR
|
|
||||||
#define HURRICANE_TRANSISTOR
|
|
||||||
|
|
||||||
#include "Cell.h"
|
#include "Cell.h"
|
||||||
using namespace Hurricane;
|
using namespace Hurricane;
|
||||||
|
|
||||||
#include "Transistors.h"
|
|
||||||
|
|
||||||
namespace Hurricane {
|
namespace Hurricane {
|
||||||
|
|
||||||
class GenTrans;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Transistor : public Cell {
|
class Transistor : public Cell {
|
||||||
|
public:
|
||||||
|
enum Polarity {N=0, P=1};
|
||||||
|
enum AbutmentType { INTERNAL=0, LEFT=1, RIGHT=2, SINGLE=3};
|
||||||
|
|
||||||
//# if !defined(__DOXYGEN_PROCESSOR__)
|
static Transistor* create(Library* library, const Name& name, const Polarity& polarity);
|
||||||
|
void createLayout();
|
||||||
|
void duplicateLayout();
|
||||||
|
|
||||||
// Types
|
bool isNmos() const { return polarity == N; };
|
||||||
// *****
|
bool isPmos() const { return polarity == P; };
|
||||||
|
bool isInternal() const { return abutmentType == INTERNAL; };
|
||||||
|
bool isLeft() const { return abutmentType == LEFT; };
|
||||||
|
bool isRight() const { return abutmentType == RIGHT; };
|
||||||
|
bool isSingle() const { return abutmentType == SINGLE; };
|
||||||
|
|
||||||
public: typedef Cell Inherit;
|
private:
|
||||||
|
Polarity polarity;
|
||||||
public: class Polarity {
|
AbutmentType abutmentType;
|
||||||
public: enum Code {N=0, P=1};
|
double l;
|
||||||
|
double w;
|
||||||
private: Code _code;
|
|
||||||
|
|
||||||
public : Polarity(const Code& code=N);
|
|
||||||
public : Polarity(const Polarity&);
|
|
||||||
public : Polarity& operator=(const Polarity&);
|
|
||||||
|
|
||||||
public : operator const Code& () const { return _code; };
|
|
||||||
public : const Code& getCode() const { return _code; };
|
|
||||||
|
|
||||||
public : string _getTypeName() const { return _TName("Transistor::Polarity"); };
|
|
||||||
public : string _getString() const;
|
|
||||||
public : Record* _getRecord() const;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public : class MaskVersion {
|
|
||||||
public : enum Code { VERSION1=0 };
|
|
||||||
|
|
||||||
private: Code _code;
|
|
||||||
|
|
||||||
public : explicit MaskVersion(const Code& code=VERSION1);
|
|
||||||
public : MaskVersion(const MaskVersion&);
|
|
||||||
public : MaskVersion& operator=(const MaskVersion&);
|
|
||||||
|
|
||||||
public : operator const Code& () const { return _code; };
|
|
||||||
public : const Code& getCode() const { return _code; };
|
|
||||||
|
|
||||||
public : string _getTypeName() const { return _TName("Transistor::MaskVersion"); };
|
|
||||||
public : string _getString() const;
|
|
||||||
public : Record* _getRecord() const;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
public : class Type {
|
|
||||||
// *********
|
|
||||||
|
|
||||||
public : enum Code { INTERNAL=0, LEFT=1, RIGHT=2, SINGLE=3};
|
|
||||||
|
|
||||||
private: Code _code;
|
|
||||||
|
|
||||||
public : explicit Type(const Code& code=INTERNAL);
|
|
||||||
public : Type(const Type& type);
|
|
||||||
public : Type& operator=(const Type& type);
|
|
||||||
public : operator const Code&() const { return _code; };
|
|
||||||
|
|
||||||
public : void setCode(const Code& code) { _code = code; };
|
|
||||||
|
|
||||||
public : const Code& getCode() const { return _code; };
|
|
||||||
|
|
||||||
public : string _getTypeName() const { return _TName("Transistor::Type"); };
|
|
||||||
public : string _getString() const;
|
|
||||||
public : Record* _getRecord() const;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
public : class MaskInfo {
|
|
||||||
// ***************
|
|
||||||
|
|
||||||
// Attributs
|
|
||||||
// *********
|
|
||||||
private : double _l;
|
|
||||||
private : double _w ;
|
|
||||||
private : Type _type;
|
|
||||||
private : unsigned _nbDrainColumn;
|
|
||||||
private : unsigned _nbSourceColumn;
|
|
||||||
|
|
||||||
// Constructors
|
|
||||||
// ************
|
|
||||||
public : MaskInfo(const double& l, const double& w, const Type::Code& type=Type::INTERNAL
|
|
||||||
, const unsigned& nbDrainColumn=1
|
|
||||||
, const unsigned& nbSourceColumn=1);
|
|
||||||
|
|
||||||
public : virtual MaskInfo& operator=(const MaskInfo&);
|
|
||||||
|
|
||||||
private : MaskInfo(const MaskInfo& );
|
|
||||||
|
|
||||||
|
|
||||||
// Destructors
|
|
||||||
// ***********
|
|
||||||
public: virtual ~MaskInfo() {};
|
|
||||||
|
|
||||||
// Accessors
|
|
||||||
// *********
|
|
||||||
public : const double& getL() const { return _l; };
|
|
||||||
public : const double& getW() const { return _w; };
|
|
||||||
public : const unsigned & getNbDrainColumn() const { return _nbDrainColumn; };
|
|
||||||
public : const unsigned & getNbSourceColumn() const { return _nbSourceColumn; };
|
|
||||||
public : const Type& getType() const { return _type; };
|
|
||||||
|
|
||||||
// Update
|
|
||||||
// ******
|
|
||||||
public : void setL(const double& l) { _l=l;};
|
|
||||||
public : void setW(const double& w) { _w=w;};
|
|
||||||
public : void setNbDrainColumn(const unsigned& column) { _nbDrainColumn=column; };
|
|
||||||
public : void setNbSourceColumn(const unsigned& column) { _nbSourceColumn=column; };
|
|
||||||
public : void setType(const Type::Code& code) { _type.setCode(code); };
|
|
||||||
public : void setType(const Type& type) { _type = type; };
|
|
||||||
|
|
||||||
// Predicats
|
|
||||||
// *********
|
|
||||||
|
|
||||||
// Operators
|
|
||||||
// *********
|
|
||||||
public : virtual bool operator==(const MaskInfo&);
|
|
||||||
|
|
||||||
// Others
|
|
||||||
// ******
|
|
||||||
public : virtual string _getTypeName() const =0;
|
|
||||||
public : virtual string _getString() const;
|
|
||||||
public : virtual Record* _getRecord() const;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
public : class MaskV1Info : public MaskInfo {
|
|
||||||
// *************************************
|
|
||||||
|
|
||||||
// type
|
|
||||||
// *****
|
|
||||||
public : typedef MaskInfo Inherit ;
|
|
||||||
|
|
||||||
// Attributs
|
|
||||||
// *********
|
|
||||||
|
|
||||||
// Constructors
|
|
||||||
// ************
|
|
||||||
public: MaskV1Info(const double& l, const double& w, const Type::Code& type=Type::INTERNAL
|
|
||||||
, const unsigned& nbDrainColumn = 1
|
|
||||||
, const unsigned& nbSourceColumn = 1);
|
|
||||||
|
|
||||||
public : MaskInfo& operator=(const MaskInfo&);
|
|
||||||
|
|
||||||
|
|
||||||
// Destructor
|
|
||||||
// ***********
|
|
||||||
public : virtual ~MaskV1Info() {};
|
|
||||||
|
|
||||||
// Operators
|
|
||||||
// *********
|
|
||||||
public : bool operator==(const MaskInfo&);
|
|
||||||
|
|
||||||
// Others
|
|
||||||
// *********
|
|
||||||
public : virtual string _getTypeName() const { return _TName("Transistor::MaskV1Info"); };
|
|
||||||
public : virtual string _getString() const;
|
|
||||||
public : virtual Record* _getRecord() const;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
# if !defined(__DOXYGEN_PROCESSOR__)
|
|
||||||
|
|
||||||
// Attributes
|
|
||||||
// *******************
|
|
||||||
private : Polarity _polarity;
|
|
||||||
private : MaskInfo* _masqueInfo;
|
|
||||||
private : GenTrans * _genTrans;
|
|
||||||
//public : RealInfo * _realInfo;
|
|
||||||
|
|
||||||
private : map<Net*, Box> _mapNet2Box; // This Map Is For localize The Position Of Routing.
|
|
||||||
|
|
||||||
# endif
|
|
||||||
|
|
||||||
// Constructors
|
|
||||||
// ************
|
|
||||||
# if !defined(__DOXYGEN_PROCESSOR__)
|
|
||||||
protected : Transistor(Library* library, const Name& name, const Polarity& polarity);
|
|
||||||
# endif
|
|
||||||
|
|
||||||
public : static Transistor* create(Library* library, const Name& name, const Polarity& polarity);
|
|
||||||
|
|
||||||
# if !defined(__DOXYGEN_PROCESSOR__)
|
|
||||||
protected : virtual void _postCreate();
|
|
||||||
|
|
||||||
|
|
||||||
// Destructors
|
|
||||||
// ***********
|
|
||||||
protected : ~Transistor() {};
|
|
||||||
protected : virtual void _preDestroy();
|
|
||||||
# endif
|
|
||||||
|
|
||||||
// Accessors
|
|
||||||
// *********
|
|
||||||
public : const Polarity& getPolarity() const { return _polarity; };
|
|
||||||
public : MaskVersion getMaskVersion() const { return _getMaskInfoVersion(_masqueInfo); };
|
|
||||||
public : const MaskInfo* getMaskInfo() const { return _masqueInfo; };
|
|
||||||
public : const double getL() const { return _masqueInfo->getL(); };
|
|
||||||
public : const double getW() const { return _masqueInfo->getW(); };
|
|
||||||
public : const unsigned& getNbDrainColumn() const { return _masqueInfo->getNbDrainColumn(); };
|
|
||||||
public : const unsigned& getNbSourceColumn() const { return _masqueInfo->getNbSourceColumn(); };
|
|
||||||
public : const char* getDrainName() const { return "DRAIN"; };
|
|
||||||
public : const char* getSourceName() const { return "SOURCE"; };
|
|
||||||
public : const char* getGridName() const { return "GRID"; };
|
|
||||||
public : Net* getDrain() const { return getNet(getDrainName()); };
|
|
||||||
public : Net* getSource() const { return getNet(getSourceName()); };
|
|
||||||
public : Net* getGrid() const { return getNet(getGridName()); };
|
|
||||||
public : const Type& getAbutmentType() const { return _masqueInfo->getType(); };
|
|
||||||
|
|
||||||
// Predicats
|
|
||||||
// *********
|
|
||||||
public : bool isNmos() const { return _polarity==Polarity::N; };
|
|
||||||
public : bool isPmos() const { return _polarity==Polarity::P; };
|
|
||||||
public : bool isInternal() const { return getAbutmentType().getCode()==Type::INTERNAL; };
|
|
||||||
public : bool isLeft() const { return getAbutmentType().getCode()==Type::LEFT; };
|
|
||||||
public : bool isRight() const { return getAbutmentType().getCode()==Type::RIGHT; };
|
|
||||||
public : bool isSingle() const { return getAbutmentType().getCode()==Type::SINGLE; };
|
|
||||||
|
|
||||||
// Updators
|
|
||||||
// ********
|
|
||||||
public : void setL(const double& l) { _masqueInfo->setL(l); };
|
|
||||||
public : void setW(const double& w) { _masqueInfo->setW(w); };
|
|
||||||
|
|
||||||
//# endif
|
|
||||||
|
|
||||||
# if !defined(__DOXYGEN_PROCESSOR__)
|
|
||||||
// Others
|
|
||||||
// ******
|
|
||||||
public : virtual string _getTypeName() const {return _TName("Transistor");};
|
|
||||||
public : virtual string _getString() const;
|
|
||||||
public : virtual Record* _getRecord() const;
|
|
||||||
public : const GenTrans* _getGenTrans() const {return _genTrans; };
|
|
||||||
public : static MaskVersion _getMaskInfoVersion(MaskInfo*) ;
|
|
||||||
public : static MaskInfo* _createMaskInfo(const MaskVersion&) ;
|
|
||||||
public : map<Net*, Box>* _getMapNet2Box() { return &_mapNet2Box; };
|
|
||||||
|
|
||||||
# endif
|
|
||||||
|
|
||||||
// Operators
|
|
||||||
// *********
|
|
||||||
public : void setMaskInfo(MaskInfo*);
|
|
||||||
public : void createLayout();
|
|
||||||
public : void duplicateLayout(Transistor* transistor) ;
|
|
||||||
|
|
||||||
|
|
||||||
};
|
|
||||||
#if !defined(__DOXYGEN_PROCESSOR__)
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------
|
|
||||||
// Class : "Proxy...<const Transistor::Polarity::Code*>".
|
|
||||||
|
|
||||||
template<>
|
|
||||||
inline string ProxyTypeName<Transistor::Polarity::Code>
|
|
||||||
( const Transistor::Polarity::Code* object )
|
|
||||||
{ return "<PointerSlotAdapter<Transistor::Polarity::Code>>"; }
|
|
||||||
|
|
||||||
template<>
|
|
||||||
inline string ProxyString <Transistor::Polarity::Code>
|
|
||||||
( const Transistor::Polarity::Code* object )
|
|
||||||
{
|
|
||||||
switch ( *object ) {
|
|
||||||
case Transistor::Polarity::N: return "N";
|
|
||||||
case Transistor::Polarity::P: return "P";
|
|
||||||
}
|
|
||||||
return "ABNORMAL";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
#endif // TRANSISTOR_H
|
||||||
inline Record* ProxyRecord <Transistor::Polarity::Code>
|
|
||||||
( const Transistor::Polarity::Code* object )
|
|
||||||
{
|
|
||||||
Record* record = new Record(getString(object));
|
|
||||||
record->add(getSlot("Code", (unsigned int*)object));
|
|
||||||
return record;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------
|
|
||||||
// Class : "Proxy...<const Transistor::MaskVersion::Code*>".
|
|
||||||
|
|
||||||
template<>
|
|
||||||
inline string ProxyTypeName<Transistor::MaskVersion::Code>
|
|
||||||
( const Transistor::MaskVersion::Code* object )
|
|
||||||
{ return "<PointerSlotAdapter<Transistor::MaskVersion::Code>>"; }
|
|
||||||
|
|
||||||
template<>
|
|
||||||
inline string ProxyString <Transistor::MaskVersion::Code>
|
|
||||||
( const Transistor::MaskVersion::Code* object )
|
|
||||||
{
|
|
||||||
switch ( *object ) {
|
|
||||||
case Transistor::MaskVersion::VERSION1: return "VERSION1";
|
|
||||||
}
|
|
||||||
return "ABNORMAL";
|
|
||||||
}
|
|
||||||
|
|
||||||
template<>
|
|
||||||
inline Record* ProxyRecord <Transistor::MaskVersion::Code>
|
|
||||||
( const Transistor::MaskVersion::Code* object )
|
|
||||||
{
|
|
||||||
Record* record = new Record(getString(object));
|
|
||||||
record->add(getSlot("Code", (unsigned int*)object));
|
|
||||||
return record;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------
|
|
||||||
// Class : "Proxy...<const Transistor::Type::Code*>".
|
|
||||||
|
|
||||||
template<>
|
|
||||||
inline string ProxyTypeName<Transistor::Type::Code>
|
|
||||||
( const Transistor::Type::Code* object )
|
|
||||||
{ return "<PointerSlotAdapter<Transistor::Type::Code>>"; }
|
|
||||||
|
|
||||||
template<>
|
|
||||||
inline string ProxyString <Transistor::Type::Code>
|
|
||||||
( const Transistor::Type::Code* object )
|
|
||||||
{
|
|
||||||
switch ( *object ) {
|
|
||||||
case Transistor::Type::LEFT : return "LEFT";
|
|
||||||
case Transistor::Type::SINGLE: return "SINGLE";
|
|
||||||
case Transistor::Type::RIGHT: return "RIGHT";
|
|
||||||
case Transistor::Type::INTERNAL: return "INTERNAL";
|
|
||||||
}
|
|
||||||
return "ABNORMAL";
|
|
||||||
}
|
|
||||||
|
|
||||||
template<>
|
|
||||||
inline Record* ProxyRecord <Transistor::Type::Code>
|
|
||||||
( const Transistor::Type::Code* object )
|
|
||||||
{
|
|
||||||
Record* record = new Record(getString(object));
|
|
||||||
record->add(getSlot("Code", (unsigned int*)object));
|
|
||||||
return record;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// ****************************************************************************************************
|
|
||||||
// Generic functions
|
|
||||||
// ****************************************************************************************************
|
|
||||||
|
|
||||||
string getString(const Hurricane::Transistor::MaskInfo&);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif // HURRICANE_TRANSISTOR
|
|
||||||
|
|
|
@ -0,0 +1,378 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Transistor.h
|
||||||
|
// Authors: Wu YiFei
|
||||||
|
// Date : 21/12/2006
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_TRANSISTOR
|
||||||
|
#define HURRICANE_TRANSISTOR
|
||||||
|
|
||||||
|
#include "Cell.h"
|
||||||
|
using namespace Hurricane;
|
||||||
|
|
||||||
|
#include "Transistors.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
class GenTrans;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class Transistor : public Cell {
|
||||||
|
|
||||||
|
//# if !defined(__DOXYGEN_PROCESSOR__)
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
|
||||||
|
public: typedef Cell Inherit;
|
||||||
|
|
||||||
|
public: class Polarity {
|
||||||
|
public: enum Code {N=0, P=1};
|
||||||
|
|
||||||
|
private: Code _code;
|
||||||
|
|
||||||
|
public : Polarity(const Code& code=N);
|
||||||
|
public : Polarity(const Polarity&);
|
||||||
|
public : Polarity& operator=(const Polarity&);
|
||||||
|
|
||||||
|
public : operator const Code& () const { return _code; };
|
||||||
|
public : const Code& getCode() const { return _code; };
|
||||||
|
|
||||||
|
public : string _getTypeName() const { return _TName("Transistor::Polarity"); };
|
||||||
|
public : string _getString() const;
|
||||||
|
public : Record* _getRecord() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public : class MaskVersion {
|
||||||
|
public : enum Code { VERSION1=0 };
|
||||||
|
|
||||||
|
private: Code _code;
|
||||||
|
|
||||||
|
public : explicit MaskVersion(const Code& code=VERSION1);
|
||||||
|
public : MaskVersion(const MaskVersion&);
|
||||||
|
public : MaskVersion& operator=(const MaskVersion&);
|
||||||
|
|
||||||
|
public : operator const Code& () const { return _code; };
|
||||||
|
public : const Code& getCode() const { return _code; };
|
||||||
|
|
||||||
|
public : string _getTypeName() const { return _TName("Transistor::MaskVersion"); };
|
||||||
|
public : string _getString() const;
|
||||||
|
public : Record* _getRecord() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
public : class Type {
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public : enum Code { INTERNAL=0, LEFT=1, RIGHT=2, SINGLE=3};
|
||||||
|
|
||||||
|
private: Code _code;
|
||||||
|
|
||||||
|
public : explicit Type(const Code& code=INTERNAL);
|
||||||
|
public : Type(const Type& type);
|
||||||
|
public : Type& operator=(const Type& type);
|
||||||
|
public : operator const Code&() const { return _code; };
|
||||||
|
|
||||||
|
public : void setCode(const Code& code) { _code = code; };
|
||||||
|
|
||||||
|
public : const Code& getCode() const { return _code; };
|
||||||
|
|
||||||
|
public : string _getTypeName() const { return _TName("Transistor::Type"); };
|
||||||
|
public : string _getString() const;
|
||||||
|
public : Record* _getRecord() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
public : class MaskInfo {
|
||||||
|
// ***************
|
||||||
|
|
||||||
|
// Attributs
|
||||||
|
// *********
|
||||||
|
private : double _l;
|
||||||
|
private : double _w ;
|
||||||
|
private : Type _type;
|
||||||
|
private : unsigned _nbDrainColumn;
|
||||||
|
private : unsigned _nbSourceColumn;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
public : MaskInfo(const double& l, const double& w, const Type::Code& type=Type::INTERNAL
|
||||||
|
, const unsigned& nbDrainColumn=1
|
||||||
|
, const unsigned& nbSourceColumn=1);
|
||||||
|
|
||||||
|
public : virtual MaskInfo& operator=(const MaskInfo&);
|
||||||
|
|
||||||
|
private : MaskInfo(const MaskInfo& );
|
||||||
|
|
||||||
|
|
||||||
|
// Destructors
|
||||||
|
// ***********
|
||||||
|
public: virtual ~MaskInfo() {};
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
public : const double& getL() const { return _l; };
|
||||||
|
public : const double& getW() const { return _w; };
|
||||||
|
public : const unsigned & getNbDrainColumn() const { return _nbDrainColumn; };
|
||||||
|
public : const unsigned & getNbSourceColumn() const { return _nbSourceColumn; };
|
||||||
|
public : const Type& getType() const { return _type; };
|
||||||
|
|
||||||
|
// Update
|
||||||
|
// ******
|
||||||
|
public : void setL(const double& l) { _l=l;};
|
||||||
|
public : void setW(const double& w) { _w=w;};
|
||||||
|
public : void setNbDrainColumn(const unsigned& column) { _nbDrainColumn=column; };
|
||||||
|
public : void setNbSourceColumn(const unsigned& column) { _nbSourceColumn=column; };
|
||||||
|
public : void setType(const Type::Code& code) { _type.setCode(code); };
|
||||||
|
public : void setType(const Type& type) { _type = type; };
|
||||||
|
|
||||||
|
// Predicats
|
||||||
|
// *********
|
||||||
|
|
||||||
|
// Operators
|
||||||
|
// *********
|
||||||
|
public : virtual bool operator==(const MaskInfo&);
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
public : virtual string _getTypeName() const =0;
|
||||||
|
public : virtual string _getString() const;
|
||||||
|
public : virtual Record* _getRecord() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
public : class MaskV1Info : public MaskInfo {
|
||||||
|
// *************************************
|
||||||
|
|
||||||
|
// type
|
||||||
|
// *****
|
||||||
|
public : typedef MaskInfo Inherit ;
|
||||||
|
|
||||||
|
// Attributs
|
||||||
|
// *********
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
public: MaskV1Info(const double& l, const double& w, const Type::Code& type=Type::INTERNAL
|
||||||
|
, const unsigned& nbDrainColumn = 1
|
||||||
|
, const unsigned& nbSourceColumn = 1);
|
||||||
|
|
||||||
|
public : MaskInfo& operator=(const MaskInfo&);
|
||||||
|
|
||||||
|
|
||||||
|
// Destructor
|
||||||
|
// ***********
|
||||||
|
public : virtual ~MaskV1Info() {};
|
||||||
|
|
||||||
|
// Operators
|
||||||
|
// *********
|
||||||
|
public : bool operator==(const MaskInfo&);
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// *********
|
||||||
|
public : virtual string _getTypeName() const { return _TName("Transistor::MaskV1Info"); };
|
||||||
|
public : virtual string _getString() const;
|
||||||
|
public : virtual Record* _getRecord() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
# if !defined(__DOXYGEN_PROCESSOR__)
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// *******************
|
||||||
|
private : Polarity _polarity;
|
||||||
|
private : MaskInfo* _masqueInfo;
|
||||||
|
private : GenTrans * _genTrans;
|
||||||
|
//public : RealInfo * _realInfo;
|
||||||
|
|
||||||
|
private : map<Net*, Box> _mapNet2Box; // This Map Is For localize The Position Of Routing.
|
||||||
|
|
||||||
|
# endif
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
# if !defined(__DOXYGEN_PROCESSOR__)
|
||||||
|
protected : Transistor(Library* library, const Name& name, const Polarity& polarity);
|
||||||
|
# endif
|
||||||
|
|
||||||
|
public : static Transistor* create(Library* library, const Name& name, const Polarity& polarity);
|
||||||
|
|
||||||
|
# if !defined(__DOXYGEN_PROCESSOR__)
|
||||||
|
protected : virtual void _postCreate();
|
||||||
|
|
||||||
|
|
||||||
|
// Destructors
|
||||||
|
// ***********
|
||||||
|
protected : ~Transistor() {};
|
||||||
|
protected : virtual void _preDestroy();
|
||||||
|
# endif
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
public : const Polarity& getPolarity() const { return _polarity; };
|
||||||
|
public : MaskVersion getMaskVersion() const { return _getMaskInfoVersion(_masqueInfo); };
|
||||||
|
public : const MaskInfo* getMaskInfo() const { return _masqueInfo; };
|
||||||
|
public : const double getL() const { return _masqueInfo->getL(); };
|
||||||
|
public : const double getW() const { return _masqueInfo->getW(); };
|
||||||
|
public : const unsigned& getNbDrainColumn() const { return _masqueInfo->getNbDrainColumn(); };
|
||||||
|
public : const unsigned& getNbSourceColumn() const { return _masqueInfo->getNbSourceColumn(); };
|
||||||
|
public : const char* getDrainName() const { return "DRAIN"; };
|
||||||
|
public : const char* getSourceName() const { return "SOURCE"; };
|
||||||
|
public : const char* getGridName() const { return "GRID"; };
|
||||||
|
public : Net* getDrain() const { return getNet(getDrainName()); };
|
||||||
|
public : Net* getSource() const { return getNet(getSourceName()); };
|
||||||
|
public : Net* getGrid() const { return getNet(getGridName()); };
|
||||||
|
public : const Type& getAbutmentType() const { return _masqueInfo->getType(); };
|
||||||
|
|
||||||
|
// Predicats
|
||||||
|
// *********
|
||||||
|
public : bool isNmos() const { return _polarity==Polarity::N; };
|
||||||
|
public : bool isPmos() const { return _polarity==Polarity::P; };
|
||||||
|
public : bool isInternal() const { return getAbutmentType().getCode()==Type::INTERNAL; };
|
||||||
|
public : bool isLeft() const { return getAbutmentType().getCode()==Type::LEFT; };
|
||||||
|
public : bool isRight() const { return getAbutmentType().getCode()==Type::RIGHT; };
|
||||||
|
public : bool isSingle() const { return getAbutmentType().getCode()==Type::SINGLE; };
|
||||||
|
|
||||||
|
// Updators
|
||||||
|
// ********
|
||||||
|
public : void setL(const double& l) { _masqueInfo->setL(l); };
|
||||||
|
public : void setW(const double& w) { _masqueInfo->setW(w); };
|
||||||
|
|
||||||
|
//# endif
|
||||||
|
|
||||||
|
# if !defined(__DOXYGEN_PROCESSOR__)
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
public : virtual string _getTypeName() const {return _TName("Transistor");};
|
||||||
|
public : virtual string _getString() const;
|
||||||
|
public : virtual Record* _getRecord() const;
|
||||||
|
public : const GenTrans* _getGenTrans() const {return _genTrans; };
|
||||||
|
public : static MaskVersion _getMaskInfoVersion(MaskInfo*) ;
|
||||||
|
public : static MaskInfo* _createMaskInfo(const MaskVersion&) ;
|
||||||
|
public : map<Net*, Box>* _getMapNet2Box() { return &_mapNet2Box; };
|
||||||
|
|
||||||
|
# endif
|
||||||
|
|
||||||
|
// Operators
|
||||||
|
// *********
|
||||||
|
public : void setMaskInfo(MaskInfo*);
|
||||||
|
public : void createLayout();
|
||||||
|
public : void duplicateLayout(Transistor* transistor) ;
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
#if !defined(__DOXYGEN_PROCESSOR__)
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "Proxy...<const Transistor::Polarity::Code*>".
|
||||||
|
|
||||||
|
template<>
|
||||||
|
inline string ProxyTypeName<Transistor::Polarity::Code>
|
||||||
|
( const Transistor::Polarity::Code* object )
|
||||||
|
{ return "<PointerSlotAdapter<Transistor::Polarity::Code>>"; }
|
||||||
|
|
||||||
|
template<>
|
||||||
|
inline string ProxyString <Transistor::Polarity::Code>
|
||||||
|
( const Transistor::Polarity::Code* object )
|
||||||
|
{
|
||||||
|
switch ( *object ) {
|
||||||
|
case Transistor::Polarity::N: return "N";
|
||||||
|
case Transistor::Polarity::P: return "P";
|
||||||
|
}
|
||||||
|
return "ABNORMAL";
|
||||||
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
inline Record* ProxyRecord <Transistor::Polarity::Code>
|
||||||
|
( const Transistor::Polarity::Code* object )
|
||||||
|
{
|
||||||
|
Record* record = new Record(getString(object));
|
||||||
|
record->add(getSlot("Code", (unsigned int*)object));
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "Proxy...<const Transistor::MaskVersion::Code*>".
|
||||||
|
|
||||||
|
template<>
|
||||||
|
inline string ProxyTypeName<Transistor::MaskVersion::Code>
|
||||||
|
( const Transistor::MaskVersion::Code* object )
|
||||||
|
{ return "<PointerSlotAdapter<Transistor::MaskVersion::Code>>"; }
|
||||||
|
|
||||||
|
template<>
|
||||||
|
inline string ProxyString <Transistor::MaskVersion::Code>
|
||||||
|
( const Transistor::MaskVersion::Code* object )
|
||||||
|
{
|
||||||
|
switch ( *object ) {
|
||||||
|
case Transistor::MaskVersion::VERSION1: return "VERSION1";
|
||||||
|
}
|
||||||
|
return "ABNORMAL";
|
||||||
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
inline Record* ProxyRecord <Transistor::MaskVersion::Code>
|
||||||
|
( const Transistor::MaskVersion::Code* object )
|
||||||
|
{
|
||||||
|
Record* record = new Record(getString(object));
|
||||||
|
record->add(getSlot("Code", (unsigned int*)object));
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "Proxy...<const Transistor::Type::Code*>".
|
||||||
|
|
||||||
|
template<>
|
||||||
|
inline string ProxyTypeName<Transistor::Type::Code>
|
||||||
|
( const Transistor::Type::Code* object )
|
||||||
|
{ return "<PointerSlotAdapter<Transistor::Type::Code>>"; }
|
||||||
|
|
||||||
|
template<>
|
||||||
|
inline string ProxyString <Transistor::Type::Code>
|
||||||
|
( const Transistor::Type::Code* object )
|
||||||
|
{
|
||||||
|
switch ( *object ) {
|
||||||
|
case Transistor::Type::LEFT : return "LEFT";
|
||||||
|
case Transistor::Type::SINGLE: return "SINGLE";
|
||||||
|
case Transistor::Type::RIGHT: return "RIGHT";
|
||||||
|
case Transistor::Type::INTERNAL: return "INTERNAL";
|
||||||
|
}
|
||||||
|
return "ABNORMAL";
|
||||||
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
inline Record* ProxyRecord <Transistor::Type::Code>
|
||||||
|
( const Transistor::Type::Code* object )
|
||||||
|
{
|
||||||
|
Record* record = new Record(getString(object));
|
||||||
|
record->add(getSlot("Code", (unsigned int*)object));
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Generic functions
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
string getString(const Hurricane::Transistor::MaskInfo&);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif // HURRICANE_TRANSISTOR
|
|
@ -1,5 +1,5 @@
|
||||||
INCLUDE_DIRECTORIES(${HURRICANE_INCLUDE_DIR}
|
INCLUDE_DIRECTORIES(${CHAMSIN_SOURCE_DIR}/src/dtr ${CHAMSIN_SOURCE_DIR}/src/analogic
|
||||||
${CHAMSIN_SOURCE_DIR}/src/dtr ${CHAMSIN_SOURCE_DIR}/src/analogic)
|
${HURRICANE_INCLUDE_DIR})
|
||||||
|
|
||||||
ADD_LIBRARY(device SHARED Device.cpp TrMos.cpp TrMos_PlaceRoute.cpp)
|
ADD_LIBRARY(device SHARED Device.cpp TrMos.cpp TrMos_PlaceRoute.cpp)
|
||||||
|
|
||||||
|
|
|
@ -86,23 +86,6 @@ void Device::SaveLogicalView()
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
string Device::_getString() const
|
|
||||||
// ***************************************
|
|
||||||
{
|
|
||||||
string s= Inherit::_getString();
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
Record* Device::_getRecord() const
|
|
||||||
// *********************************
|
|
||||||
{
|
|
||||||
Record* record = Inherit::_getRecord();
|
|
||||||
return record;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Device::_Place(Instance* ins, const Transformation::Orientation& orientation, const Point& point)
|
void Device::_Place(Instance* ins, const Transformation::Orientation& orientation, const Point& point)
|
||||||
// **************************************************************************************************
|
// **************************************************************************************************
|
||||||
{
|
{
|
||||||
|
|
|
@ -5,35 +5,12 @@
|
||||||
// Date : 21/12/2006
|
// Date : 21/12/2006
|
||||||
// ****************************************************************************************************
|
// ****************************************************************************************************
|
||||||
|
|
||||||
#ifndef DEVICE_DEVICE
|
#ifndef DEVICE_H
|
||||||
#define DEVICE_DEVICE
|
#define DEVICE_H
|
||||||
|
|
||||||
|
|
||||||
#include "Cell.h"
|
#include "Cell.h"
|
||||||
using Hurricane::Cell;
|
using namespace Hurricane;
|
||||||
using Hurricane::_TName;
|
|
||||||
|
|
||||||
|
|
||||||
namespace Hurricane {
|
|
||||||
|
|
||||||
class Library;
|
|
||||||
class Name;
|
|
||||||
class Record;
|
|
||||||
class Point;
|
|
||||||
class Transformation;
|
|
||||||
class Instance;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
namespace DEVICE {
|
|
||||||
|
|
||||||
using Hurricane::Library;
|
|
||||||
using Hurricane::Name;
|
|
||||||
using Hurricane::Record;
|
|
||||||
using Hurricane::Point;
|
|
||||||
using Hurricane::Transformation;
|
|
||||||
using Hurricane::Instance;
|
|
||||||
|
|
||||||
class Device : public Cell {
|
class Device : public Cell {
|
||||||
|
|
||||||
|
@ -74,9 +51,6 @@ class Device : public Cell {
|
||||||
|
|
||||||
// Others
|
// Others
|
||||||
// ******
|
// ******
|
||||||
public: virtual string _getTypeName() const {return _TName("Device"); };
|
|
||||||
public: virtual string _getString() const;
|
|
||||||
public: virtual Record* _getRecord() const;
|
|
||||||
public : virtual void _Flush() = 0;
|
public : virtual void _Flush() = 0;
|
||||||
|
|
||||||
// Description of Layout
|
// Description of Layout
|
||||||
|
@ -90,8 +64,4 @@ class Device : public Cell {
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#endif // DEVICE_H
|
||||||
} // end namespace Device
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -4,8 +4,6 @@
|
||||||
// Date : 21/12/2006
|
// Date : 21/12/2006
|
||||||
// ****************************************************************************************************
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#include "Instance.h"
|
#include "Instance.h"
|
||||||
#include "MetaTransistor.h"
|
#include "MetaTransistor.h"
|
||||||
#include "Net.h"
|
#include "Net.h"
|
||||||
|
@ -27,8 +25,8 @@ namespace DEVICE {
|
||||||
// ****************************************************************************************************
|
// ****************************************************************************************************
|
||||||
|
|
||||||
TrMos::TrMos(Library* library, const Name& name):
|
TrMos::TrMos(Library* library, const Name& name):
|
||||||
Inherit(library, name),
|
Device(library, name),
|
||||||
_polarity(Transistor::Polarity::N),
|
_polarity(Transistor::N),
|
||||||
_isBsConnected(false),
|
_isBsConnected(false),
|
||||||
_m(1),
|
_m(1),
|
||||||
_sourceIsFirst(true),
|
_sourceIsFirst(true),
|
||||||
|
@ -70,12 +68,6 @@ void TrMos::_postCreate() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Transistors TrMos::getTransistors() const {
|
|
||||||
return getCollection(_transistorList);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void TrMos::create(const Transistor::Polarity& polarity, const bool isbsconnected)
|
void TrMos::create(const Transistor::Polarity& polarity, const bool isbsconnected)
|
||||||
{
|
{
|
||||||
if( _tr1 ) {
|
if( _tr1 ) {
|
||||||
|
|
|
@ -4,27 +4,19 @@
|
||||||
// Date : 21/12/2006
|
// Date : 21/12/2006
|
||||||
// ****************************************************************************************************
|
// ****************************************************************************************************
|
||||||
|
|
||||||
#ifndef DEVICE_TRMOS
|
#ifndef TRMOS_H
|
||||||
#define DEVICE_TRMOS
|
#define TRMOS_H
|
||||||
|
|
||||||
#include "Net.h"
|
#include "Net.h"
|
||||||
using namespace Hurricane;
|
using namespace Hurricane;
|
||||||
|
|
||||||
#include "Device.h"
|
|
||||||
#include "Transistor.h"
|
#include "Transistor.h"
|
||||||
#include "MetaTransistor.h"
|
|
||||||
|
|
||||||
|
//#include "MetaTransistor.h"
|
||||||
namespace DEVICE {
|
#include "Device.h"
|
||||||
|
|
||||||
|
|
||||||
class TrMos : public Device {
|
class TrMos : public Device {
|
||||||
// **************************
|
|
||||||
|
|
||||||
# if !defined(__DOXYGEN_PROCESSOR__)
|
|
||||||
// Types
|
|
||||||
// *****
|
|
||||||
public : typedef Device Inherit;
|
|
||||||
|
|
||||||
public : enum PinName { D, G, S, B };
|
public : enum PinName { D, G, S, B };
|
||||||
|
|
||||||
|
@ -68,18 +60,15 @@ class TrMos : public Device {
|
||||||
// ************
|
// ************
|
||||||
protected : TrMos(Library* library, const Name& name);
|
protected : TrMos(Library* library, const Name& name);
|
||||||
protected : virtual void _postCreate();
|
protected : virtual void _postCreate();
|
||||||
#endif
|
|
||||||
|
|
||||||
public : static TrMos* create(Library* library, const Name & name);
|
public : static TrMos* create(Library* library, const Name & name);
|
||||||
|
|
||||||
|
|
||||||
# if !defined(__DOXYGEN_PROCESSOR__)
|
|
||||||
|
|
||||||
// Operations
|
// Operations
|
||||||
// **********
|
// **********
|
||||||
public : virtual void dses() { /* to do */};
|
public : virtual void dses() { /* to do */};
|
||||||
public : virtual void shape() { /* to do */};
|
public : virtual void shape() { /* to do */};
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
public : void create(const Transistor::Polarity& polarity, const bool isbsconnected);
|
public : void create(const Transistor::Polarity& polarity, const bool isbsconnected);
|
||||||
|
@ -93,7 +82,6 @@ class TrMos : public Device {
|
||||||
public : const double getWidthOfSourceWire() const { return _widthOfSourceWire; };
|
public : const double getWidthOfSourceWire() const { return _widthOfSourceWire; };
|
||||||
public : const double getWidthOfDrainWire() const { return _widthOfDrainWire; };
|
public : const double getWidthOfDrainWire() const { return _widthOfDrainWire; };
|
||||||
public : MetaTransistor* getTr1() const { return _tr1; };
|
public : MetaTransistor* getTr1() const { return _tr1; };
|
||||||
public : Transistors getTransistors() const ;
|
|
||||||
|
|
||||||
// Updators
|
// Updators
|
||||||
// ********
|
// ********
|
||||||
|
@ -131,7 +119,4 @@ class TrMos : public Device {
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // end of namespace Device
|
#endif // TRMOS_H
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -4,12 +4,14 @@
|
||||||
// Date : 21/12/2006
|
// Date : 21/12/2006
|
||||||
// ****************************************************************************************************
|
// ****************************************************************************************************
|
||||||
|
|
||||||
#include "DtrAccess.h"
|
|
||||||
#include "RdsUnit.h"
|
|
||||||
#include "Error.h"
|
|
||||||
|
|
||||||
#include "DataBase.h"
|
#include "DataBase.h"
|
||||||
#include "Technology.h"
|
#include "Technology.h"
|
||||||
|
#include "BasicLayer.h"
|
||||||
|
#include "Error.h"
|
||||||
|
|
||||||
|
#include "RdsUnit.h"
|
||||||
|
#include "DtrAccess.h"
|
||||||
|
|
||||||
|
|
||||||
extern void ParseDtr(const char*, Hurricane::DtrAccess*);
|
extern void ParseDtr(const char*, Hurricane::DtrAccess*);
|
||||||
|
|
||||||
|
@ -86,12 +88,9 @@ void DtrAccess::_postCreate() {
|
||||||
while(m!=n) {
|
while(m!=n) {
|
||||||
Layer * layer = tech->getLayer(Name(*m));
|
Layer * layer = tech->getLayer(Name(*m));
|
||||||
if(!layer) {
|
if(!layer) {
|
||||||
for_each_layer(l, tech->getLayers()) {
|
layer = BasicLayer::create(tech, Name(*m), BasicLayer::Type::UNDEFINED, 100);
|
||||||
cerr << l << endl;
|
//throw Error("Error : in function DtrAccess::_postCreate , Can't find Layer "
|
||||||
end_for;
|
// + getString(*m) + " in technology file when parser DtrFile.");
|
||||||
}
|
|
||||||
throw Error("Error : in function DtrAccess::_postCreate , Can't find Layer "
|
|
||||||
+ getString(*m) + " in technology file when parser DtrFile.");
|
|
||||||
// cerr << Warning("In function DtrAccess::_postCreate , Can't find Layer "
|
// cerr << Warning("In function DtrAccess::_postCreate , Can't find Layer "
|
||||||
// + getString(*m) + " in technology file when parser DtrFile");
|
// + getString(*m) + " in technology file when parser DtrFile");
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,13 @@ int main() {
|
||||||
//Library* workLibrary = Library::create(db->getRootLibrary(), Name("WorkLibrary"));
|
//Library* workLibrary = Library::create(db->getRootLibrary(), Name("WorkLibrary"));
|
||||||
//TrMos* trmos = TrMos::create(workLibrary, Name("MosTr"));
|
//TrMos* trmos = TrMos::create(workLibrary, Name("MosTr"));
|
||||||
AEnv::create("toto");
|
AEnv::create("toto");
|
||||||
|
trmos->create(Transistor::Polarity::P, true);
|
||||||
|
|
||||||
|
trmos->setMosLength(3);
|
||||||
|
trmos->setMosWidth(3);
|
||||||
|
|
||||||
|
trmos->generate(5, true, false, 3, 3);
|
||||||
|
|
||||||
exit(0);
|
exit(0);
|
||||||
} catch (Hurricane::Warning& w) {
|
} catch (Hurricane::Warning& w) {
|
||||||
cerr << w.what() << endl;
|
cerr << w.what() << endl;
|
||||||
|
|
Loading…
Reference in New Issue