parent
b3ec92835f
commit
2d08ea4f63
|
@ -10,8 +10,6 @@ using namespace Hurricane;
|
|||
|
||||
namespace {
|
||||
|
||||
|
||||
|
||||
void createContactMatrix(Net* net, const Layer* layer, const Box& box, unsigned columns,
|
||||
const DbU::Unit& rwCont, const DbU::Unit& rdCont) {
|
||||
unsigned contacts = 0;
|
||||
|
@ -63,6 +61,17 @@ const Name Transistor::GridName("GRID");
|
|||
const Name Transistor::BulkName("BULK");
|
||||
const Name Transistor::AnonymousName("ANONYMOUS");
|
||||
|
||||
|
||||
string Transistor::Polarity::_getString() const {
|
||||
return getString(&_code);
|
||||
}
|
||||
|
||||
Record* Transistor::Polarity::_getRecord() const {
|
||||
Record* record = new Record(getString(this));
|
||||
record->add(getSlot("Code", &_code));
|
||||
return record;
|
||||
}
|
||||
|
||||
Transistor::Transistor(Library* library, const Name& name, const Polarity& polarity, DbU::Unit l, DbU::Unit w):
|
||||
Cell(library, name),
|
||||
_drain(NULL),
|
||||
|
@ -112,7 +121,7 @@ void Transistor::_postCreate() {
|
|||
_grid30 = createPad(technology, _grid, "cut0");
|
||||
_grid31 = createPad(technology, _grid, "metal1");
|
||||
_anonymous10 = createPad(technology, _anonymous, "active");
|
||||
if (_polarity == N) {
|
||||
if (_polarity == Polarity::N) {
|
||||
_anonymous11 = createPad(technology, _anonymous, "nImplant");
|
||||
_anonymous12 = createPad(technology, _anonymous, "nImplant");
|
||||
} else {
|
||||
|
@ -145,7 +154,7 @@ void Transistor::createLayout() {
|
|||
DbU::Unit enclosureImplantPoly = 0;
|
||||
DbU::Unit extImplantActive = 0;
|
||||
DbU::Unit extImplantCut0 = 0;
|
||||
if (_polarity == N) {
|
||||
if (_polarity == Polarity::N) {
|
||||
enclosureImplantPoly = atechno->getPhysicalRule("minEnclosure",
|
||||
getLayer(techno, "nImplant"), getLayer(techno, "poly"))->getValue();
|
||||
extImplantActive = atechno->getPhysicalRule("minExtension",
|
||||
|
@ -224,3 +233,29 @@ void Transistor::createLayout() {
|
|||
//setAbutmentBox(getAbutmentBox());
|
||||
UpdateSession::close();
|
||||
}
|
||||
|
||||
Record* Transistor::_getRecord() const {
|
||||
Record* record = Inherit::_getRecord();
|
||||
if (record) {
|
||||
record->add(getSlot("Drain", _drain));
|
||||
record->add(getSlot("Source", _source));
|
||||
record->add(getSlot("Grid", _grid));
|
||||
record->add(getSlot("Bulk", _bulk));
|
||||
record->add(getSlot("Polarity", &_polarity));
|
||||
record->add(getSlot("AbutmentType", &_abutmentType));
|
||||
record->add(getSlot("L", &_l));
|
||||
record->add(getSlot("W", &_w));
|
||||
record->add(getSlot("Source20", _source20));
|
||||
record->add(getSlot("Source22", _source22));
|
||||
record->add(getSlot("Drain40", _drain40));
|
||||
record->add(getSlot("Drain42", _drain42));
|
||||
record->add(getSlot("Grid00", _grid00));
|
||||
record->add(getSlot("Grid01", _grid01));
|
||||
record->add(getSlot("Grid30", _grid30));
|
||||
record->add(getSlot("Grid31", _grid31));
|
||||
record->add(getSlot("10", _anonymous10));
|
||||
record->add(getSlot("11", _anonymous11));
|
||||
record->add(getSlot("12", _anonymous12));
|
||||
}
|
||||
return record;
|
||||
}
|
||||
|
|
|
@ -9,12 +9,25 @@ namespace Hurricane {
|
|||
|
||||
class Transistor : public Cell {
|
||||
public:
|
||||
class Polarity {
|
||||
public:
|
||||
enum Code {N=0, P=1};
|
||||
|
||||
Polarity(const Code& code): _code(code) {}
|
||||
|
||||
operator const Code&() const { return _code; };
|
||||
string _getString() const;
|
||||
Record* _getRecord() const;
|
||||
private:
|
||||
Code _code;
|
||||
};
|
||||
|
||||
static const Name DrainName;
|
||||
static const Name SourceName;
|
||||
static const Name GridName;
|
||||
static const Name BulkName;
|
||||
static const Name AnonymousName;
|
||||
enum Polarity {N=0, P=1};
|
||||
|
||||
enum AbutmentType { INTERNAL=0, LEFT=1, RIGHT=2, SINGLE=3};
|
||||
|
||||
static Transistor* create(Library* library, const Name& name,
|
||||
|
@ -22,17 +35,19 @@ class Transistor : public Cell {
|
|||
DbU::Unit l, DbU::Unit w);
|
||||
void createLayout();
|
||||
|
||||
bool isNmos() const { return _polarity == N; };
|
||||
bool isPmos() const { return _polarity == P; };
|
||||
bool isNmos() const { return _polarity == Polarity::N; };
|
||||
bool isPmos() const { return _polarity == 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; };
|
||||
|
||||
virtual Record* _getRecord() const;
|
||||
|
||||
protected:
|
||||
void _postCreate();
|
||||
|
||||
private:
|
||||
|
||||
Net* _drain;
|
||||
Net* _source;
|
||||
Net* _grid;
|
||||
|
@ -54,4 +69,23 @@ class Transistor : public Cell {
|
|||
|
||||
}
|
||||
|
||||
template<> inline std::string getString<const Hurricane::Transistor::Polarity::Code*>
|
||||
(const Hurricane::Transistor::Polarity::Code* object ) {
|
||||
switch (*object) {
|
||||
case Hurricane::Transistor::Polarity::N: return "N";
|
||||
case Hurricane::Transistor::Polarity::P: return "P";
|
||||
default: return "ABNORMAL";
|
||||
}
|
||||
}
|
||||
|
||||
template<> inline Hurricane::Record* getRecord<const Hurricane::Transistor::Polarity::Code*>
|
||||
(const Hurricane::Transistor::Polarity::Code* object) {
|
||||
Hurricane::Record* record = new Hurricane::Record(getString(object));
|
||||
record->add(getSlot("Code", (unsigned int*)object));
|
||||
return record;
|
||||
}
|
||||
|
||||
INSPECTOR_P_SUPPORT(Hurricane::Transistor);
|
||||
INSPECTOR_P_SUPPORT(Hurricane::Transistor::Polarity);
|
||||
|
||||
#endif // TRANSISTOR_H
|
||||
|
|
|
@ -32,7 +32,7 @@ void readPhysicalRules(xmlNode* node, ATechnology* aTechnology) {
|
|||
if (ruleNameC && valueC && refC && layer1C && layer2C) {
|
||||
string ruleName((const char*)ruleNameC);
|
||||
double value = atof((const char*)valueC);
|
||||
DbU::Unit unitValue= DbU::real(value);
|
||||
DbU::Unit unitValue= DbU::grid(value);
|
||||
string reference((const char*)refC);
|
||||
Name layer1Name((const char*)layer1C);
|
||||
Name layer2Name((const char*)layer2C);
|
||||
|
@ -48,7 +48,7 @@ void readPhysicalRules(xmlNode* node, ATechnology* aTechnology) {
|
|||
if (ruleNameC && valueC && refC) {
|
||||
string ruleName((const char*)ruleNameC);
|
||||
double value = atof((const char*)valueC);
|
||||
DbU::Unit unitValue= DbU::real(value);
|
||||
DbU::Unit unitValue= DbU::grid(value);
|
||||
string reference((const char*)refC);
|
||||
if (layerC) {
|
||||
Name layerName((const char*)layerC);
|
||||
|
|
|
@ -36,7 +36,7 @@ int main(int argc, char* argv[]) {
|
|||
exit(56);
|
||||
}
|
||||
aTechnology->print();
|
||||
Transistor* trans = Transistor::create(userLibrary, Name("TEST"), Transistor::P, 10, 10);
|
||||
Transistor* trans = Transistor::create(userLibrary, Name("TEST"), Transistor::Polarity::P, 10, 10);
|
||||
trans->createLayout();
|
||||
CellViewer* viewer = new CellViewer ( trans );
|
||||
viewer->show();
|
||||
|
|
Loading…
Reference in New Issue