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:
parent
64ea693d6d
commit
bd3984a313
|
@ -52,6 +52,15 @@ def safeImport ( moduleName, symbol=None ):
|
|||
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 ():
|
||||
libDir = 'lib'
|
||||
osSlsoc7x_64 = re.compile (".*Linux.*(el7|slsoc7).*x86_64.*")
|
||||
|
@ -171,6 +180,7 @@ def autoLocate ():
|
|||
# CCB Main Part.
|
||||
|
||||
autoLocate()
|
||||
checkCMake()
|
||||
|
||||
parser = optparse.OptionParser ()
|
||||
parser.add_option ( "-g", "--gui" , action="store_true" , dest="gui" , help="Lauch the graphical interface." )
|
||||
|
|
|
@ -31,7 +31,7 @@ allianceConfig = \
|
|||
, ( 'OUT_PH' , 'ap')
|
||||
, ( 'POWER' , 'vdd')
|
||||
, ( 'GROUND' , 'vss')
|
||||
, ( 'CLOCK' , '^ck.*')
|
||||
, ( 'CLOCK' , '.*ck.*|.*nck.*')
|
||||
, ( 'BLOCKAGE' , '^blockage[Nn]et*')
|
||||
, ( 'PAD' , '.*_px$')
|
||||
# The following are only read by the Alliance tool wrappers.
|
||||
|
|
|
@ -495,10 +495,12 @@ namespace Etesian {
|
|||
Instance* instance = static_cast<Instance*>((*ioccurrence).getEntity());
|
||||
Cell* masterCell = instance->getMasterCell();
|
||||
|
||||
// Have to check here if the model is fully placed or not.
|
||||
masterCell->setAbutmentBox( topAb );
|
||||
instance->setTransformation( Transformation() ); // (0,0,ID).
|
||||
instance->setPlacementStatus( Instance::PlacementStatus::PLACED );
|
||||
if (masterCell->getAbutmentBox().isEmpty()) {
|
||||
// Have to check here if the model is fully placed or not.
|
||||
masterCell->setAbutmentBox( topAb );
|
||||
instance->setTransformation( Transformation() ); // (0,0,ID).
|
||||
instance->setPlacementStatus( Instance::PlacementStatus::PLACED );
|
||||
}
|
||||
}
|
||||
UpdateSession::close();
|
||||
|
||||
|
@ -533,7 +535,7 @@ namespace Etesian {
|
|||
instances[instanceId].size = point<int_t>( xsize, ysize );
|
||||
instances[instanceId].list_index = instanceId;
|
||||
instances[instanceId].area = static_cast<capacity_t>(xsize) * static_cast<capacity_t>(ysize);
|
||||
positions[instanceId] = point<int_t>( xpos, ypos );
|
||||
positions[instanceId] = point<int_t>( xpos, ypos );
|
||||
|
||||
if ( not instance->isFixed() and instance->isTerminal() ) {
|
||||
instances[instanceId].attributes = coloquinte::XMovable
|
||||
|
|
|
@ -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)
|
||||
// ***************************************
|
||||
{
|
||||
|
|
|
@ -258,6 +258,7 @@ class Cell : public Entity {
|
|||
public: Instances getNonLeafInstances() const;
|
||||
public: Instances getNonLeafInstancesUnder(const Box& area) const;
|
||||
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 getGlobalNets() const;
|
||||
public: Nets getExternalNets() const;
|
||||
|
|
|
@ -53,6 +53,8 @@ namespace {
|
|||
using Hurricane::DbU;
|
||||
using Hurricane::Box;
|
||||
using Hurricane::Interval;
|
||||
using Hurricane::Net;
|
||||
using Hurricane::DeepNet;
|
||||
using Hurricane::Horizontal;
|
||||
using Hurricane::Vertical;
|
||||
using Hurricane::RoutingPad;
|
||||
|
@ -107,6 +109,7 @@ namespace {
|
|||
public:
|
||||
GlobalNetTable ( KiteEngine* );
|
||||
bool isCoreClockNetRouted ( const Net* ) const;
|
||||
inline Cell* getTopCell () const;
|
||||
Net* getRootNet ( const Net*, Path ) const;
|
||||
inline Net* getVdde () const;
|
||||
inline Net* getVddi () const;
|
||||
|
@ -136,9 +139,11 @@ namespace {
|
|||
Net* _cki; // Clock net in the pad ring.
|
||||
Net* _cko; // Clock net of the core (design).
|
||||
Net* _blockage;
|
||||
Cell* _topCell;
|
||||
};
|
||||
|
||||
|
||||
inline Cell* GlobalNetTable::getTopCell () const { return _topCell; }
|
||||
inline Net* GlobalNetTable::getVdde () const { return _vdde; }
|
||||
inline Net* GlobalNetTable::getVddi () const { return _vddi; }
|
||||
inline Net* GlobalNetTable::getVsse () const { return _vsse; }
|
||||
|
@ -166,14 +171,14 @@ namespace {
|
|||
, _cki (NULL)
|
||||
, _cko (NULL)
|
||||
, _blockage(NULL)
|
||||
, _topCell (kite->getCell())
|
||||
{
|
||||
Cell* topCell = kite->getCell();
|
||||
if (topCell == NULL) return;
|
||||
if (_topCell == NULL) return;
|
||||
|
||||
AllianceFramework* af = AllianceFramework::get();
|
||||
|
||||
bool hasPad = false;
|
||||
forEach ( Instance*, iinstance, topCell->getInstances() ) {
|
||||
forEach ( Instance*, iinstance, _topCell->getInstances() ) {
|
||||
if (af->isPad(iinstance->getMasterCell())) {
|
||||
if (not hasPad) {
|
||||
cmess1 << " o Design has pads, assuming complete chip top structure." << endl;
|
||||
|
@ -195,7 +200,7 @@ namespace {
|
|||
|
||||
Net* net = iplug->getNet();
|
||||
if (not net) {
|
||||
net = topCell->getNet( masterNet->getName() );
|
||||
net = _topCell->getNet( masterNet->getName() );
|
||||
if (not net) {
|
||||
cerr << Error("Missing global net <%s> at chip level.",getString(masterNet->getName()).c_str()) << endl;
|
||||
continue;
|
||||
|
@ -216,7 +221,7 @@ namespace {
|
|||
Net* masterNet = iplug->getMasterNet();
|
||||
Net* net = iplug->getNet();
|
||||
if (not net) {
|
||||
net = topCell->getNet( masterNet->getName() );
|
||||
net = _topCell->getNet( masterNet->getName() );
|
||||
if (not net) {
|
||||
cerr << Error("Missing global net <%s> at chip level.",getString(masterNet->getName()).c_str()) << endl;
|
||||
continue;
|
||||
|
@ -249,7 +254,7 @@ namespace {
|
|||
_vssiPadNetName = "";
|
||||
_ckoPadNetName = "";
|
||||
|
||||
forEach ( Net*, inet, topCell->getNets() ) {
|
||||
forEach ( Net*, inet, _topCell->getNets() ) {
|
||||
if (NetRoutingExtension::isManualGlobalRoute(*inet)) continue;
|
||||
|
||||
Net::Type netType = inet->getType();
|
||||
|
@ -368,6 +373,7 @@ namespace {
|
|||
Net* GlobalNetTable::getRootNet ( const Net* net, Path path ) const
|
||||
{
|
||||
ltrace(300) << " getRootNet:" << path << ":" << net << endl;
|
||||
|
||||
if (net == _blockage) return _blockage;
|
||||
|
||||
if (_vdde and (net->getName() == _vdde->getName())) return _vdde;
|
||||
|
@ -379,6 +385,17 @@ namespace {
|
|||
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.
|
||||
const Net* upNet = net;
|
||||
|
||||
|
|
|
@ -124,7 +124,6 @@ namespace Kite {
|
|||
|
||||
Horizontal* horizontal = dynamic_cast<Horizontal*>(*icomponent);
|
||||
if (horizontal) {
|
||||
cerr << horizontal << endl;
|
||||
segments.push_back( horizontal );
|
||||
isPreRouted = true;
|
||||
if (horizontal->getWidth() != Session::getWireWidth(horizontal->getLayer()))
|
||||
|
@ -132,7 +131,6 @@ namespace Kite {
|
|||
} else {
|
||||
Vertical* vertical = dynamic_cast<Vertical*>(*icomponent);
|
||||
if (vertical) {
|
||||
cerr << vertical << endl;
|
||||
isPreRouted = true;
|
||||
segments.push_back( vertical );
|
||||
if (vertical->getWidth() != Session::getWireWidth(vertical->getLayer()))
|
||||
|
@ -140,7 +138,6 @@ namespace Kite {
|
|||
} else {
|
||||
Contact* contact = dynamic_cast<Contact*>(*icomponent);
|
||||
if (contact) {
|
||||
cerr << contact << endl;
|
||||
isPreRouted = true;
|
||||
contacts.push_back( contact );
|
||||
if ( (contact->getWidth () != Session::getViaWidth(contact->getLayer()))
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#!/usr/bin/python
|
||||
#
|
||||
# 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 |
|
||||
|
@ -16,6 +16,7 @@
|
|||
|
||||
try:
|
||||
import sys
|
||||
import traceback
|
||||
import Cfg
|
||||
import CRL
|
||||
|
||||
|
@ -63,3 +64,44 @@ except Exception, e:
|
|||
print ' modules. Something may be wrong at Python/C API level.\n'
|
||||
print ' %s' % e
|
||||
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 )
|
||||
|
|
|
@ -121,6 +121,7 @@ if __name__ == '__main__':
|
|||
args.insert(0, 'cgt')
|
||||
|
||||
af = CRL.AllianceFramework.get()
|
||||
print af.getEnvironment().getPrint()
|
||||
|
||||
#Hurricane.trace(True)
|
||||
Cfg.Configuration.pushDefaultPriority(Cfg.Parameter.Priority.CommandLine)
|
||||
|
|
Loading…
Reference in New Issue