Correctly manage clock net isolateds from the main clock.

* New: In Bootstrap, in ccb.py, check if cmake is installed and issue
    a warning, if not.
* New: In Hurricane, added Cell::getDeepNet() to search for a deepnet
    given a path and a leaf net. This method is slow and must not be
    used too often. Introduced for Kite::BuildPowerRails().
* Change: In CRL Core, in cmos/alliance.conf, modify the clock name
    pattern to match the sub-clock signals in the datapath operators.
* Bug: In Etesian, do not blindly reset the top cell abutment-box.
    Do it only if it's empty, otherwise keep it.
* Bug: In Kite, in buildPowerRails(), in getRootNet() the management
    of clock nets was incomplete. The case of unrouted clock nets
    that where not connected to the top core clock net, like the
    one in the datapath registers was faulty. They were partly
    recognized as unrouteds and partly as blockage generating a
    routing deadlock: routage impossible due to blockage generated
    from itself...
* New: In Stratus1, add a buildModel() utility function to automate
    the model generation and allow a call by the model name (string).
* Change: In Unicorn, in cgt.py, display the Alliance environement.
This commit is contained in:
Jean-Paul Chaput 2015-02-25 22:17:44 +01:00
parent 64ea693d6d
commit bd3984a313
9 changed files with 106 additions and 16 deletions

View File

@ -52,6 +52,15 @@ def safeImport ( moduleName, symbol=None ):
return module return module
def checkCMake ():
child = subprocess.Popen ( ["which", "cmake"], stdout=subprocess.PIPE, stderr=subprocess.PIPE )
(pid,status) = os.waitpid ( child.pid, 0 )
status >>= 8
if status != 0:
print '[ERROR] The <cmake> program has not been found, please install it.'
sys.exit(1)
def guessOs (): def guessOs ():
libDir = 'lib' libDir = 'lib'
osSlsoc7x_64 = re.compile (".*Linux.*(el7|slsoc7).*x86_64.*") osSlsoc7x_64 = re.compile (".*Linux.*(el7|slsoc7).*x86_64.*")
@ -171,6 +180,7 @@ def autoLocate ():
# CCB Main Part. # CCB Main Part.
autoLocate() autoLocate()
checkCMake()
parser = optparse.OptionParser () parser = optparse.OptionParser ()
parser.add_option ( "-g", "--gui" , action="store_true" , dest="gui" , help="Lauch the graphical interface." ) parser.add_option ( "-g", "--gui" , action="store_true" , dest="gui" , help="Lauch the graphical interface." )

View File

@ -31,7 +31,7 @@ allianceConfig = \
, ( 'OUT_PH' , 'ap') , ( 'OUT_PH' , 'ap')
, ( 'POWER' , 'vdd') , ( 'POWER' , 'vdd')
, ( 'GROUND' , 'vss') , ( 'GROUND' , 'vss')
, ( 'CLOCK' , '^ck.*') , ( 'CLOCK' , '.*ck.*|.*nck.*')
, ( 'BLOCKAGE' , '^blockage[Nn]et*') , ( 'BLOCKAGE' , '^blockage[Nn]et*')
, ( 'PAD' , '.*_px$') , ( 'PAD' , '.*_px$')
# The following are only read by the Alliance tool wrappers. # The following are only read by the Alliance tool wrappers.

View File

@ -495,11 +495,13 @@ namespace Etesian {
Instance* instance = static_cast<Instance*>((*ioccurrence).getEntity()); Instance* instance = static_cast<Instance*>((*ioccurrence).getEntity());
Cell* masterCell = instance->getMasterCell(); Cell* masterCell = instance->getMasterCell();
if (masterCell->getAbutmentBox().isEmpty()) {
// Have to check here if the model is fully placed or not. // Have to check here if the model is fully placed or not.
masterCell->setAbutmentBox( topAb ); masterCell->setAbutmentBox( topAb );
instance->setTransformation( Transformation() ); // (0,0,ID). instance->setTransformation( Transformation() ); // (0,0,ID).
instance->setPlacementStatus( Instance::PlacementStatus::PLACED ); instance->setPlacementStatus( Instance::PlacementStatus::PLACED );
} }
}
UpdateSession::close(); UpdateSession::close();
index_t instanceId = 0; index_t instanceId = 0;

View File

@ -189,6 +189,26 @@ void Cell::setAbutmentBox(const Box& abutmentBox)
} }
} }
DeepNet* Cell::getDeepNet ( Path path, const Net* leafNet ) const
// **************************************************************
{
if (not (_flags & FlattenedNets)) return NULL;
Occurrence rootNetOccurrence ( getHyperNetRootNetOccurrence(Occurrence(leafNet,path)) );
forEach ( Net*, inet, getNets() ) {
DeepNet* deepNet = dynamic_cast<DeepNet*>( *inet );
if (not deepNet) continue;
Occurrence deepNetOccurrence = deepNet->getRootNetOccurrence();
if ( (rootNetOccurrence.getEntity() == deepNetOccurrence.getEntity())
and (rootNetOccurrence.getPath () == deepNetOccurrence.getPath ()) )
return deepNet;
}
return NULL;
}
void Cell::flattenNets(unsigned int flags) void Cell::flattenNets(unsigned int flags)
// *************************************** // ***************************************
{ {

View File

@ -258,6 +258,7 @@ class Cell : public Entity {
public: Instances getNonLeafInstances() const; public: Instances getNonLeafInstances() const;
public: Instances getNonLeafInstancesUnder(const Box& area) const; public: Instances getNonLeafInstancesUnder(const Box& area) const;
public: Net* getNet(const Name& name) const {return _netMap.getElement(name);}; public: Net* getNet(const Name& name) const {return _netMap.getElement(name);};
public: DeepNet* getDeepNet( Path, const Net* ) const;
public: Nets getNets() const {return _netMap.getElements();}; public: Nets getNets() const {return _netMap.getElements();};
public: Nets getGlobalNets() const; public: Nets getGlobalNets() const;
public: Nets getExternalNets() const; public: Nets getExternalNets() const;

View File

@ -53,6 +53,8 @@ namespace {
using Hurricane::DbU; using Hurricane::DbU;
using Hurricane::Box; using Hurricane::Box;
using Hurricane::Interval; using Hurricane::Interval;
using Hurricane::Net;
using Hurricane::DeepNet;
using Hurricane::Horizontal; using Hurricane::Horizontal;
using Hurricane::Vertical; using Hurricane::Vertical;
using Hurricane::RoutingPad; using Hurricane::RoutingPad;
@ -107,6 +109,7 @@ namespace {
public: public:
GlobalNetTable ( KiteEngine* ); GlobalNetTable ( KiteEngine* );
bool isCoreClockNetRouted ( const Net* ) const; bool isCoreClockNetRouted ( const Net* ) const;
inline Cell* getTopCell () const;
Net* getRootNet ( const Net*, Path ) const; Net* getRootNet ( const Net*, Path ) const;
inline Net* getVdde () const; inline Net* getVdde () const;
inline Net* getVddi () const; inline Net* getVddi () const;
@ -136,9 +139,11 @@ namespace {
Net* _cki; // Clock net in the pad ring. Net* _cki; // Clock net in the pad ring.
Net* _cko; // Clock net of the core (design). Net* _cko; // Clock net of the core (design).
Net* _blockage; Net* _blockage;
Cell* _topCell;
}; };
inline Cell* GlobalNetTable::getTopCell () const { return _topCell; }
inline Net* GlobalNetTable::getVdde () const { return _vdde; } inline Net* GlobalNetTable::getVdde () const { return _vdde; }
inline Net* GlobalNetTable::getVddi () const { return _vddi; } inline Net* GlobalNetTable::getVddi () const { return _vddi; }
inline Net* GlobalNetTable::getVsse () const { return _vsse; } inline Net* GlobalNetTable::getVsse () const { return _vsse; }
@ -166,14 +171,14 @@ namespace {
, _cki (NULL) , _cki (NULL)
, _cko (NULL) , _cko (NULL)
, _blockage(NULL) , _blockage(NULL)
, _topCell (kite->getCell())
{ {
Cell* topCell = kite->getCell(); if (_topCell == NULL) return;
if (topCell == NULL) return;
AllianceFramework* af = AllianceFramework::get(); AllianceFramework* af = AllianceFramework::get();
bool hasPad = false; bool hasPad = false;
forEach ( Instance*, iinstance, topCell->getInstances() ) { forEach ( Instance*, iinstance, _topCell->getInstances() ) {
if (af->isPad(iinstance->getMasterCell())) { if (af->isPad(iinstance->getMasterCell())) {
if (not hasPad) { if (not hasPad) {
cmess1 << " o Design has pads, assuming complete chip top structure." << endl; cmess1 << " o Design has pads, assuming complete chip top structure." << endl;
@ -195,7 +200,7 @@ namespace {
Net* net = iplug->getNet(); Net* net = iplug->getNet();
if (not net) { if (not net) {
net = topCell->getNet( masterNet->getName() ); net = _topCell->getNet( masterNet->getName() );
if (not net) { if (not net) {
cerr << Error("Missing global net <%s> at chip level.",getString(masterNet->getName()).c_str()) << endl; cerr << Error("Missing global net <%s> at chip level.",getString(masterNet->getName()).c_str()) << endl;
continue; continue;
@ -216,7 +221,7 @@ namespace {
Net* masterNet = iplug->getMasterNet(); Net* masterNet = iplug->getMasterNet();
Net* net = iplug->getNet(); Net* net = iplug->getNet();
if (not net) { if (not net) {
net = topCell->getNet( masterNet->getName() ); net = _topCell->getNet( masterNet->getName() );
if (not net) { if (not net) {
cerr << Error("Missing global net <%s> at chip level.",getString(masterNet->getName()).c_str()) << endl; cerr << Error("Missing global net <%s> at chip level.",getString(masterNet->getName()).c_str()) << endl;
continue; continue;
@ -249,7 +254,7 @@ namespace {
_vssiPadNetName = ""; _vssiPadNetName = "";
_ckoPadNetName = ""; _ckoPadNetName = "";
forEach ( Net*, inet, topCell->getNets() ) { forEach ( Net*, inet, _topCell->getNets() ) {
if (NetRoutingExtension::isManualGlobalRoute(*inet)) continue; if (NetRoutingExtension::isManualGlobalRoute(*inet)) continue;
Net::Type netType = inet->getType(); Net::Type netType = inet->getType();
@ -368,6 +373,7 @@ namespace {
Net* GlobalNetTable::getRootNet ( const Net* net, Path path ) const Net* GlobalNetTable::getRootNet ( const Net* net, Path path ) const
{ {
ltrace(300) << " getRootNet:" << path << ":" << net << endl; ltrace(300) << " getRootNet:" << path << ":" << net << endl;
if (net == _blockage) return _blockage; if (net == _blockage) return _blockage;
if (_vdde and (net->getName() == _vdde->getName())) return _vdde; if (_vdde and (net->getName() == _vdde->getName())) return _vdde;
@ -379,6 +385,17 @@ namespace {
return NULL; return NULL;
} }
DeepNet* deepClockNet = getTopCell()->getDeepNet( path, net );
if (deepClockNet) {
ltrace(300) << " Deep Clock Net:" << deepClockNet
<< " state:" << NetRoutingExtension::getFlags(deepClockNet) << endl;
return NetRoutingExtension::isFixed(deepClockNet) ? _blockage : NULL;
} else {
ltrace(300) << " Top Clock Net:" << net
<< " state:" << NetRoutingExtension::getFlags(net) << endl;
}
// Track up, *only* for clocks. // Track up, *only* for clocks.
const Net* upNet = net; const Net* upNet = net;

View File

@ -124,7 +124,6 @@ namespace Kite {
Horizontal* horizontal = dynamic_cast<Horizontal*>(*icomponent); Horizontal* horizontal = dynamic_cast<Horizontal*>(*icomponent);
if (horizontal) { if (horizontal) {
cerr << horizontal << endl;
segments.push_back( horizontal ); segments.push_back( horizontal );
isPreRouted = true; isPreRouted = true;
if (horizontal->getWidth() != Session::getWireWidth(horizontal->getLayer())) if (horizontal->getWidth() != Session::getWireWidth(horizontal->getLayer()))
@ -132,7 +131,6 @@ namespace Kite {
} else { } else {
Vertical* vertical = dynamic_cast<Vertical*>(*icomponent); Vertical* vertical = dynamic_cast<Vertical*>(*icomponent);
if (vertical) { if (vertical) {
cerr << vertical << endl;
isPreRouted = true; isPreRouted = true;
segments.push_back( vertical ); segments.push_back( vertical );
if (vertical->getWidth() != Session::getWireWidth(vertical->getLayer())) if (vertical->getWidth() != Session::getWireWidth(vertical->getLayer()))
@ -140,7 +138,6 @@ namespace Kite {
} else { } else {
Contact* contact = dynamic_cast<Contact*>(*icomponent); Contact* contact = dynamic_cast<Contact*>(*icomponent);
if (contact) { if (contact) {
cerr << contact << endl;
isPreRouted = true; isPreRouted = true;
contacts.push_back( contact ); contacts.push_back( contact );
if ( (contact->getWidth () != Session::getViaWidth(contact->getLayer())) if ( (contact->getWidth () != Session::getViaWidth(contact->getLayer()))

View File

@ -1,7 +1,7 @@
#!/usr/bin/python #!/usr/bin/python
# #
# This file is part of the Coriolis Software. # This file is part of the Coriolis Software.
# Copyright (c) UPMC/LIP6 2008-2012, All Rights Reserved # Copyright (c) UPMC 2008-2014, All Rights Reserved
# #
# +-----------------------------------------------------------------+ # +-----------------------------------------------------------------+
# | C O R I O L I S | # | C O R I O L I S |
@ -16,6 +16,7 @@
try: try:
import sys import sys
import traceback
import Cfg import Cfg
import CRL import CRL
@ -63,3 +64,44 @@ except Exception, e:
print ' modules. Something may be wrong at Python/C API level.\n' print ' modules. Something may be wrong at Python/C API level.\n'
print ' %s' % e print ' %s' % e
sys.exit(2) sys.exit(2)
DoNetlist = 0x0001
DoLayout = 0x0002
DoStop = 0x0004
def buildModel ( name, flags ):
try:
module = __import__( name, globals(), locals(), name )
if not module.__dict__.has_key(name):
print '[ERROR] Stratus module <%s> do not contains a design of the same name.' % name
sys.exit(1)
print ' - Generating Stratus Model <%s>' % name
model = module.__dict__[name](name)
model.Interface()
if flags & DoNetlist: model.Netlist()
if flags & DoLayout: model.Layout ()
stopLevel=0
if flags & DoStop: stopLevel = 1
model.View(stopLevel, 'Model %s' % name)
model.Save(LOGICAL|PHYSICAL)
except ImportError, e:
module = str(e).split()[-1]
print '[ERROR] The <%s> Stratus design cannot be loaded.' % module
print ' Please check your design hierarchy.'
sys.exit(1)
except Exception, e:
print '[ERROR] A strange exception occurred while loading the Stratus'
print ' design <%s>. Please check that module for error:\n' % name
traceback.print_tb(sys.exc_info()[2])
print ' %s' % e
sys.exit(2)
framework = CRL.AllianceFramework.get()
return framework.getCell( name, CRL.Catalog.State.Views )

View File

@ -121,6 +121,7 @@ if __name__ == '__main__':
args.insert(0, 'cgt') args.insert(0, 'cgt')
af = CRL.AllianceFramework.get() af = CRL.AllianceFramework.get()
print af.getEnvironment().getPrint()
#Hurricane.trace(True) #Hurricane.trace(True)
Cfg.Configuration.pushDefaultPriority(Cfg.Parameter.Priority.CommandLine) Cfg.Configuration.pushDefaultPriority(Cfg.Parameter.Priority.CommandLine)