120 lines
3.6 KiB
C++
120 lines
3.6 KiB
C++
// -*- C++ -*-
|
|
//
|
|
// This file is part of the Coriolis Software.
|
|
// Copyright (c) UPMC 2011-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 : Damien Dupuis |
|
|
// | E-mail : Jean-Paul.Chaput@lip6.fr |
|
|
// | =============================================================== |
|
|
// | C++ Module : "./MultiCapacitor.cpp" |
|
|
// +-----------------------------------------------------------------+
|
|
|
|
|
|
#include "hurricane/UpdateSession.h"
|
|
#include "hurricane/analog/MetaCapacitor.h"
|
|
#include "hurricane/analog/MultiCapacitor.h"
|
|
|
|
namespace Analog {
|
|
|
|
using namespace Hurricane;
|
|
|
|
|
|
const Name MultiCapacitor::_capacitorName ("MultiCapacitor");
|
|
|
|
|
|
MultiCapacitor::MultiCapacitor ( Library* library
|
|
, const Name& name
|
|
, const CapacitorFamily::Type& type
|
|
, size_t count )
|
|
: Super(library, name, type)
|
|
, _metaCapacitor(NULL)
|
|
, _dummy (NULL)
|
|
, _count (count)
|
|
{ }
|
|
|
|
|
|
MultiCapacitor* MultiCapacitor::create ( Library* library
|
|
, const Name& name
|
|
, const CapacitorFamily::Type& type
|
|
, size_t count )
|
|
{
|
|
preCreate( _capacitorName );
|
|
UpdateSession::open();
|
|
MultiCapacitor* mc = new MultiCapacitor( library, name, type, count );
|
|
mc->_postCreate( _capacitorName );
|
|
mc->createConnections ();
|
|
mc->addMatrixParameter ( "matrix" );
|
|
mc->addCapacitiesParameter( "capacities", count );
|
|
|
|
UpdateSession::close();
|
|
|
|
return mc;
|
|
}
|
|
|
|
|
|
void MultiCapacitor::_postCreate ( const Name& deviceName )
|
|
{
|
|
Super::_postCreate( deviceName );
|
|
|
|
Choices dummyChoices;
|
|
dummyChoices << "";
|
|
_dummy = addMCheckBoxParameter( "dummy", dummyChoices );
|
|
}
|
|
|
|
|
|
void MultiCapacitor::createConnections ()
|
|
{
|
|
for ( size_t i=0 ; i<_count ; ++i ) {
|
|
string topPlateName = "t" + getString(i);
|
|
string botPlateName = "b" + getString(i);
|
|
string mcName = "c" + getString(i);
|
|
|
|
Net* topPlate = Net::create( this, topPlateName );
|
|
Net* botPlate = Net::create( this, botPlateName );
|
|
MetaCapacitor* mc = MetaCapacitor::create( getSubDevicesLibrary(), mcName );
|
|
Instance* mcInst = Instance::create( this, mcName, mc );
|
|
|
|
topPlate->setExternal( true );
|
|
botPlate->setExternal( true );
|
|
|
|
mcInst->getPlug( mc->getTopPlate() )->setNet( topPlate );
|
|
mcInst->getPlug( mc->getBotPlate() )->setNet( botPlate );
|
|
|
|
if (not _metaCapacitor) {
|
|
_metaCapacitor = mc;
|
|
setReferenceCapacitor( mc );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
unsigned int MultiCapacitor::getRestriction ( Net* net ) const
|
|
{
|
|
unsigned int ok = 0x1;
|
|
//unsigned int yes = 0x2;
|
|
|
|
unsigned int west = 0;
|
|
unsigned int east = 2;
|
|
//unsigned int south = 4;
|
|
//unsigned int north = 6;
|
|
unsigned int rule = 0;
|
|
|
|
rule |= (ok << east) | (ok << west);
|
|
return rule;
|
|
}
|
|
|
|
|
|
Name MultiCapacitor::getDeviceName () const
|
|
{ return _capacitorName; }
|
|
|
|
|
|
string MultiCapacitor::_getTypeName () const
|
|
{ return "MultiCapacitor"; }
|
|
|
|
|
|
} // Analog namespace.
|