119 lines
4.0 KiB
C++
119 lines
4.0 KiB
C++
// -*- C++ -*-
|
|
//
|
|
// This file is part of the Coriolis Software.
|
|
// Copyright (c) UPMC 2009-2018, All Rights Reserved
|
|
//
|
|
// +-----------------------------------------------------------------+
|
|
// | C O R I O L I S |
|
|
// | H u r r i c a n e A n a l o g |
|
|
// | |
|
|
// | Authors : C. Alexandre, J.-M. Caba |
|
|
// | E-mail : Jean-Paul.Chaput@lip6.fr |
|
|
// | =============================================================== |
|
|
// | C++ Module : "./CommonGatePair.cpp" |
|
|
// +-----------------------------------------------------------------+
|
|
|
|
|
|
#include <string>
|
|
#include "hurricane/UpdateSession.h"
|
|
#include "hurricane/analog/CommonGatePair.h"
|
|
|
|
namespace Analog {
|
|
|
|
|
|
const Name CommonGatePair::_cgBulkConnectedName ("CommonGatePairBulkConnected");
|
|
const Name CommonGatePair::_cgBulkUnconnectedName ("CommonGatePairBulkUnconnected");
|
|
|
|
CommonGatePair::CommonGatePair ( Library* library, const Name& name, const Type& type )
|
|
: Super(library,name,type)
|
|
{ }
|
|
|
|
|
|
CommonGatePair* CommonGatePair::create ( Library* library
|
|
, const Name& name
|
|
, const Type& type
|
|
, bool bulkConnected )
|
|
{
|
|
Name deviceName = (bulkConnected) ? _cgBulkConnectedName : _cgBulkUnconnectedName;
|
|
preCreate(deviceName);
|
|
|
|
UpdateSession::open();
|
|
CommonGatePair* cg = new CommonGatePair(library,name,type);
|
|
cg->_postCreate (deviceName);
|
|
cg->createConnections(bulkConnected);
|
|
UpdateSession::close();
|
|
return cg;
|
|
}
|
|
|
|
|
|
void CommonGatePair::createConnections ( bool bulkConnected )
|
|
{
|
|
Net* s1 = Net::create(this, Name("S1"));
|
|
s1->setExternal(true);
|
|
|
|
Net* s2 = Net::create(this, Name("S2"));
|
|
s2->setExternal(true);
|
|
|
|
Net* d1 = Net::create(this, Name("D1"));
|
|
d1->setExternal(true);
|
|
|
|
Net* d2 = Net::create(this, Name("D2"));
|
|
d2->setExternal(true);
|
|
|
|
Net* g12 = Net::create(this, Name("G12"));
|
|
g12->setExternal(true);
|
|
|
|
_m1 = MetaTransistor::create(getSubDevicesLibrary(), Name("M1"));
|
|
Instance* m1Ins = Instance::create(this, Name("M1Instance"), _m1);
|
|
_m2 = MetaTransistor::create(getSubDevicesLibrary(), Name("M2"));
|
|
Instance* m2Ins = Instance::create(this, Name("M2Instance"), _m2);
|
|
|
|
setReferenceTransistor(_m1);
|
|
|
|
Plug* mt1SPlug = m1Ins->getPlug(_m1->getSource());
|
|
mt1SPlug->setNet(s1);
|
|
Plug* mt2SPlug = m2Ins->getPlug(_m2->getSource());
|
|
mt2SPlug->setNet(s2);
|
|
Plug* mt1DPlug = m1Ins->getPlug(_m1->getDrain());
|
|
mt1DPlug->setNet(d1);
|
|
Plug* mt2DPlug = m2Ins->getPlug(_m2->getDrain());
|
|
mt2DPlug->setNet(d2);
|
|
Plug* mt1GPlug = m1Ins->getPlug(_m1->getGate());
|
|
mt1GPlug->setNet(g12);
|
|
Plug* mt2GPlug = m2Ins->getPlug(_m2->getGate());
|
|
mt2GPlug->setNet(g12);
|
|
|
|
if (not bulkConnected) {
|
|
Net* b = Net::create(this, Name("B"));
|
|
b->setExternal(true);
|
|
Plug* mt1BPlug = m1Ins->getPlug(_m1->getBulk());
|
|
mt1BPlug->setNet(b);
|
|
Plug* mt2BPlug = m2Ins->getPlug(_m2->getBulk());
|
|
mt2BPlug->setNet(b);
|
|
} else {
|
|
Plug* mt1BPlug = m1Ins->getPlug(_m1->getBulk());
|
|
mt1BPlug->setNet(s1);
|
|
Plug* mt2BPlug = m2Ins->getPlug(_m2->getBulk());
|
|
mt2BPlug->setNet(s2);
|
|
}
|
|
}
|
|
|
|
|
|
Name CommonGatePair::getDeviceName () const
|
|
{ return (isBulkConnected()) ? _cgBulkConnectedName : _cgBulkUnconnectedName; }
|
|
|
|
|
|
string CommonGatePair::_getTypeName () const
|
|
{ return "CommonGatePair"; }
|
|
|
|
|
|
Record* CommonGatePair::_getRecord () const
|
|
{
|
|
Record* record = Super::_getRecord();
|
|
record->add( getSlot("_cgBulkConnectedName" , _cgBulkConnectedName ) );
|
|
record->add( getSlot("_cgBulkUnconnectedName", _cgBulkUnconnectedName ) );
|
|
return record;
|
|
}
|
|
|
|
} // Analog namespace.
|