Clarify semantic of flatten Collections (walkthrough).

In the Cell/Instance hierarchy, the "terminal" and "leaf cell" concepts
where not clearly defined and partially overlapping. Now, "Terminal" is
the refer to the physical hierarchy (layout) and "TerminalNetlist" to
the logical hierarchy (netlist). The logical hierarchy can be less deep
than the physical one thanks to a Cell dedicated cell flags. Collections
related to the physical hierarchy keep their old names, the one related
to the logical hierarchy are renamed from "Leaf" to "TerminalNetlist".
The name "Leaf" was too ambiguous (leaf for *what* hierarchy).

* Change: In Hurricane::Device, set the "TerminalNetlist" flag once and
    for all. No need set it in all the derived classes again.
* New: In Hurricane::MultiCapacitor, added new parameter "dummy" to
    create dummies around the capacity matrix.
* Change: In Hurricane::Cell, remove "Leaf" related methods, replace
    them by "TerminalNetlist" one, especially Collections. Now we have
    two clear sets of Collections to walkthough the layout or the
    netlist.
      Change the "Terminal" flag into "TerminalNetlist".
* Change: In Hurricane::CellCollections, rename "Leaf" into
    "TerminalNetlist" collections and apply the new semantic to the
    locators.
* Change: In Hurricane::DataBase, Leaf to TerminalInstance renaming.
* Change: In Hurricane::DeepNet, Leaf to TerminalInstance renaming.
* Change: In Hurricane::HyperNet, Leaf to TerminalInstance renaming.
* Change: In Hurricane::Instance, Leaf to TerminalInstance renaming.
* Change: In Hurricane::Viewer::HierarchyInformations, Leaf to
    TerminalInstance renaming.
* Change: In CRL::AllianceFramework, Leaf to TerminalInstance renaming.
* Change: In CRL::Catalog, Leaf to TerminalInstance renaming.
* Change: In CRL::ApParser, Leaf to TerminalInstance renaming.
* Change: In EtesianEngine::AddFeeds, Leaf to TerminalInstance renaming.
* Bug: In EtesianEngine::resetPlacement, move there the loop over
    non terminal netlist instances to flag fully placed sub-blocks
    as terminal for the netlist. Only then remove the feed cells
    from unplaced instances. Previously, the feed cells where stripped
    even from already placed instances.
* Change: In Katana, Leaf to TerminalInstance renaming.
* Bug: In Bora::PyDSlicingNode, allow the range parameter to be the
    Python None object when we do not want to pass one but need to
    have it as positional parameter.
* Change: In Cumulus/clocktree/ClockTree.py, Leaf to TerminalInstance
    renaming.
This commit is contained in:
Jean-Paul Chaput 2020-03-10 12:10:53 +01:00
parent e2d6929fbe
commit dfe4d80b60
466 changed files with 2480 additions and 1432 deletions

View File

@ -74,7 +74,8 @@ extern "C" {
PyErr_SetString( ConstructorError, "DSlicingNode.create(): Second argument *must* be of type Cell." ); PyErr_SetString( ConstructorError, "DSlicingNode.create(): Second argument *must* be of type Cell." );
return NULL; return NULL;
} }
if ( not IsPyStepParameterRange(pyParameterRange) if ( (pyParameterRange != Py_None)
and not IsPyStepParameterRange(pyParameterRange)
and not IsPyMatrixParameterRange(pyParameterRange)) { and not IsPyMatrixParameterRange(pyParameterRange)) {
PyErr_SetString( ConstructorError, "DSlicingNode.create(): Third argument *must* be of type StepParameterRange or MatrixParameterRange." ); PyErr_SetString( ConstructorError, "DSlicingNode.create(): Third argument *must* be of type StepParameterRange or MatrixParameterRange." );
return NULL; return NULL;

View File

@ -113,6 +113,7 @@ extern "C" {
# if !defined(__PYTHON_MODULE__) # if !defined(__PYTHON_MODULE__)
ParameterRange* ParameterRangeCast ( PyObject* derivedObject ) { ParameterRange* ParameterRangeCast ( PyObject* derivedObject ) {
if (not derivedObject or (derivedObject == Py_None)) return NULL;
if (IsPyStepParameterRange (derivedObject)) return PYSTEPPARAMETERRANGE_O (derivedObject); if (IsPyStepParameterRange (derivedObject)) return PYSTEPPARAMETERRANGE_O (derivedObject);
if (IsPyMatrixParameterRange(derivedObject)) return PYMATRIXPARAMETERRANGE_O(derivedObject); if (IsPyMatrixParameterRange(derivedObject)) return PYMATRIXPARAMETERRANGE_O(derivedObject);

View File

@ -354,7 +354,7 @@ namespace CRL {
// The cell is not even in the Catalog : add an entry. // The cell is not even in the Catalog : add an entry.
if (state == NULL) state = _catalog.getState( name, true ); if (state == NULL) state = _catalog.getState( name, true );
if (state->isFlattenLeaf()) depth = 0; if (state->isTerminalNetlist()) depth = 0;
state->setDepth( depth ); state->setDepth( depth );
// Do not try to load. // Do not try to load.
@ -380,7 +380,7 @@ namespace CRL {
if (state->getCell() == NULL) { if (state->getCell() == NULL) {
state->setCell ( Cell::create( _libraries[ _environment.getLIBRARIES().getIndex() ]->getLibrary() , name ) ); state->setCell ( Cell::create( _libraries[ _environment.getLIBRARIES().getIndex() ]->getLibrary() , name ) );
state->getCell ()->put( CatalogProperty::create(state) ); state->getCell ()->put( CatalogProperty::create(state) );
state->getCell ()->setFlattenLeaf( false ); state->getCell ()->setTerminalNetlist( false );
createCell = true; createCell = true;
} }
@ -526,7 +526,7 @@ namespace CRL {
state->setCell ( Cell::create ( library->getLibrary() , name ) ); state->setCell ( Cell::create ( library->getLibrary() , name ) );
state->getCell ()->put ( CatalogProperty::create(state) ); state->getCell ()->put ( CatalogProperty::create(state) );
state->getCell ()->setFlattenLeaf ( false ); state->getCell ()->setTerminalNetlist ( false );
} }
return state->getCell (); return state->getCell ();

View File

@ -76,7 +76,7 @@ namespace CRL {
{ {
string s; string s;
s += (isFlattenLeaf()) ? 'C' : '-'; s += (isTerminalNetlist()) ? 'C' : '-';
s += (isFeed() ) ? 'F' : '-'; s += (isFeed() ) ? 'F' : '-';
s += (isPad() ) ? 'P' : '-'; s += (isPad() ) ? 'P' : '-';
s += (isGds() ) ? 'G' : '-'; s += (isGds() ) ? 'G' : '-';
@ -163,7 +163,7 @@ namespace CRL {
if (state->getLibrary() != library) state->setLibrary( library ); if (state->getLibrary() != library) state->setLibrary( library );
state->setDepth( depth ); state->setDepth( depth );
state->setFlattenLeaf( (sflags[0] == 'C') ); state->setTerminalNetlist( (sflags[0] == 'C') );
state->setFeed( (sflags[1] == 'F') ); state->setFeed( (sflags[1] == 'F') );
state->setPad( (sflags[2] == 'P') ); state->setPad( (sflags[2] == 'P') );
state->setGds( (sflags[3] == 'G') ); state->setGds( (sflags[3] == 'G') );
@ -253,7 +253,7 @@ namespace CRL {
for ( ; start<s.size() ; start++ ) { for ( ; start<s.size() ; start++ ) {
switch ( s[start] ) { switch ( s[start] ) {
case 'C': state->setFlattenLeaf ( true ); break; case 'C': state->setTerminalNetlist ( true ); break;
case 'F': state->setFeed ( true ); break; case 'F': state->setFeed ( true ); break;
case 'G': state->setGds ( true ); break; case 'G': state->setGds ( true ); break;
case 'D': state->setDelete ( true ); break; case 'D': state->setDelete ( true ); break;
@ -303,7 +303,7 @@ namespace CRL {
State* state = entry.second; State* state = entry.second;
if (state->getLibrary() != library) continue; if (state->getLibrary() != library) continue;
if (state->isFlattenLeaf()) of << setw(20) << left << entry.first << "C\n"; if (state->isTerminalNetlist()) of << setw(20) << left << entry.first << "C\n";
if (state->isFeed() ) of << setw(20) << left << entry.first << "F\n"; if (state->isFeed() ) of << setw(20) << left << entry.first << "F\n";
if (state->isGds() ) of << setw(20) << left << entry.first << "G\n"; if (state->isGds() ) of << setw(20) << left << entry.first << "G\n";
} }

View File

@ -348,7 +348,7 @@ namespace CRL {
throw Error ( "Missing CatalogProperty in cell %s.\n" , getString(cell->getName()).c_str() ); throw Error ( "Missing CatalogProperty in cell %s.\n" , getString(cell->getName()).c_str() );
__state._cell = cell; __state._cell = cell;
__state._cell->setTerminal ( false ); __state._cell->setTerminalNetlist ( false );
__state._state = sprop->getState(); __state._state = sprop->getState();
__state._state->setLogical ( true ); __state._state->setLogical ( true );

View File

@ -397,10 +397,9 @@ void DumpDate(ofstream &ccell)
} }
void DumpInstances(ofstream &ccell, Cell* cell) void DumpInstances(ofstream &ccell, Cell* cell)
{
for_each_instance(instance, cell->getNotUnplacedInstances())
{ {
for ( Instance* instance : cell->getNotUnplacedInstances()) {
ccell << "I " << toMBKlambda(instance->getAbutmentBox().getXMin()) ccell << "I " << toMBKlambda(instance->getAbutmentBox().getXMin())
<< "," << toMBKlambda(instance->getAbutmentBox().getYMin()) << "," << toMBKlambda(instance->getAbutmentBox().getYMin())
<< "," << instance->getMasterCell()->getName() << "," << instance->getMasterCell()->getName()
@ -437,9 +436,8 @@ void DumpInstances(ofstream &ccell, Cell* cell)
throw Error("Unrecognized orientation in transformation"); throw Error("Unrecognized orientation in transformation");
} }
ccell << endl; ccell << endl;
end_for;
} }
} }
} }

View File

@ -716,7 +716,7 @@ namespace {
return; return;
} }
ignoreInstance = ignoreInstance and _cell->isTerminal(); ignoreInstance = ignoreInstance and _cell->isTerminalNetlist();
instance = Instance::create( _cell instance = Instance::create( _cell
, instanceName , instanceName
@ -729,7 +729,7 @@ namespace {
, Instance::PlacementStatus::FIXED , Instance::PlacementStatus::FIXED
, true // Checking of recursive calls , true // Checking of recursive calls
); );
_cell->setTerminal( ignoreInstance ); _cell->setTerminalNetlist( ignoreInstance );
} }
} }
} }
@ -781,7 +781,7 @@ namespace {
_state = catalogProperty->getState (); _state = catalogProperty->getState ();
_state->setPhysical ( true ); _state->setPhysical ( true );
if ( _state->isFlattenLeaf() ) _cell->setFlattenLeaf ( true ); if ( _state->isTerminalNetlist() ) _cell->setTerminalNetlist ( true );
if ( _framework->isPad(_cell) ) _state->setPad ( true ); if ( _framework->isPad(_cell) ) _state->setPad ( true );
IoFile fileStream ( cellPath ); IoFile fileStream ( cellPath );

View File

@ -599,7 +599,7 @@ architecture_body
: ARCHITECTURE : ARCHITECTURE
simple_name simple_name
{ if ( ( Vst::states->_behavioral ) { if ( ( Vst::states->_behavioral )
|| ( Vst::states->_state->isFlattenLeaf() ) || ( Vst::states->_state->isTerminalNetlist() )
|| ( Vst::states->_state->getDepth() <= 0 ) || ( Vst::states->_state->getDepth() <= 0 )
) YYACCEPT; ) YYACCEPT;
} }
@ -785,7 +785,7 @@ component_instantiation_statement
throw Error( message.str() ); throw Error( message.str() );
} }
Vst::states->_instance = Instance::create( Vst::states->_cell, *$1, Vst::states->_masterCell ); Vst::states->_instance = Instance::create( Vst::states->_cell, *$1, Vst::states->_masterCell );
Vst::states->_cell->setTerminal( false ); Vst::states->_cell->setTerminalNetlist( false );
} else { } else {
if (not Vst::framework->getCell(*$2,Catalog::State::Views|Catalog::State::InMemory)) { if (not Vst::framework->getCell(*$2,Catalog::State::Views|Catalog::State::InMemory)) {
if (Vst::states->pushCell(*$2)) { if (Vst::states->pushCell(*$2)) {

View File

@ -450,7 +450,7 @@ namespace {
if (not _staticInit) staticInit(); if (not _staticInit) staticInit();
_blifLut.insert( make_pair(getString(_cell->getName()), this) ); _blifLut.insert( make_pair(getString(_cell->getName()), this) );
if (_cell->isTerminal()) if (_cell->isTerminalNetlist())
_depth = 1; _depth = 1;
else { else {
cmess2 << " " << tab++ << "+ " << cell->getName() << " [.model]" << endl; cmess2 << " " << tab++ << "+ " << cell->getName() << " [.model]" << endl;
@ -770,7 +770,7 @@ namespace CRL {
} }
Cell* cell = framework->createCell( blifLine[1] ); Cell* cell = framework->createCell( blifLine[1] );
cell->setTerminal( false ); cell->setTerminalNetlist( false );
blifModel = new Model ( cell ); blifModel = new Model ( cell );
if (not mainModel or (blifLine[1] == mainName)) if (not mainModel or (blifLine[1] == mainName))

View File

@ -77,7 +77,7 @@ namespace CRL {
class State { class State {
public: public:
// Flags Constants. // Flags Constants.
enum Flags { FlattenLeaf = 1 << 0 enum Flags { TerminalNetlist = 1 << 0
, Feed = 1 << 1 , Feed = 1 << 1
, Pad = 1 << 2 , Pad = 1 << 2
, GDS = 1 << 3 , GDS = 1 << 3
@ -93,7 +93,7 @@ namespace CRL {
inline State (); inline State ();
~State (); ~State ();
// Predicates. // Predicates.
inline bool isFlattenLeaf () const; inline bool isTerminalNetlist () const;
inline bool isFeed () const; inline bool isFeed () const;
inline bool isPad () const; inline bool isPad () const;
inline bool isGds () const; inline bool isGds () const;
@ -104,7 +104,7 @@ namespace CRL {
// Flags management. // Flags management.
inline unsigned int getFlags ( unsigned int mask=(unsigned int)-1 ) const; inline unsigned int getFlags ( unsigned int mask=(unsigned int)-1 ) const;
inline bool setFlags ( unsigned int mask, bool value ); inline bool setFlags ( unsigned int mask, bool value );
inline bool setFlattenLeaf ( bool value ); inline bool setTerminalNetlist ( bool value );
inline bool setFeed ( bool value ); inline bool setFeed ( bool value );
inline bool setPad ( bool value ); inline bool setPad ( bool value );
inline bool setGds ( bool value ); inline bool setGds ( bool value );
@ -204,7 +204,7 @@ namespace CRL {
// Inline Functions. // Inline Functions.
inline Catalog::State::State () : _flags(0), _depth(1), _cell(NULL), _library(NULL) { } inline Catalog::State::State () : _flags(0), _depth(1), _cell(NULL), _library(NULL) { }
inline bool Catalog::State::isFlattenLeaf () const { return (_flags&FlattenLeaf)?1:0; } inline bool Catalog::State::isTerminalNetlist () const { return (_flags&TerminalNetlist)?1:0; }
inline bool Catalog::State::isFeed () const { return (_flags&Feed )?1:0; } inline bool Catalog::State::isFeed () const { return (_flags&Feed )?1:0; }
inline bool Catalog::State::isPad () const { return (_flags&Pad )?1:0; } inline bool Catalog::State::isPad () const { return (_flags&Pad )?1:0; }
inline bool Catalog::State::isGds () const { return (_flags&GDS )?1:0; } inline bool Catalog::State::isGds () const { return (_flags&GDS )?1:0; }
@ -218,7 +218,7 @@ namespace CRL {
else { _flags &= ~mask; } else { _flags &= ~mask; }
return ((_flags&mask) ? true : false); return ((_flags&mask) ? true : false);
} }
inline bool Catalog::State::setFlattenLeaf ( bool value ) { return setFlags(FlattenLeaf,value); } inline bool Catalog::State::setTerminalNetlist ( bool value ) { return setFlags(TerminalNetlist,value); }
inline bool Catalog::State::setFeed ( bool value ) { return setFlags(Feed ,value); } inline bool Catalog::State::setFeed ( bool value ) { return setFlags(Feed ,value); }
inline bool Catalog::State::setPad ( bool value ) { return setFlags(Pad ,value); } inline bool Catalog::State::setPad ( bool value ) { return setFlags(Pad ,value); }
inline bool Catalog::State::setGds ( bool value ) { return setFlags(GDS ,value); } inline bool Catalog::State::setGds ( bool value ) { return setFlags(GDS ,value); }
@ -251,7 +251,7 @@ namespace CRL {
public: public:
static Catalog::State* get ( const Cell* ); static Catalog::State* get ( const Cell* );
public: public:
static inline bool isFlattenLeaf ( const Cell* ); static inline bool isTerminalNetlist ( const Cell* );
static inline bool isFeed ( const Cell* ); static inline bool isFeed ( const Cell* );
static inline bool isPad ( const Cell* ); static inline bool isPad ( const Cell* );
static inline bool isGds ( const Cell* ); static inline bool isGds ( const Cell* );
@ -261,7 +261,7 @@ namespace CRL {
// Flags management. // Flags management.
static inline unsigned int getFlags ( const Cell*, unsigned int mask=(unsigned int)-1 ); static inline unsigned int getFlags ( const Cell*, unsigned int mask=(unsigned int)-1 );
static inline bool setFlags ( const Cell*, unsigned int mask, bool value ); static inline bool setFlags ( const Cell*, unsigned int mask, bool value );
static inline bool setFlattenLeaf ( const Cell*, bool value ); static inline bool setTerminalNetlist ( const Cell*, bool value );
static inline bool setFeed ( const Cell*, bool value ); static inline bool setFeed ( const Cell*, bool value );
static inline bool setPad ( const Cell*, bool value ); static inline bool setPad ( const Cell*, bool value );
static inline bool setGds ( const Cell*, bool value ); static inline bool setGds ( const Cell*, bool value );
@ -280,10 +280,10 @@ namespace CRL {
}; };
inline bool CatalogExtension::isFlattenLeaf ( const Cell* cell ) inline bool CatalogExtension::isTerminalNetlist ( const Cell* cell )
{ {
Catalog::State* state = get(cell); Catalog::State* state = get(cell);
return (state == NULL) ? false : state->isFlattenLeaf(); return (state == NULL) ? false : state->isTerminalNetlist();
} }
@ -343,10 +343,10 @@ namespace CRL {
} }
inline bool CatalogExtension::setFlattenLeaf ( const Cell* cell, bool value ) inline bool CatalogExtension::setTerminalNetlist ( const Cell* cell, bool value )
{ {
Catalog::State* state = get(cell); Catalog::State* state = get(cell);
return (state == NULL) ? false : state->setFlattenLeaf(value); return (state == NULL) ? false : state->setTerminalNetlist(value);
} }

View File

@ -518,10 +518,10 @@ namespace {
status = defwNewLine (); status = defwNewLine ();
CHECK_STATUS_CBK(status); CHECK_STATUS_CBK(status);
status = defwStartComponents ( cell->getLeafInstanceOccurrences().getSize() ); status = defwStartComponents ( cell->getTerminalNetlistInstanceOccurrences().getSize() );
CHECK_STATUS_CBK(status); CHECK_STATUS_CBK(status);
for ( Occurrence occurrence : cell->getLeafInstanceOccurrences() ) { for ( Occurrence occurrence : cell->getTerminalNetlistInstanceOccurrences() ) {
Instance* instance = static_cast<Instance*>(occurrence.getEntity()); Instance* instance = static_cast<Instance*>(occurrence.getEntity());
string insname = toDefName(occurrence.getCompactString()); string insname = toDefName(occurrence.getCompactString());
const char* source = NULL; const char* source = NULL;

View File

@ -710,7 +710,7 @@ namespace CRL {
if ( cell != NULL ) { if ( cell != NULL ) {
libraryName = getString(cell->getName()) + "_export"; libraryName = getString(cell->getName()) + "_export";
for ( Occurrence occurrence : cell->getLeafInstanceOccurrences() ) { for ( Occurrence occurrence : cell->getTerminalNetlistInstanceOccurrences() ) {
Instance* instance = static_cast<Instance*>(occurrence.getEntity()); Instance* instance = static_cast<Instance*>(occurrence.getEntity());
cells.insert ( instance->getMasterCell() ); cells.insert ( instance->getMasterCell() );
} }

View File

@ -186,7 +186,7 @@ namespace {
hCell = Cell::create(library, Name(cellNameString)); hCell = Cell::create(library, Name(cellNameString));
hCell->setTerminal(false); hCell->setTerminal(false);
if (!asDesignLibrary) if (!asDesignLibrary)
hCell->setFlattenLeaf(true); hCell->setTerminalNetlist(true);
cerr << hCell << endl; cerr << hCell << endl;
if (asDesignLibrary) if (asDesignLibrary)
_cell2OACellMap[hCell] = cell; _cell2OACellMap[hCell] = cell;

View File

@ -401,7 +401,7 @@ void CSpiceParser::Parse(const string cellPath, Cell* cell)
Catalog::State *state = sprop->getState (); Catalog::State *state = sprop->getState ();
state->setLogical ( true ); state->setLogical ( true );
// if ( state->isFlattenLeaf() ) cell->setFlattenLeaf ( true ); // if ( state->isTerminalNetlist() ) cell->setTerminalNetlist ( true );
if(badModelNameSet.find(getString(cell->getName()))!=badModelNameSet.end()) { if(badModelNameSet.find(getString(cell->getName()))!=badModelNameSet.end()) {
state->setLogical (false); state->setLogical (false);

View File

@ -356,7 +356,7 @@ CHyperNetDriverPortOccurrences::Locator::Locator(Occurrence hnrnoccurrence)
if (hnrnoccurrence.getPath().isEmpty() and static_cast<Net*>(hnrnoccurrence.getEntity())->isExternal()) if (hnrnoccurrence.getPath().isEmpty() and static_cast<Net*>(hnrnoccurrence.getEntity())->isExternal())
_pinLocator = static_cast<Net*>(hnrnoccurrence.getEntity())->getPins().getSubSet(InputPin()).getLocator(); _pinLocator = static_cast<Net*>(hnrnoccurrence.getEntity())->getPins().getSubSet(InputPin()).getLocator();
_plugOccurrenceLocator = HyperNet(hnrnoccurrence).getLeafPlugOccurrences().getSubSet(OutputPlugOccurrence()).getLocator(); _plugOccurrenceLocator = HyperNet(hnrnoccurrence).getTerminalNetlistPlugOccurrences().getSubSet(OutputPlugOccurrence()).getLocator();
} }
CHyperNetDriverPortOccurrences::Locator::Locator(const Locator& locator) CHyperNetDriverPortOccurrences::Locator::Locator(const Locator& locator)
@ -491,7 +491,7 @@ CHyperNetReceiverPortOccurrences::Locator::Locator(Occurrence hnrnoccurrence)
if (hnrnoccurrence.getPath().isEmpty() and static_cast<Net*>(hnrnoccurrence.getEntity())->isExternal()) if (hnrnoccurrence.getPath().isEmpty() and static_cast<Net*>(hnrnoccurrence.getEntity())->isExternal())
_pinLocator = static_cast<Net*>(hnrnoccurrence.getEntity())->getPins().getSubSet(OutputPin()).getLocator(); _pinLocator = static_cast<Net*>(hnrnoccurrence.getEntity())->getPins().getSubSet(OutputPin()).getLocator();
_plugOccurrenceLocator = HyperNet(hnrnoccurrence).getLeafPlugOccurrences().getSubSet(InputPlugOccurrence()).getLocator(); _plugOccurrenceLocator = HyperNet(hnrnoccurrence).getTerminalNetlistPlugOccurrences().getSubSet(InputPlugOccurrence()).getLocator();
} }
CHyperNetReceiverPortOccurrences::Locator::Locator(const Locator& locator) CHyperNetReceiverPortOccurrences::Locator::Locator(const Locator& locator)

View File

@ -66,7 +66,7 @@ void createRoutingPadsRing(Cell* top_cell)
//getting the net occurrence relative to its cell (null Path) //getting the net occurrence relative to its cell (null Path)
//in order to have plug occurrences relative to the RoutingPads-to-be //in order to have plug occurrences relative to the RoutingPads-to-be
netOccurrence = Occurrence(net); netOccurrence = Occurrence(net);
for_each_occurrence ( plugOccurrence, HyperNet(netOccurrence).getLeafPlugOccurrences() ) for_each_occurrence ( plugOccurrence, HyperNet(netOccurrence).getTerminalNetlistPlugOccurrences() )
{ {
//ltrace(58) << "Creating Routing Pad " << plugOccurrence << endl;ltracein(58); //ltrace(58) << "Creating Routing Pad " << plugOccurrence << endl;ltracein(58);
RoutingPad::create ( net, plugOccurrence ); RoutingPad::create ( net, plugOccurrence );
@ -130,7 +130,7 @@ void createRoutingPadsAndPinsRing ( Cell* top_cell )
//getting the net occurrence relative to its cell (null Path) //getting the net occurrence relative to its cell (null Path)
//in order to have plug occurrences relative to the RoutingPads-to-be //in order to have plug occurrences relative to the RoutingPads-to-be
netOccurrence = Occurrence(net); netOccurrence = Occurrence(net);
for_each_occurrence ( plugOccurrence, HyperNet(netOccurrence).getLeafPlugOccurrences() ) for_each_occurrence ( plugOccurrence, HyperNet(netOccurrence).getTerminalNetlistPlugOccurrences() )
{ {
//ltrace(58) << "Creating Routing Pad " << plugOccurrence << endl;ltracein(58); //ltrace(58) << "Creating Routing Pad " << plugOccurrence << endl;ltracein(58);
RoutingPad::create ( net, plugOccurrence ); RoutingPad::create ( net, plugOccurrence );
@ -206,7 +206,7 @@ void createPlacedRoutingPadsAndPinsRing ( Cell* top_cell )
//getting the net occurrence relative to its cell (null Path) //getting the net occurrence relative to its cell (null Path)
//in order to have plug occurrences relative to the RoutingPads-to-be //in order to have plug occurrences relative to the RoutingPads-to-be
netOccurrence = Occurrence(net); netOccurrence = Occurrence(net);
for_each_occurrence ( plugOccurrence, HyperNet(netOccurrence).getLeafPlugOccurrences() ) for_each_occurrence ( plugOccurrence, HyperNet(netOccurrence).getTerminalNetlistPlugOccurrences() )
{ {
cdebug_log(109,1) << "Creating Routing Pad " << plugOccurrence << endl; cdebug_log(109,1) << "Creating Routing Pad " << plugOccurrence << endl;
cerr << RoutingPad::create ( net, plugOccurrence, RoutingPad::BiggestArea ) << endl; cerr << RoutingPad::create ( net, plugOccurrence, RoutingPad::BiggestArea ) << endl;

View File

@ -59,19 +59,19 @@ extern "C" {
// Standart Accessors (Attributes). // Standart Accessors (Attributes).
DirectGetBoolAttribute(PyCatalogState_isFlattenLeaf,isFlattenLeaf,PyCatalogState,Catalog::State) DirectGetBoolAttribute(PyCatalogState_isTerminalNetlist,isTerminalNetlist,PyCatalogState,Catalog::State)
DirectGetBoolAttribute(PyCatalogState_isFeed ,isFeed ,PyCatalogState,Catalog::State) DirectGetBoolAttribute(PyCatalogState_isFeed ,isFeed ,PyCatalogState,Catalog::State)
DirectGetBoolAttribute(PyCatalogState_isGds ,isGds ,PyCatalogState,Catalog::State) DirectGetBoolAttribute(PyCatalogState_isGds ,isGds ,PyCatalogState,Catalog::State)
DirectGetBoolAttribute(PyCatalogState_isDelete ,isDelete ,PyCatalogState,Catalog::State) DirectGetBoolAttribute(PyCatalogState_isDelete ,isDelete ,PyCatalogState,Catalog::State)
DirectGetBoolAttribute(PyCatalogState_isPhysical ,isPhysical ,PyCatalogState,Catalog::State) DirectGetBoolAttribute(PyCatalogState_isPhysical ,isPhysical ,PyCatalogState,Catalog::State)
DirectGetBoolAttribute(PyCatalogState_isLogical ,isFlattenLeaf,PyCatalogState,Catalog::State) DirectGetBoolAttribute(PyCatalogState_isLogical ,isLogical ,PyCatalogState,Catalog::State)
DirectSetBoolAttribute(PyCatalogState_setFlattenLeaf,setFlattenLeaf,PyCatalogState,Catalog::State) DirectSetBoolAttribute(PyCatalogState_setTerminalNetlist,setTerminalNetlist,PyCatalogState,Catalog::State)
DirectSetBoolAttribute(PyCatalogState_setFeed ,setFeed ,PyCatalogState,Catalog::State) DirectSetBoolAttribute(PyCatalogState_setFeed ,setFeed ,PyCatalogState,Catalog::State)
DirectSetBoolAttribute(PyCatalogState_setGds ,setGds ,PyCatalogState,Catalog::State) DirectSetBoolAttribute(PyCatalogState_setGds ,setGds ,PyCatalogState,Catalog::State)
DirectSetBoolAttribute(PyCatalogState_setDelete ,setDelete ,PyCatalogState,Catalog::State) DirectSetBoolAttribute(PyCatalogState_setDelete ,setDelete ,PyCatalogState,Catalog::State)
DirectSetBoolAttribute(PyCatalogState_setPhysical ,setPhysical ,PyCatalogState,Catalog::State) DirectSetBoolAttribute(PyCatalogState_setPhysical ,setPhysical ,PyCatalogState,Catalog::State)
DirectSetBoolAttribute(PyCatalogState_setLogical ,setFlattenLeaf,PyCatalogState,Catalog::State) DirectSetBoolAttribute(PyCatalogState_setLogical ,setLogical ,PyCatalogState,Catalog::State)
// Standart Destroy (Attribute). // Standart Destroy (Attribute).
@ -79,7 +79,7 @@ extern "C" {
PyMethodDef PyCatalogState_Methods[] = PyMethodDef PyCatalogState_Methods[] =
{ { "isFlattenLeaf" , (PyCFunction)PyCatalogState_isFlattenLeaf, METH_NOARGS { { "isTerminalNetlist" , (PyCFunction)PyCatalogState_isTerminalNetlist, METH_NOARGS
, "Return true if the Cell must not be explored for hierarchy." } , "Return true if the Cell must not be explored for hierarchy." }
, { "isFeed" , (PyCFunction)PyCatalogState_isFeed, METH_NOARGS , { "isFeed" , (PyCFunction)PyCatalogState_isFeed, METH_NOARGS
, "Return true if the Cell is a feed through." } , "Return true if the Cell is a feed through." }
@ -91,8 +91,8 @@ extern "C" {
, "Return true if the Cell possesses a physical (layout) view." } , "Return true if the Cell possesses a physical (layout) view." }
, { "isLogical" , (PyCFunction)PyCatalogState_isLogical, METH_NOARGS , { "isLogical" , (PyCFunction)PyCatalogState_isLogical, METH_NOARGS
, "Return true if the Cell possesses a logical (netlist) view." } , "Return true if the Cell possesses a logical (netlist) view." }
, { "setFlattenLeaf", (PyCFunction)PyCatalogState_setFlattenLeaf, METH_VARARGS , { "setTerminalNetlist", (PyCFunction)PyCatalogState_setTerminalNetlist, METH_VARARGS
, "Sets/reset the FlattenLeaf flag of a Cell." } , "Sets/reset the TerminalNetlist flag of a Cell." }
, { "setFeed" , (PyCFunction)PyCatalogState_setFeed, METH_VARARGS , { "setFeed" , (PyCFunction)PyCatalogState_setFeed, METH_VARARGS
, "Sets/reset the Feed flag of a Cell." } , "Sets/reset the Feed flag of a Cell." }
, { "setGds" , (PyCFunction)PyCatalogState_setGds, METH_VARARGS , { "setGds" , (PyCFunction)PyCatalogState_setGds, METH_VARARGS
@ -137,7 +137,7 @@ extern "C" {
{ {
PyObject* constant; PyObject* constant;
LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::FlattenLeaf ,"FlattenLeaf"); LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::TerminalNetlist ,"TerminalNetlist");
LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::Feed ,"Feed"); LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::Feed ,"Feed");
LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::GDS ,"GDS"); LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::GDS ,"GDS");
LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::Delete ,"Delete"); LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::Delete ,"Delete");
@ -145,7 +145,7 @@ extern "C" {
LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::Physical ,"Physical"); LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::Physical ,"Physical");
LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::InMemory ,"InMemory"); LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::InMemory ,"InMemory");
LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::Foreign ,"Foreign"); LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::Foreign ,"Foreign");
LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::VstUseConcat,"VstUseConcat"); LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::VstUseConcat ,"VstUseConcat");
LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::Views ,"Views"); LoadObjectConstant(PyTypeCatalogState.tp_dict,Catalog::State::Views ,"Views");
} }

View File

@ -328,7 +328,7 @@ class HTree ( object ):
leafsByBuffer = {} leafsByBuffer = {}
hyperMasterClock = HyperNet.create( Occurrence(self.masterClock) ) hyperMasterClock = HyperNet.create( Occurrence(self.masterClock) )
for plugOccurrence in hyperMasterClock.getLeafPlugOccurrences(): for plugOccurrence in hyperMasterClock.getTerminalNetlistPlugOccurrences():
trace( 550, '\tAdding leaf <%s>.\n' % plugOccurrence ) trace( 550, '\tAdding leaf <%s>.\n' % plugOccurrence )
position = plugOccurrence.getBoundingBox().getCenter() position = plugOccurrence.getBoundingBox().getCenter()
self.addLeaf( position, plugOccurrence ) self.addLeaf( position, plugOccurrence )
@ -591,7 +591,7 @@ def computeAbutmentBox ( cell, spaceMargin, aspectRatio, cellGauge ):
# #
# instancesNb = 0 # instancesNb = 0
# cellLength = 0 # cellLength = 0
# for occurrence in cell.getLeafInstanceOccurrences(): # for occurrence in cell.getTerminalNetlistInstanceOccurrences():
# instance = occurrence.getEntity() # instance = occurrence.getEntity()
# instancesNb += 1 # instancesNb += 1
# cellLength += int( DbU.toLambda(instance.getMasterCell().getAbutmentBox().getWidth()) ) # cellLength += int( DbU.toLambda(instance.getMasterCell().getAbutmentBox().getWidth()) )

View File

@ -32,7 +32,7 @@ and simulator, logic synthetiser, automatic place & route and portable |CMOS|
library. It has been in used in research projects such as the 875K transistors library. It has been in used in research projects such as the 875K transistors
|StaCS| superscalar microprocessor or the 400K transistors |IEEE| gigabit |HSL| |StaCS| superscalar microprocessor or the 400K transistors |IEEE| gigabit |HSL|
router. It has been actively developped during the 1990-2000 years and is maintained router. It has been actively developped during the 1990-2000 years and is maintained
since. It's practical limit for one standard cell block (flat) is about 10K gates, since. Its practical limit for one standard cell block (flat) is about 10K gates,
above that limit you would need to use hierarchy and manually build a floorplan. above that limit you would need to use hierarchy and manually build a floorplan.
|Alliance| is entirely written in C. |Alliance| is entirely written in C.

View File

@ -360,9 +360,9 @@ arguments:
.. code-block:: sh .. code-block:: sh
ego@home:debian-9> ../../dockerManage.sh -bS # build both system & coriolis images. ego@home:debian-9> ../../dockerManage.sh -scb # build system, coriolis & bash images.
ego@home:debian-9> ../../dockerManage.sh -r # compile & check coriolis. ego@home:debian-9> ../../dockerManage.sh -r # run the bash image.
ego@home:debian-9> ../../dockerManage.sh -C # clear the images. ego@home:debian-9> ../../dockerManage.sh --remove # clear all images.

Binary file not shown.

View File

@ -52,6 +52,7 @@
.. |SL6| replace:: :sc:`Scientific Linux 6` .. |SL6| replace:: :sc:`Scientific Linux 6`
.. |SL7| replace:: :sc:`Scientific Linux 7` .. |SL7| replace:: :sc:`Scientific Linux 7`
.. |Scientific Linux| replace:: :sc:`Scientific Linux` .. |Scientific Linux| replace:: :sc:`Scientific Linux`
.. |CentOS| replace:: :sc:`CentOS`
.. |RedHat| replace:: :sc:`RedHat` .. |RedHat| replace:: :sc:`RedHat`
.. |Fedora| replace:: :sc:`Fedora` .. |Fedora| replace:: :sc:`Fedora`
.. |FC13| replace:: :sc:`fc13` .. |FC13| replace:: :sc:`fc13`
@ -144,6 +145,12 @@
.. |PyQt| replace:: :sc:`PyQt` .. |PyQt| replace:: :sc:`PyQt`
.. |PyQt4| replace:: :sc:`PyQt4` .. |PyQt4| replace:: :sc:`PyQt4`
.. |PyQt5| replace:: :sc:`PyQt5` .. |PyQt5| replace:: :sc:`PyQt5`
.. |UID| replace:: :sc:`uid`
.. |UID| replace:: :sc:`uid`
.. |GID| replace:: :sc:`gid`
.. |root| replace:: :cb:`root`
.. |GID| replace:: :sc:`gid`
.. |root| replace:: :cb:`root`
.. |tty| replace:: :cb:`tty` .. |tty| replace:: :cb:`tty`
.. |svn| replace:: :cb:`svn` .. |svn| replace:: :cb:`svn`
.. |git| replace:: :cb:`git` .. |git| replace:: :cb:`git`

View File

@ -55,6 +55,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item " href="./pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item " href="./pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="./pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="./pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item " href="./pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</li> </li>
@ -81,6 +82,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item " href="./pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item " href="./pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="./pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="./pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item " href="./pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</div> </div>

View File

@ -55,6 +55,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item " href="./pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item " href="./pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="./pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="./pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item " href="./pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</li> </li>
@ -81,6 +82,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item " href="./pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item " href="./pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="./pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="./pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item " href="./pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</div> </div>

View File

@ -55,6 +55,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item " href="./pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item " href="./pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="./pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="./pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item " href="./pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</li> </li>
@ -81,6 +82,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item " href="./pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item " href="./pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="./pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="./pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item " href="./pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</div> </div>

View File

@ -55,6 +55,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item " href="./pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item " href="./pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="./pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="./pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item " href="./pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</li> </li>
@ -81,6 +82,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item " href="./pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item " href="./pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="./pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="./pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item " href="./pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</div> </div>

View File

@ -55,6 +55,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</li> </li>
@ -81,6 +82,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</div> </div>

View File

@ -55,6 +55,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</li> </li>
@ -81,6 +82,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</div> </div>

View File

@ -55,6 +55,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</li> </li>
@ -81,6 +82,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</div> </div>

View File

@ -55,6 +55,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item active" href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item active" href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</li> </li>
@ -81,6 +82,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item active" href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item active" href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</div> </div>

View File

@ -0,0 +1,302 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Contents Installation in a chrooted Environment Setting up the chrooted root directory Configure schroot Installing Packages in Debian 9 Creating a Duplicate User Installation of Alliance / Coriolis ...">
<meta name="keywords" content="">
<link rel="icon" href="../favicon.ico">
<title>Install Cases - Coriolis VLSI CAD Tools [offline]</title>
<!-- Stylesheets -->
<link href="../theme/css/bootstrap.css" rel="stylesheet">
<link href="../theme/css/fonts.css" rel="stylesheet">
<link href="../theme/css/nest.css" rel="stylesheet">
<link href="../theme/css/pygment.css" rel="stylesheet">
<link href="../theme/css/coriolis.css" rel="stylesheet">
<!-- /Stylesheets -->
<script src="../theme/js/jquery.min.js"></script>
<script src="../theme/js/bootstrap.min.js"></script>
<!-- RSS Feeds -->
<!-- /RSS Feeds -->
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
<!-- Header -->
<div class="header-container" style="background: linear-gradient(rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.2)), url('../images/common/layout-motif-faded-4.png'); background-position: center; ">
<!--
<div class="container">
<nav class="navbar navbar-default">
<div class="container-fluid">
<div class="navbar-header">
<a class="navbar-brand" href="../"><img class="mr20" src="../images/common/Coriolis-logo-white-4-small.png" alt="logo">Coriolis VLSI CAD Tools [offline]</a>
</div>
<ul class="nav navbar-nav">
<li><a href="../pages/gitlab.html">Git</a></li>
<li><a href="../pages/documentation.html">Documentation</a></li>
<li class="dropdown">
<button class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
<span class="caret"></span>Topics
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item active" href="../pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul>
</li>
</ul>
</div>
</nav>
</div> <!-- navbar container -->
-->
<!-- Static navbar -->
<div class="container">
<div class="header-nav">
<div class="header-logo">
<a class="pull-left" href="../"><img class="mr20" src="../images/common/Coriolis-logo-white-4-small.png" alt="logo">Coriolis VLSI CAD Tools [offline]</a>
</div>
<div class="nav pull-right">
<a href="../pages/gitlab.html">Git</a>
<a href="../pages/documentation.html">Documentation</a>
</div>
<div class="nav pull-right">
<div class="dropdown">
<button class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
<span class="caret"></span>Topics
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item active" href="../pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul>
</div>
</div>
</div>
</div>
<!-- /Static navbar -->
<!-- Header -->
<div class="container header-wrapper">
<div class="row">
<div class="col-lg-12">
<div class="header-content">
<a href="https://www.lip6.fr/"><img class="mr20" height="60px" src="../images/common/LogoLIP6Blanc.png" alt="LIP6"></a>
<a href="https://www.sorbonne-universite.fr/"><img class="mr20" height="60px" src="../images/common/logo-SU-blanc-700px.png" alt="Sorbonne Universite"></a>
<a href="https://www.cnrs.fr/"><img class="mr20" height="60px" src="../images/common/LOGO-cnrs-white-large.png" alt="CNRS"></a>
<h1 class="header-title text-uppercase">Install Cases</h1>
<div class="header-underline"></div>
</div>
</div>
</div>
</div>
<!-- /Header -->
</div>
<!-- /Header -->
<!-- Content -->
<div class="container content">
<!-- -*- Mode: rst -*- -->
<div class="contents topic" id="contents">
<p class="topic-title first">Contents</p>
<ul class="simple">
<li><a class="reference internal" href="#installation-in-a-chrooted-environment" id="id2">Installation in a <em>chrooted</em> Environment</a><ul>
<li><a class="reference internal" href="#setting-up-the-chrooted-root-directory" id="id3">Setting up the <em>chrooted</em> root directory</a></li>
<li><a class="reference internal" href="#configure-schroot" id="id4">Configure <tt class="docutils literal">schroot</tt></a></li>
<li><a class="reference internal" href="#installing-packages-in-debian-9" id="id5">Installing Packages in Debian 9</a></li>
<li><a class="reference internal" href="#creating-a-duplicate-user" id="id6">Creating a Duplicate User</a></li>
<li><a class="reference internal" href="#installation-of-alliance-coriolis" id="id7">Installation of <span class="sc">Alliance</span> / <span class="sc">Coriolis</span></a></li>
</ul>
</li>
</ul>
</div>
<!-- -*- Mode: rst; explicit-buffer-name: "definition.rst<documentation/etc>" -*- -->
<!-- HTML/LaTeX backends mixed macros. -->
<!-- Acronyms & names. -->
<!-- URLs -->
<!-- Standard CAO/VLSI Concepts. -->
<!-- Alliance & MBK Concepts -->
<!-- Hurricane Concepts. -->
<div class="section" id="installation-in-a-chrooted-environment">
<h2><a class="toc-backref" href="#id2">Installation in a <em>chrooted</em> Environment</a></h2>
<p>In this case, we will setup a Debian 9 installation of Alliance/Coriolis under
a <span class="sc">Scientific Linux</span> 7 <span class="sc">os</span>. This should also work for <span class="sc">rhel</span> or <span class="sc">CentOS</span>.</p>
<p>Debian 9 will be referred as the <em>guest OS</em> or the <em>chrooted</em>.
<span class="sc">Scientific Linux</span> will be referred as the <em>host OS</em>.</p>
<div class="section" id="setting-up-the-chrooted-root-directory">
<h3><a class="toc-backref" href="#id3">Setting up the <em>chrooted</em> root directory</a></h3>
<p>We need the <tt class="docutils literal">debootstrap</tt> and <tt class="docutils literal">schroot</tt> packages (from the <span class="sc">epel</span> repository).</p>
<div class="highlight"><pre><span></span>root@pc:~# yum install debootstrap schroot
</pre></div>
<p>On the <strong>host</strong> <span class="sc">os</span>, as the <span class="cb">root</span> user, create the directory into which the
whole <em>chrooted</em> <span class="sc">os</span> will reside:</p>
<div class="highlight"><pre><span></span>root@pc:~# mkdir -p /home/chroot/debian9.coriolis
root@pc:~# debootstrap stretch /home/chroot/debian9.coriolis http://ftp.us.debian.org/debian
root@pc:~# <span class="nb">echo</span> <span class="s2">&quot;debian9.coriolis&quot;</span> &gt; /home/chroot/debian9.coriolis/etc/debian_chroot
</pre></div>
<p>Then, we need to give access the <em>chrooted</em> distribution to some kernel filesystem
of the host, namely <tt class="docutils literal">dev</tt>, <tt class="docutils literal">proc</tt>, <tt class="docutils literal">sys</tt> &amp; <tt class="docutils literal">tmp</tt>. On the <em>host</em> filesytem,
add to <tt class="docutils literal">/etc/fstab</tt>:</p>
<div class="highlight"><pre><span></span># Your host normal mounts.
# ...
# For Jail chroot of Debian9.
/dev /home/chroot/debian9.coriolis/dev none bind 0 0
/dev/pts /home/chroot/debian9.coriolis/dev/pts none bind 0 0
/proc /home/chroot/debian9.coriolis/proc none bind 0 0
/sys /home/chroot/debian9.coriolis/sys none bind 0 0
/tmp /home/chroot/debian9.coriolis/tmp none bind 0 0
</pre></div>
<p>Mount them:</p>
<div class="highlight"><pre><span></span>root@pc:~# mount -a
</pre></div>
</div>
<div class="section" id="configure-schroot">
<h3><a class="toc-backref" href="#id4">Configure <tt class="docutils literal">schroot</tt></a></h3>
<p>Edit <tt class="docutils literal">/etc/schroot.d/schroot.conf</tt> as follow:</p>
<div class="highlight"><pre><span></span>[debian9.coriolis]
description=Debian 9 stretch
directory=/home/chroot/debian9.coriolis
users=ego
</pre></div>
<div class="note">
<p class="first admonition-title">Note</p>
<p><strong>Users in the schrooted environment.</strong> They must exists on both the host
system <strong>and</strong> in the chrooted one. It is best if they also have the same
<span class="sc">uid</span> / <span class="sc">gid</span> and home directories (relative to their respectives root).
For example, for a <tt class="docutils literal">ego</tt> user:</p>
<table class="last table">
<colgroup>
<col width="57%" />
<col width="43%" />
</colgroup>
<thead valign="bottom">
<tr><th class="head">On the Host</th>
<th class="head">In the <em>chrooted</em> <span class="sc">os</span></th>
</tr>
</thead>
<tbody valign="top">
<tr><td><tt class="docutils literal">/home/ego</tt></td>
<td>N/A</td>
</tr>
<tr><td><tt class="docutils literal">/home/chroot/debian9.coriolis/home/ego</tt></td>
<td><tt class="docutils literal">/home/ego</tt></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="section" id="installing-packages-in-debian-9">
<h3><a class="toc-backref" href="#id5">Installing Packages in Debian 9</a></h3>
<p>Now that <tt class="docutils literal">schroot</tt> is set, we can log in the guest <span class="sc">os</span> as <tt class="docutils literal">root</tt> and add the
minimal needed package set to build <span class="sc">Alliance</span> / <span class="sc">Coriolis</span>.</p>
<div class="highlight"><pre><span></span>root@pc:~# schroot -c debian9.coriolis -u root
<span class="o">(</span>debian9.coriolis<span class="o">)</span>root@pc:~# <span class="nb">export</span> <span class="nv">DEBIAN_FRONTEND</span><span class="o">=</span>noninteractive
<span class="o">(</span>debian9.coriolis<span class="o">)</span>root@pc:~# apt-get update
<span class="o">(</span>debian9.coriolis<span class="o">)</span>root@pc:~# apt-get -y install build-essential binutils-dev <span class="se">\</span>
git cmake bison flex gcc python-dev <span class="se">\</span>
libboost-all-dev libboost-python-dev <span class="se">\</span>
zlib1g-dev libxml2-dev rapidjson-dev <span class="se">\</span>
libbz2-dev <span class="se">\</span>
qt4-dev-tools libqwt-dev python-qt4 <span class="se">\</span>
autotools-dev automake <span class="se">\</span>
libxt-dev libxpm-dev libmotif-dev <span class="se">\</span>
yosys <span class="se">\</span>
vim
<span class="o">(</span>debian9.coriolis<span class="o">)</span>root@pc:~# apt-get clean
</pre></div>
</div>
<div class="section" id="creating-a-duplicate-user">
<h3><a class="toc-backref" href="#id6">Creating a Duplicate User</a></h3>
<p>As stated before, we must create in the guest <span class="sc">os</span> a user that also exist on the
host <span class="sc">os</span>, and with the same <span class="sc">uid</span> and home directory. Here we assume that <tt class="docutils literal">ego</tt>
has an <span class="sc">uid</span> of 20000.</p>
<div class="highlight"><pre><span></span><span class="o">(</span>debian9.coriolis<span class="o">)</span>root@pc:~# adduser --uid <span class="m">20000</span> ego
Adding user <span class="sb">`</span>ego<span class="s1">&#39; ...</span>
<span class="s1"> Adding new group `ego&#39;</span> <span class="o">(</span>20000<span class="o">)</span> ...
Adding new user <span class="sb">`</span>ego<span class="s1">&#39; (20000) with group `ego&#39;</span> ...
Creating home directory <span class="sb">`</span>/home/ego<span class="s1">&#39; ...</span>
<span class="s1"> Copying files from `/etc/skel&#39;</span> ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information <span class="k">for</span> ego
Enter the new value, or press ENTER <span class="k">for</span> the default
Full Name <span class="o">[]</span>: Me Myself and I
Room Number <span class="o">[]</span>: 404
Work Phone <span class="o">[]</span>: <span class="m">666</span> <span class="m">666</span> 666
Home Phone <span class="o">[]</span>: 3615
Other <span class="o">[]</span>:
Is the information correct? <span class="o">[</span>Y/n<span class="o">]</span> Y
<span class="o">(</span>debian9.coriolis<span class="o">)</span>root@pc:~#
</pre></div>
</div>
<div class="section" id="installation-of-alliance-coriolis">
<h3><a class="toc-backref" href="#id7">Installation of <span class="sc">Alliance</span> / <span class="sc">Coriolis</span></a></h3>
<p>Download the installer script: <a class="reference external" href="../scripts/socInstaller.py">socInstaller.py</a>. And put it in the home
directory of the user <tt class="docutils literal">ego</tt> in the guest <span class="sc">os</span>.</p>
<div class="note">
<p class="first admonition-title">Note</p>
<p class="last">As it is more easier to download it from the host <span class="sc">os</span>, you may do
so and just copy it under <tt class="docutils literal">/home/chroot/debian9.coriolis/home/ego</tt>.
As they share the same <span class="sc">uid</span>, the copy is allowed.</p>
</div>
<p>Now we can connect as the <tt class="docutils literal">ego</tt> user on the guest <span class="sc">os</span>:</p>
<div class="highlight"><pre><span></span>ego@pc:~&gt; schroot -c debian9.coriolis -u ego
<span class="o">(</span>debian9.coriolis<span class="o">)</span>jpc@pc:~&gt; ./socInstaller.py --chroot --profile<span class="o">=</span>Debian9 <span class="se">\</span>
--do-alliance --do-coriolis
</pre></div>
</div>
</div>
</div>
<!-- /Content -->
<!-- Footer -->
<div class="footer gradient-2">
<div class="container footer-container ">
<div class="row">
<div class="col-xs-4 col-sm-3 col-md-3 col-lg-3">
<div class="footer-title">Social</div>
<ul class="list-unstyled">
</ul>
</div>
<div class="col-xs-4 col-sm-3 col-md-3 col-lg-2">
</div>
<div class="col-xs-4 col-sm-3 col-md-3 col-lg-3">
<div class="footer-title">Links</div>
<ul class="list-unstyled">
<li><a href="https://coriolis.lip6.fr/" target="_blank">Alliance/Coriolis</a></li>
<li><a href="https://www-soc.lip6.fr/" target="_blank">CIAN Team Website</a></li>
<li><a href="https://f-si.org" target="_blank">Free Silicon Foundation</a></li>
</ul>
</div>
<div class="col-xs-12 col-sm-3 col-md-3 col-lg-4">
<p class="pull-right text-right">
<small><em>Proudly powered by <a href="http://docs.getpelican.com/" target="_blank">pelican</a></em></small><br/>
<small><em><span class="sc">NEST</span> theme by <a href="https://github.com/molivier" target="_blank">molivier</a></em></small><br/>
<small>Copyright © 2020-2020 Sorbonne Universite</small>
</p>
</div>
</div>
</div>
</div>
<!-- /Footer -->
</body>
</html>

View File

@ -55,6 +55,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</li> </li>
@ -81,6 +82,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</div> </div>

View File

@ -55,6 +55,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</li> </li>
@ -81,6 +82,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</div> </div>

View File

@ -55,6 +55,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</li> </li>
@ -81,6 +82,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</div> </div>

View File

@ -55,6 +55,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</li> </li>
@ -81,6 +82,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</div> </div>

View File

@ -55,6 +55,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</li> </li>
@ -81,6 +82,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</div> </div>

View File

@ -55,6 +55,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</li> </li>
@ -81,6 +82,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</div> </div>

View File

@ -55,6 +55,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</li> </li>
@ -81,6 +82,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</div> </div>

View File

@ -55,6 +55,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item active" href="../pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item active" href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</li> </li>
@ -81,6 +82,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item active" href="../pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item active" href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</div> </div>

View File

@ -55,6 +55,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</li> </li>
@ -81,6 +82,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item " href="../pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="../pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item " href="../pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</div> </div>
@ -551,9 +553,9 @@ configuration file to see exactly how to setup a vanilla system to build
<span class="sc">Coriolis</span>.</p> <span class="sc">Coriolis</span>.</p>
<p>To run the docker tests, call the <tt class="docutils literal">dockerManage.sh</tt> scripts with the relevant <p>To run the docker tests, call the <tt class="docutils literal">dockerManage.sh</tt> scripts with the relevant
arguments:</p> arguments:</p>
<div class="highlight"><pre><span></span>ego@home:debian-9&gt; ../../dockerManage.sh -bS <span class="c1"># build both system &amp; coriolis images.</span> <div class="highlight"><pre><span></span>ego@home:debian-9&gt; ../../dockerManage.sh -scb <span class="c1"># build system, coriolis &amp; bash images.</span>
ego@home:debian-9&gt; ../../dockerManage.sh -r <span class="c1"># compile &amp; check coriolis.</span> ego@home:debian-9&gt; ../../dockerManage.sh -r <span class="c1"># run the bash image.</span>
ego@home:debian-9&gt; ../../dockerManage.sh -C <span class="c1"># clear the images.</span> ego@home:debian-9&gt; ../../dockerManage.sh --remove <span class="c1"># clear all images.</span>
</pre></div> </pre></div>
</div> </div>
<div class="section" id="packaging-coriolis"> <div class="section" id="packaging-coriolis">

Binary file not shown.

View File

@ -0,0 +1,631 @@
#!/usr/bin/env python
#
# -*- mode:Python -*-
#
# This file is part of the Coriolis Software.
# Copyright (c) UPMC 2015-2018, All Rights Reserved
#
# +-----------------------------------------------------------------+
# | C O R I O L I S |
# | C o r i o l i s I n s t a l l e r |
# | |
# | Authors : Jean-Paul Chaput |
# | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
# | =============================================================== |
# | Python : "./socInstaller.py" |
# +-----------------------------------------------------------------+
#
# WARNING:
# This script has been designed only for internal use in the
# LIP6/CIAN department. If you want to use it you will need to
# change the hardwired configuration.
showTrace = True
try:
import sys
import os.path
import shutil
import optparse
import time
import traceback
import distutils.sysconfig
import subprocess
import socket
import re
import bz2
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
except ImportError, e:
module = str(e).split()[-1]
class ErrorMessage ( Exception ):
def __init__ ( self, code, *arguments ):
self._code = code
self._errors = [ 'Malformed call to ErrorMessage()', '%s' % str(arguments) ]
text = None
if len(arguments) == 1:
if isinstance(arguments[0],Exception): text = str(arguments[0]).split('\n')
else:
self._errors = arguments[0]
elif len(arguments) > 1:
text = list(arguments)
if text:
self._errors = []
while len(text[0]) == 0: del text[0]
lstrip = 0
if text[0].startswith('[ERROR]'): lstrip = 8
for line in text:
if line[0:lstrip ] == ' '*lstrip or \
line[0:lstrip-1] == '[ERROR]':
self._errors += [ line[lstrip:] ]
else:
self._errors += [ line.lstrip() ]
return
def __str__ ( self ):
if not isinstance(self._errors,list):
return "[ERROR] %s" % self._errors
formatted = "\n"
for i in range(len(self._errors)):
if i == 0: formatted += "[ERROR] %s" % self._errors[i]
else: formatted += " %s" % self._errors[i]
if i+1 < len(self._errors): formatted += "\n"
return formatted
def addMessage ( self, message ):
if not isinstance(self._errors,list):
self._errors = [ self._errors ]
if isinstance(message,list):
for line in message:
self._errors += [ line ]
else:
self._errors += [ message ]
return
def terminate ( self ):
print self
sys.exit(self._code)
@property
def code ( self ): return self._code
class BadBinary ( ErrorMessage ):
def __init__ ( self, binary ):
ErrorMessage.__init__( self, 1, "Binary not found: <%s>." % binary )
return
class BadReturnCode ( ErrorMessage ):
def __init__ ( self, status ):
ErrorMessage.__init__( self, 1, "Command returned status:%d." % status )
return
class Command ( object ):
def __init__ ( self, arguments, fdLog=None ):
self.arguments = arguments
self.fdLog = fdLog
if self.fdLog != None and not isinstance(self.fdLog,file):
print '[WARNING] Command.__init__(): <fdLog> is neither None or a file.'
return
def _argumentsToStr ( self, arguments ):
s = ''
for argument in arguments:
if argument.find(' ') >= 0: s += ' "' + argument + '"'
else: s += ' ' + argument
return s
def log ( self, text ):
print text[:-1]
sys.stdout.flush()
sys.stderr.flush()
if isinstance(self.fdLog,file):
self.fdLog.write( text )
self.fdLog.flush()
return
def execute ( self ):
global conf
sys.stdout.flush()
sys.stderr.flush()
homeDir = os.environ['HOME']
workDir = os.getcwd()
if homeDir.startswith(homeDir):
workDir = '~' + workDir[ len(homeDir) : ]
user = 'root'
if os.environ.has_key('USER'): user = os.environ['USER']
prompt = '%s@%s:%s$' % (user,conf.masterHost,workDir)
try:
self.log( '%s%s\n' % (prompt,self._argumentsToStr(self.arguments)) )
print self.arguments
child = subprocess.Popen( self.arguments, stdout=subprocess.PIPE, stderr=subprocess.STDOUT )
while True:
line = child.stdout.readline()
if not line: break
self.log( line )
except OSError, e:
raise BadBinary( self.arguments[0] )
(pid,status) = os.waitpid( child.pid, 0 )
status >>= 8
if status != 0:
raise BadReturnCode( status )
return
class CommandArg ( object ):
def __init__ ( self, command, wd=None, host=None, fdLog=None ):
self.command = command
self.host = host
self.wd = wd
self.fdLog = fdLog
return
def __str__ ( self ):
s = ''
if self.wd: s = 'cd %s && ' % self.wd
for i in range(len(self.command)):
if i: s += ' '
s += self.command[i]
return s
def getArgs ( self ):
if not self.host: return self.command
return [ 'ssh', self.host, str(self) ]
def execute ( self ):
if not self.host and self.wd: os.chdir( self.wd )
Command( self.getArgs(), self.fdLog ).execute()
return
class AllianceCommand ( CommandArg ):
def __init__ ( self, alcBin, fdLog=None ):
CommandArg.__init__ ( self, [ alcBin ], fdLog=fdLog )
return
class CoriolisCommand ( CommandArg ):
def __init__ ( self, ccbBin, rootDir, threads=1, otherArgs=[], fdLog=None ):
CommandArg.__init__ ( self, [ ccbBin
, '--root='+rootDir
, '--project=coriolis'
, '--make=-j%d install' % threads
] + otherArgs
, fdLog=fdLog )
return
class BenchsCommand ( CommandArg ):
def __init__ ( self, benchsDir, fdLog=None ):
CommandArg.__init__ ( self, [ '../bin/go.sh' ], wd=benchsDir, fdLog=fdLog )
return
class GitRepository ( object ):
@staticmethod
def getLocalRepository ( url ):
localRepo = url.split( '/' )[-1]
if localRepo.endswith('.git'):
localRepo = localRepo[:-4]
return localRepo
def __init__ ( self, url, cloneDir, fdLog=None ):
self.url = url
self.cloneDir = cloneDir
self.localRepo = GitRepository.getLocalRepository( url )
self.fdLog = fdLog
return
@property
def localRepoDir ( self ): return self.cloneDir+'/'+self.localRepo
def removeLocalRepo ( self ):
if os.path.isdir(self.localRepoDir):
print 'Removing Git local repository: <%s>' % self.localRepoDir
shutil.rmtree( self.localRepoDir )
return
def clone ( self ):
print 'Clone/pull from:', self.url
if not os.path.isdir(self.cloneDir):
os.makedirs( self.cloneDir )
if not os.path.isdir(self.localRepoDir):
os.chdir( self.cloneDir )
Command( [ 'git', 'clone', self.url ], self.fdLog ).execute()
else:
os.chdir( self.localRepoDir )
Command( [ 'git', 'pull' ], self.fdLog ).execute()
return
def checkout ( self, branch ):
os.chdir( self.localRepoDir )
Command( [ 'git', 'checkout', branch ], self.fdLog ).execute()
return
class Configuration ( object ):
PrimaryNames = \
[ 'sender' , 'receivers'
, 'coriolisRepo', 'benchsRepo' , 'supportRepos'
, 'homeDir' , 'masterHost'
, 'debugArg' , 'nightlyMode', 'dockerMode', 'chrootMode'
, 'rmSource' , 'rmBuild'
, 'doGit' , 'doAlliance' , 'doCoriolis', 'doBenchs', 'doSendReport'
, 'success' , 'rcode'
]
SecondaryNames = \
[ 'rootDir', 'srcDir', 'logDir', 'logs', 'fds', 'alcBin', 'ccbBin', 'benchsDir'
]
def __init__ ( self ):
self._sender = 'Jean-Paul.Chaput@soc.lip6.fr'
self._receivers = [ 'Jean-Paul.Chaput@lip6.fr', ]
self._supportRepos = [ 'http://github.com/miloyip/rapidjson' ]
self._allianceRepo = 'https://gitlab.lip6.fr/jpc/alliance.git'
self._coriolisRepo = 'https://gitlab.lip6.fr/jpc/coriolis.git'
self._benchsRepo = 'https://gitlab.lip6.fr/jpc/alliance-check-toolkit.git'
self._homeDir = os.environ['HOME']
self._debugArg = ''
self._rmSource = False
self._rmBuild = False
self._doGit = True
self._doCoriolis = False
self._doAlliance = False
self._doBenchs = False
self._doSendReport = False
self._nightlyMode = False
self._dockerMode = False
self._chrootMode = None
self._logs = { 'alliance':None, 'coriolis':None, 'benchs':None }
self._fds = { 'alliance':None, 'coriolis':None, 'benchs':None }
self._ccbBin = None
self._benchsDir = None
self._masterHost = self._detectMasterHost()
self._success = False
self._rcode = 0
self._updateSecondaries()
return
def __setattr__ ( self, attribute, value ):
if attribute in Configuration.SecondaryNames:
print ErrorMessage( 1, 'Attempt to write in read-only attribute <%s> in Configuration.'%attribute )
return
if attribute == 'masterHost' or attribute == '_masterHost':
if value == 'lepka':
print 'Never touch the Git tree when running on <lepka>.'
self._rmSource = False
self._rmBuild = False
self._doGit = False
self._doSendReport = False
if attribute[0] == '_':
self.__dict__[attribute] = value
return
if attribute == 'homeDir': value = os.path.expanduser(value)
self.__dict__['_'+attribute] = value
self._updateSecondaries()
return
def __getattr__ ( self, attribute ):
if attribute[0] != '_': attribute = '_'+attribute
if not self.__dict__.has_key(attribute):
raise ErrorMessage( 1, 'Configuration has no attribute <%s>.'%attribute )
return self.__dict__[attribute]
def _updateSecondaries ( self ):
if self._nightlyMode:
self._rootDir = self._homeDir + '/nightly/coriolis-2.x'
else:
self._rootDir = self._homeDir + '/coriolis-2.x'
self._srcDir = self._rootDir + '/src'
self._logDir = self._srcDir + '/logs'
self._alcBin = self._srcDir + '/' + GitRepository.getLocalRepository(self._coriolisRepo) + '/bootstrap/allianceInstaller.sh'
self._ccbBin = self._srcDir + '/' + GitRepository.getLocalRepository(self._coriolisRepo) + '/bootstrap/ccb.py'
self._benchsDir = self._srcDir + '/' + GitRepository.getLocalRepository(self._benchsRepo ) + '/benchs'
self._masterHost = self._detectMasterHost()
return
def _detectMasterHost ( self ):
if self._chrootMode is None: return 'unknown'
if self._chrootMode: return 'chrooted-host'
masterHost = 'unknown'
hostname = socket.gethostname()
hostAddr = socket.gethostbyname(hostname)
if hostname == 'lepka' and hostAddr == '127.0.0.1':
masterHost = 'lepka'
else:
masterHost = hostname.split('.')[0]
return masterHost
def openLog ( self, stem ):
if not os.path.isdir(self._logDir):
os.makedirs( self._logDir )
index = 0
timeTag = time.strftime( "%Y.%m.%d" )
while True:
logFile = os.path.join(self._logDir,"%s-%s-%02d.log" % (stem,timeTag,index))
if not os.path.isfile(logFile):
print "Report log: <%s>" % logFile
break
index += 1
fd = open( logFile, "w" )
self._logs[stem] = logFile
self._fds [stem] = fd
return
def closeLogs ( self ):
for fd in self._fds.values():
if fd: fd.close()
return
def compressLogs ( self ):
for log in self._logs.values():
if not log: continue
fd = open( log, 'r' )
bzfd = bz2.BZ2File( log+'.bz2', 'w' )
for line in fd.readlines(): bzfd.write( line )
bzfd.close()
fd.close()
os.unlink( log )
return
def getCommands ( self, target ):
commands = []
if self.doAlliance:
if not os.path.isfile( self.alcBin ):
raise ErrorMessage( 1, [ 'Cannot find <allianceInstaller.sh>, should be here:'
, ' <%s>' % self.alcBin
] )
commands.append( AllianceCommand( self.alcBin, fdLog=self.fds['alliance'] ) )
if self.doCoriolis:
if not os.path.isfile( self.ccbBin ):
raise ErrorMessage( 1, [ 'Cannot find <ccb.py>, should be here:'
, ' <%s>' % self.ccbBin
] )
otherArgs = []
if self.debugArg: otherArgs.append( self.debugArg )
if target == 'SL7_64':
otherArgs.append( '--project=support' )
commands.append( CoriolisCommand( self.ccbBin, self.rootDir, 3, otherArgs , fdLog=self.fds['coriolis'] ) )
commands.append( CoriolisCommand( self.ccbBin, self.rootDir, 1, otherArgs+['--doc'], fdLog=self.fds['coriolis'] ) )
elif target == 'SL6_64' or target == 'SL6':
otherArgs.append( '--project=support' )
otherArgs.append( '--devtoolset=8' )
commands.append( CoriolisCommand( self.ccbBin, self.rootDir, 6, otherArgs , fdLog=self.fds['coriolis'] ) )
commands.append( CoriolisCommand( self.ccbBin, self.rootDir, 1, otherArgs+['--doc'], fdLog=self.fds['coriolis'] ) )
elif target == 'Ubuntu18' or target == 'Debian9':
if target == 'Ubuntu18': otherArgs.append( '--qt5' )
commands.append( CoriolisCommand( self.ccbBin, self.rootDir, 3, otherArgs, fdLog=self.fds['coriolis'] ) )
if self.doBenchs:
commands.append( BenchsCommand( self.benchsDir, fdLog=self.fds['benchs'] ) )
return commands
class Report ( object ):
def __init__ ( self, conf ):
self.conf = conf
commaspace = ', '
date = time.strftime( "%A %d %B %Y" )
stateText = 'FAILED'
modeText = 'SoC installation'
if self.conf.success: stateText = 'SUCCESS'
if self.conf.nightlyMode: modeText = 'Nightly build'
self.message = MIMEMultipart()
self.message['Subject'] = '[%s] Coriolis %s %s' % (stateText,modeText,date)
self.message['From' ] = self.conf.sender
self.message['To' ] = commaspace.join( self.conf.receivers )
self.attachements = []
self.mainText = '\n'
self.mainText += 'Salut le Crevard,\n'
self.mainText += '\n'
if self.conf.nightlyMode:
self.mainText += 'This is the nightly build report of Coriolis.\n'
else:
self.mainText += 'SoC installer report of Coriolis.\n'
self.mainText += '%s\n' % date
self.mainText += '\n'
if self.conf.success:
self.mainText += 'Build was SUCCESSFUL\n'
else:
self.mainText += 'Build has FAILED, please have a look to the attached log file(s).\n'
self.mainText += '\n'
self.mainText += 'Complete log file(s) can be found here:\n'
return
def attachLog ( self, logFile ):
if not logFile: return
fd = open( logFile, 'rb' )
try:
fd.seek( -1024*100, os.SEEK_END )
except IOError, e:
pass
tailLines = ''
for line in fd.readlines()[1:]:
tailLines += line
fd.close()
self.mainText += ' <%s>\n' % logFile
attachement = MIMEApplication(tailLines)
attachement.add_header( 'Content-Disposition', 'attachment', filename=os.path.basename(logFile) )
self.attachements.append( attachement )
return
def send ( self ):
self.message.attach( MIMEText(self.mainText) )
for attachement in self.attachements:
self.message.attach( attachement )
print "Sending mail report to:"
for receiver in self.conf.receivers: print ' <%s>' % receiver
session = smtplib.SMTP( 'localhost' )
session.sendmail( self.conf.sender, self.conf.receivers, self.message.as_string() )
session.quit()
return
# -------------------------------------------------------------------
# <socInstaller> Main Part.
parser = optparse.OptionParser ()
parser.add_option ( "--debug" , action="store_true" , dest="debug" , help="Build a <Debug> aka (-g) version." )
parser.add_option ( "--no-git" , action="store_true" , dest="noGit" , help="Do not pull/update Git repositories before building." )
parser.add_option ( "--do-alliance" , action="store_true" , dest="doAlliance" , help="Rebuild the Alliance tools." )
parser.add_option ( "--do-coriolis" , action="store_true" , dest="doCoriolis" , help="Rebuild the Coriolis tools." )
parser.add_option ( "--do-report" , action="store_true" , dest="doReport" , help="Send a final report." )
parser.add_option ( "--nightly" , action="store_true" , dest="nightly" , help="Perform a nighly build." )
parser.add_option ( "--docker" , action="store_true" , dest="docker" , help="Perform a build inside a docker container." )
parser.add_option ( "--chroot" , action="store_true" , dest="chroot" , help="Perform a build inside a chrooted environment." )
parser.add_option ( "--benchs" , action="store_true" , dest="benchs" , help="Run the <alliance-checker-toolkit> sanity benchs." )
parser.add_option ( "--rm-build" , action="store_true" , dest="rmBuild" , help="Remove the build/install directories." )
parser.add_option ( "--rm-source" , action="store_true" , dest="rmSource" , help="Remove the Git source repositories." )
parser.add_option ( "--rm-all" , action="store_true" , dest="rmAll" , help="Remove everything (source+build+install)." )
parser.add_option ( "--root" , action="store" , type="string", dest="rootDir" , help="The root directory (default: <~/coriolis-2.x/>)." )
parser.add_option ( "--profile" , action="store" , type="string", dest="profile" , help="The targeted OS for the build." )
(options, args) = parser.parse_args ()
conf = Configuration()
try:
if options.debug: conf.debugArg = '--debug'
if options.nightly: conf.nightlyMode = True
if options.docker: conf.dockerMode = True
if options.chroot: conf.chrootMode = True
if options.noGit: conf.doGit = False
if options.doCoriolis: conf.doCoriolis = True
if options.doAlliance: conf.doAlliance = True
if options.benchs: conf.doBenchs = True
if options.doReport: conf.doSendReport = True
if options.rmSource or options.rmAll: conf.rmSource = True
if options.rmBuild or options.rmAll: conf.rmBuild = True
if conf.doAlliance: conf.openLog( 'alliance' )
if conf.doCoriolis: conf.openLog( 'coriolis' )
if conf.doBenchs: conf.openLog( 'benchs' )
if conf.dockerMode: os.environ['USER'] = 'root'
gitSupports = []
for supportRepo in conf.supportRepos:
gitSupports.append( GitRepository( supportRepo, conf.srcDir+'/support' ) )
gitCoriolis = GitRepository( conf.coriolisRepo, conf.srcDir, conf.fds['coriolis'] )
gitBenchs = GitRepository( conf.benchsRepo , conf.srcDir, conf.fds['coriolis'] )
if conf.doAlliance:
gitAlliance = GitRepository( conf.allianceRepo, conf.srcDir, conf.fds['alliance'] )
if conf.doGit:
for gitSupport in gitSupports:
if conf.rmSource: gitSupport.removeLocalRepo()
gitSupport.clone()
#if gitSupport.url.endswith('rapidjson'):
# gitSupport.checkout( 'a1c4f32' )
if conf.doCoriolis:
if conf.rmSource: gitCoriolis.removeLocalRepo()
gitCoriolis.clone ()
gitCoriolis.checkout( 'devel' )
if conf.doAlliance:
if conf.rmSource: gitAlliance.removeLocalRepo()
gitAlliance.clone ()
#gitAlliance.checkout( 'devel' )
if conf.rmSource: gitBenchs.removeLocalRepo()
gitBenchs.clone()
if conf.rmBuild:
for entry in os.listdir(conf.rootDir):
if entry.startswith('Linux.'):
buildDir = conf.rootDir+'/'+entry
print 'Removing OS build directory: <%s>' % buildDir
shutil.rmtree( buildDir )
commands = conf.getCommands( options.profile )
for command in commands:
if command.host:
print 'Executing command on remote host <%s>:' % host
else:
print 'Executing command on *local* host:'
print ' %s' % str(command)
command.execute()
conf.closeLogs()
conf.success = True
except ErrorMessage, e:
print e
conf.closeLogs()
conf.success = False
if showTrace:
print '\nPython stack trace:'
traceback.print_tb( sys.exc_info()[2] )
conf.rcode = e.code
if conf.doSendReport:
report = Report( conf )
report.attachLog( conf.logs['coriolis' ] )
report.attachLog( conf.logs['benchs' ] )
report.send()
conf.compressLogs()
sys.exit( conf.rcode )

View File

@ -55,6 +55,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item " href="./pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item " href="./pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="./pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="./pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item " href="./pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</li> </li>
@ -81,6 +82,7 @@
</button> </button>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a class="dropdown-item " href="./pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li> <li><a class="dropdown-item " href="./pages/homepage.html">Coriolis <span class="sc">vlsi</span> Backend Tools</a></li>
<li><a class="dropdown-item " href="./pages/install-cases.html">Install Cases</a></li>
<li><a class="dropdown-item " href="./pages/symbolic-layout.html">Symbolic Layout</a></li> <li><a class="dropdown-item " href="./pages/symbolic-layout.html">Symbolic Layout</a></li>
</ul> </ul>
</div> </div>

View File

@ -30,6 +30,7 @@ STATIC_PATHS = [ 'pages/users-guide'
, 'pages/python-cpp' , 'pages/python-cpp'
, 'pages/stratus' , 'pages/stratus'
, 'pages/rds' , 'pages/rds'
, 'scripts'
, 'images' , 'images'
, 'pdfs' , 'pdfs'
] ]

View File

@ -338,7 +338,7 @@ void EquinoxEngine::cleanUpLeafCell()
// ************************************* // *************************************
{ {
///*DEBUG*/ cmess1 << " - cleanUpLeafCell() " << endl; ///*DEBUG*/ cmess1 << " - cleanUpTerminalNetlistCell() " << endl;
set<Net*> set_nets; set<Net*> set_nets;
Net * externalnet = NULL; Net * externalnet = NULL;
unsigned long count = 1; unsigned long count = 1;

View File

@ -69,7 +69,7 @@ namespace Equinox {
bool IsRoutingFilter::accept (Equi* item) const bool IsRoutingFilter::accept (Equi* item) const
{ {
if(item->isLeafEqui()) { if(item->isLeafEqui()) {
if( item->getCell()->isLeaf() ) { if( item->getCell()->isTerminalNetlist() ) {
OccurrenceLocator locator = item->getNetOccurrences().getLocator(); OccurrenceLocator locator = item->getNetOccurrences().getLocator();
Net * net = dynamic_cast<Net*>(locator.getElement().getEntity()); Net * net = dynamic_cast<Net*>(locator.getElement().getEntity());
if(!(net->isExternal())) if(!(net->isExternal()))

View File

@ -241,7 +241,7 @@ namespace Equinox {
void WithAlimStrategy::operationAfterScanLine(EquinoxEngine* equinox) void WithAlimStrategy::operationAfterScanLine(EquinoxEngine* equinox)
{ {
Cell * cell = equinox->_cell; Cell * cell = equinox->_cell;
if( cell->isLeaf()) // If this is a leaf cell if( cell->isTerminalNetlist()) // If this is a leaf cell
equinox->cleanUpLeafCell(); equinox->cleanUpLeafCell();
else else
equinox->getOccurrencesOfEquis(); equinox->getOccurrencesOfEquis();
@ -318,7 +318,7 @@ namespace Equinox {
Occurrences componentoccurrences ; Occurrences componentoccurrences ;
if(equinox->_cell->isLeaf()) if(equinox->_cell->isTerminalNetlist())
componentoccurrences = equinox->_cell->getComponentOccurrencesUnder(underbox, componentoccurrences = equinox->_cell->getComponentOccurrencesUnder(underbox,
DataBase::getDB()->getTechnology()->_getMetalMask()).getSubSet((WithAlimStrategyFilter())); DataBase::getDB()->getTechnology()->_getMetalMask()).getSubSet((WithAlimStrategyFilter()));
else else
@ -430,7 +430,7 @@ namespace Equinox {
void WithoutAlimStrategy::operationAfterScanLine(EquinoxEngine* equinox) void WithoutAlimStrategy::operationAfterScanLine(EquinoxEngine* equinox)
{ {
Cell * cell = equinox->_cell; Cell * cell = equinox->_cell;
if( cell->isLeaf()) // If this is a leaf cell if( cell->isTerminalNetlist()) // If this is a leaf cell
equinox->cleanUpLeafCell(); equinox->cleanUpLeafCell();
else else
equinox->getOccurrencesOfEquis(); equinox->getOccurrencesOfEquis();

View File

@ -311,7 +311,7 @@ namespace Etesian {
Box topCellAb = getBlockCell()->getAbutmentBox(); Box topCellAb = getBlockCell()->getAbutmentBox();
if (not topCellAb.isEmpty()) { if (not topCellAb.isEmpty()) {
for ( Occurrence occurrence : getBlockCell()->getLeafInstanceOccurrences() ) for ( Occurrence occurrence : getBlockCell()->getTerminalNetlistInstanceOccurrences() )
{ {
Instance* instance = static_cast<Instance*>(occurrence.getEntity()); Instance* instance = static_cast<Instance*>(occurrence.getEntity());
Cell* masterCell = instance->getMasterCell(); Cell* masterCell = instance->getMasterCell();
@ -370,9 +370,7 @@ namespace Etesian {
sliceHoles.setSpinSlice0( _yspinSlice0 ); sliceHoles.setSpinSlice0( _yspinSlice0 );
Cell::setFlattenLeafMode( true ); for ( Occurrence occurrence : getBlockCell()->getTerminalNetlistInstanceOccurrences() )
for ( Occurrence occurrence : getBlockCell()->getLeafInstanceOccurrences() )
{ {
Instance* instance = static_cast<Instance*>(occurrence.getEntity()); Instance* instance = static_cast<Instance*>(occurrence.getEntity());
Cell* masterCell = instance->getMasterCell(); Cell* masterCell = instance->getMasterCell();
@ -399,8 +397,6 @@ namespace Etesian {
sliceHoles.addFeeds(); sliceHoles.addFeeds();
Cell::setFlattenLeafMode( false );
UpdateSession::close(); UpdateSession::close();
if (_viewer) _viewer->getCellWidget()->refresh(); if (_viewer) _viewer->getCellWidget()->refresh();

View File

@ -365,7 +365,7 @@ namespace Etesian {
double cellLength = 0; double cellLength = 0;
vector<Occurrence> feedOccurrences; vector<Occurrence> feedOccurrences;
for( Occurrence occurrence : getCell()->getLeafInstanceOccurrences() ) for( Occurrence occurrence : getCell()->getTerminalNetlistInstanceOccurrences() )
{ {
Instance* instance = static_cast<Instance*>(occurrence.getEntity()); Instance* instance = static_cast<Instance*>(occurrence.getEntity());
Cell* masterCell = instance->getMasterCell(); Cell* masterCell = instance->getMasterCell();
@ -401,8 +401,8 @@ namespace Etesian {
double columns = std::ceil( gcellLength / rows ); double columns = std::ceil( gcellLength / rows );
UpdateSession::open(); UpdateSession::open();
for ( auto ioccurrence : feedOccurrences ) { for ( auto occurrence : feedOccurrences ) {
static_cast<Instance*>(ioccurrence.getEntity())->destroy(); static_cast<Instance*>(occurrence.getEntity())->destroy();
} }
DbU::Unit abWidth = columns*getSliceHeight(); DbU::Unit abWidth = columns*getSliceHeight();
@ -430,18 +430,60 @@ namespace Etesian {
void EtesianEngine::resetPlacement () void EtesianEngine::resetPlacement ()
{ {
//cerr << "EtesianEngine::resetPlacement()" << endl; cmess1 << " o Erasing previous placement of <" << getCell()->getName() << ">" << endl;
_flatDesign = true; _flatDesign = true;
Dots dots ( cmess2, " ", 80, 1000 ); Dots dots ( cmess2, " ", 80, 1000 );
if (not cmess2.enabled()) dots.disable(); if (not cmess2.enabled()) dots.disable();
cmess1 << " o Erasing previous placement of <" << getCell()->getName() << ">" << endl; Box topAb = getBlockCell()->getAbutmentBox();
Transformation topTransformation;
if (getBlockInstance()) topTransformation = getBlockInstance()->getTransformation();
topTransformation.applyOn( topAb );
UpdateSession::open(); UpdateSession::open();
for ( Occurrence occurrence : getBlockCell()->getNonTerminalNetlistInstanceOccurrences() )
{
Instance* instance = static_cast<Instance*>(occurrence.getEntity());
Cell* masterCell = instance->getMasterCell();
if (not masterCell->getAbutmentBox().isEmpty()) {
if ( (instance->getPlacementStatus() != Instance::PlacementStatus::PLACED)
and (instance->getPlacementStatus() != Instance::PlacementStatus::FIXED ) ) {
throw Error( "EtesianEngine::toColoquinte(): Non-leaf instance \"%s\" of \"%s\" has an abutment box but is *not* placed."
, getString(instance ->getName()).c_str()
, getString(masterCell->getName()).c_str()
);
} else {
bool isFullyPlaced = true;
for ( Instance* subInstance : masterCell->getInstances() ) {
if ( (instance->getPlacementStatus() != Instance::PlacementStatus::PLACED)
and (instance->getPlacementStatus() != Instance::PlacementStatus::FIXED ) ) {
isFullyPlaced = false;
break;
}
}
if (isFullyPlaced) {
masterCell->setTerminalNetlist( true );
}
}
}
if ( masterCell->getAbutmentBox().isEmpty()
or ( (masterCell->getAbutmentBox().getHeight() == topAb.getHeight())
and (masterCell->getAbutmentBox().getWidth () == topAb.getWidth ()) ) ) {
// 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 );
occurrence.makeInvalid();
instance->slaveAbutmentBox();
}
}
vector<Occurrence> feedOccurrences; vector<Occurrence> feedOccurrences;
for( Occurrence occurrence : getCell()->getLeafInstanceOccurrences(getBlockInstance()) ) for( Occurrence occurrence : getCell()->getTerminalNetlistInstanceOccurrences(getBlockInstance()) )
{ {
dots.dot(); dots.dot();
@ -456,8 +498,8 @@ namespace Etesian {
feedOccurrences.push_back( occurrence ); feedOccurrences.push_back( occurrence );
} }
for ( auto ioccurrence : feedOccurrences ) { for ( auto occurrence : feedOccurrences ) {
Instance* instance = static_cast<Instance*>(ioccurrence.getEntity()); Instance* instance = static_cast<Instance*>(occurrence.getEntity());
instance->destroy(); instance->destroy();
} }
@ -491,50 +533,7 @@ namespace Etesian {
if (getBlockInstance()) topTransformation = getBlockInstance()->getTransformation(); if (getBlockInstance()) topTransformation = getBlockInstance()->getTransformation();
topTransformation.applyOn( topAb ); topTransformation.applyOn( topAb );
Cell::setFlattenLeafMode( true ); size_t instancesNb = getCell()->getTerminalNetlistInstanceOccurrences(getBlockInstance()).getSize();
UpdateSession::open();
for ( Occurrence occurrence : getBlockCell()->getNonLeafInstanceOccurrences() )
{
Instance* instance = static_cast<Instance*>(occurrence.getEntity());
Cell* masterCell = instance->getMasterCell();
if (not masterCell->getAbutmentBox().isEmpty()) {
if ( (instance->getPlacementStatus() != Instance::PlacementStatus::PLACED)
and (instance->getPlacementStatus() != Instance::PlacementStatus::FIXED ) ) {
throw Error( "EtesianEngine::toColoquinte(): Non-leaf instance \"%s\" of \"%s\" has an abutment box but is *not* placed."
, getString(instance ->getName()).c_str()
, getString(masterCell->getName()).c_str()
);
} else {
bool isFullyPlaced = true;
for ( Instance* subInstance : masterCell->getInstances() ) {
if ( (instance->getPlacementStatus() != Instance::PlacementStatus::PLACED)
and (instance->getPlacementStatus() != Instance::PlacementStatus::FIXED ) ) {
isFullyPlaced = false;
break;
}
}
if (isFullyPlaced) {
masterCell->setFlattenLeaf( true );
}
}
}
if ( masterCell->getAbutmentBox().isEmpty()
or ( (masterCell->getAbutmentBox().getHeight() == topAb.getHeight())
and (masterCell->getAbutmentBox().getWidth () == topAb.getWidth ()) ) ) {
// 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 );
occurrence.makeInvalid();
instance->slaveAbutmentBox();
}
}
UpdateSession::close();
size_t instancesNb = getCell()->getLeafInstanceOccurrences(getBlockInstance()).getSize();
if (not instancesNb) { if (not instancesNb) {
cerr << Error( "EtesianEngine::toColoquinte(): No instance to place. We're gonna crash..." ) << endl; cerr << Error( "EtesianEngine::toColoquinte(): No instance to place. We're gonna crash..." ) << endl;
} }
@ -555,7 +554,7 @@ namespace Etesian {
bool tooManyInstances = false; bool tooManyInstances = false;
index_t instanceId = 0; index_t instanceId = 0;
for ( Occurrence occurrence : getCell()->getLeafInstanceOccurrences(getBlockInstance()) ) for ( Occurrence occurrence : getCell()->getTerminalNetlistInstanceOccurrences(getBlockInstance()) )
{ {
if (tooManyInstances or (instanceId == instancesNb)) { if (tooManyInstances or (instanceId == instancesNb)) {
tooManyInstances = true; tooManyInstances = true;
@ -737,8 +736,6 @@ namespace Etesian {
_placementLB.positions_ = positions; _placementLB.positions_ = positions;
_placementLB.orientations_ = orientations; _placementLB.orientations_ = orientations;
_placementUB = _placementLB; _placementUB = _placementLB;
Cell::setFlattenLeafMode( false );
} }
@ -750,7 +747,7 @@ namespace Etesian {
*/ */
bool isSliceHeightSet = false; bool isSliceHeightSet = false;
for ( Occurrence occurrence : getCell()->getLeafInstanceOccurrences(getBlockInstance()) ) for ( Occurrence occurrence : getCell()->getTerminalNetlistInstanceOccurrences(getBlockInstance()) )
{ {
Instance* instance = static_cast<Instance*>(occurrence.getEntity()); Instance* instance = static_cast<Instance*>(occurrence.getEntity());
Cell* masterCell = instance->getMasterCell(); Cell* masterCell = instance->getMasterCell();
@ -1113,8 +1110,7 @@ namespace Etesian {
if (getBlockInstance()) topTransformation = getBlockInstance()->getTransformation(); if (getBlockInstance()) topTransformation = getBlockInstance()->getTransformation();
topTransformation.invert(); topTransformation.invert();
Cell::setFlattenLeafMode( true ); for ( Occurrence occurrence : getCell()->getTerminalNetlistInstanceOccurrences(getBlockInstance()) )
for ( Occurrence occurrence : getCell()->getLeafInstanceOccurrences(getBlockInstance()) )
{ {
DbU::Unit hpitch = getHorizontalPitch(); DbU::Unit hpitch = getHorizontalPitch();
DbU::Unit vpitch = getSliceStep(); DbU::Unit vpitch = getSliceStep();
@ -1148,7 +1144,6 @@ namespace Etesian {
instance->setPlacementStatus( Instance::PlacementStatus::PLACED ); instance->setPlacementStatus( Instance::PlacementStatus::PLACED );
} }
} }
Cell::setFlattenLeafMode( false );
UpdateSession::close(); UpdateSession::close();

View File

@ -74,7 +74,7 @@ A yellow dashed arrow denotes a relation between a template instance and the tem
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -92,7 +92,7 @@ Open questions</h2>
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -34,7 +34,7 @@
\vspace*{1cm} \vspace*{1cm}
{\large Generated by Doxygen 1.8.14}\\ {\large Generated by Doxygen 1.8.14}\\
\vspace*{0.5cm} \vspace*{0.5cm}
{\small Mon Feb 3 2020 17:10:36}\\ {\small Sun Mar 8 2020 18:49:09}\\
\end{center} \end{center}
\end{titlepage} \end{titlepage}

View File

@ -4,9 +4,33 @@
namespace Hurricane { namespace Hurricane {
/*! \class Cell //! \class Cell
* \brief The model (\b API). //! \brief The model (\b API).
*/ //!
//! \section secCellHierarchy Layout vs. Netlist Cell Hierarchy
//!
//! The Cell / Instance hierarchy can be walkthrough in two different
//! modes:
//! <ul>
//! <li> <b>The Layout Mode</b>, in this mode the walktrough will be done
//! over all the instances levels. This mode is used for the following
//! collections:
//! <ul>
//! <li> Cell::getTerminalInstanceOccurrences().
//! </ul>
//!
//! <li> <b>The Netlist Mode</b>, in this mode the walktrough will stop
//! at instances flagged as Cell::Flags::TerminalInstance.
//! The netlist hierarchy will be a subset of the layout one.
//! Or, conversely, some level of layout hirearchy can have no
//! netlist equivalent. This mode is used for the following
//! collections:
//!
//! <ul>
//! <li> Cell::getTerminalNetlistInstanceOccurrences().
//! <li> Cell::getNonTerminalNetlistInstanceOccurrences().
//! </ul>
//! </ul>
/*! \function Cell* Cell::create ( Library* library, const Name& name ); /*! \function Cell* Cell::create ( Library* library, const Name& name );
@ -141,13 +165,17 @@
* entities are taken into account in this Collection. * entities are taken into account in this Collection.
*/ */
/*! \function Occurrences Cell::getLeafInstanceOccurrences ( const Instance* topInstance=NULL ) const; //! \function Occurrences Cell::getTerminalInstanceOccurrences () const;
//! Returns the trans-hierarchical Collection of all instance Occurrences that are
//! layout terminal cells (leaves).
/*! \function Occurrences Cell::getTerminalNetlistInstanceOccurrences ( const Instance* topInstance=NULL ) const;
* Returns the trans-hierarchical Collection of all instance Occurrences that are * Returns the trans-hierarchical Collection of all instance Occurrences that are
* leaf cells. With the \c topInstance argument we can restrict the collection * leaf cells. With the \c topInstance argument we can restrict the collection
* to leafs of that instance (of the current Cell) only. * to leafs of that instance (of the current Cell) only.
*/ */
/*! \function Occurrences Cell::getNonLeafInstanceOccurrences ( const Instance* topInstance=NULL ) const; /*! \function Occurrences Cell::getNonTerminalNetlistInstanceOccurrences ( const Instance* topInstance=NULL ) const;
* Returns the trans-hierarchical Collection of all instance Occurrences that are * Returns the trans-hierarchical Collection of all instance Occurrences that are
* \b not leaf cells. With the \c topInstance argument we can restrict the collection * \b not leaf cells. With the \c topInstance argument we can restrict the collection
* to non-leafs of that instance (of the current Cell) only. * to non-leafs of that instance (of the current Cell) only.
@ -170,11 +198,15 @@
* automatically called when creating an instance). * automatically called when creating an instance).
*/ */
/*! \function bool Cell::isTerminal () const; //! \function bool Cell::isTerminal () const;
* Returns \true if the Cell is marked as terminal (meaning that it has //! Returns \true if the cell contains no instances. This is a layout
* no inside or that we dont want to take it into account), else //! leaf cell.
* \false.
*/ //! \function bool Cell::isTerminalNetlist () const;
//! Returns \true if the Cell is marked as terminal for the \e netlist
//! hierarchy. A terminal \e netlist cell may, however contains
//! further level of physical (layout) instances. This is a state
//! that can be set or unset.
//! \function bool Cell::isUnique () const; //! \function bool Cell::isUnique () const;
//! Returns \true if the Cell has one or less instances, regardless of //! Returns \true if the Cell has one or less instances, regardless of
@ -206,8 +238,8 @@
* Box as argument. * Box as argument.
*/ */
/*! \function void Cell::setTerminal ( bool state ); /*! \function void Cell::setTerminalNetlist ( bool state );
* sets Cell terminal status to \e state. * sets Cell \e netlist terminal status to \e state.
*/ */
/* \function void Cell::setSymbol ( Symbol* symbol ); /* \function void Cell::setSymbol ( Symbol* symbol );

View File

@ -74,7 +74,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -80,7 +80,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -50,7 +50,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

File diff suppressed because one or more lines are too long

View File

@ -57,7 +57,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -76,7 +76,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -63,7 +63,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -76,7 +76,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -57,7 +57,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -59,7 +59,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -81,7 +81,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -57,7 +57,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

File diff suppressed because one or more lines are too long

View File

@ -57,7 +57,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

File diff suppressed because one or more lines are too long

View File

@ -98,7 +98,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -62,7 +62,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -62,7 +62,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -59,7 +59,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -57,7 +57,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -60,7 +60,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -57,7 +57,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -56,7 +56,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -61,7 +61,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -64,7 +64,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -57,7 +57,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -68,7 +68,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -57,7 +57,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -65,7 +65,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -57,7 +57,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

File diff suppressed because one or more lines are too long

View File

@ -52,7 +52,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

File diff suppressed because one or more lines are too long

View File

@ -57,7 +57,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -55,7 +55,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -72,7 +72,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -50,7 +50,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -92,7 +92,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

View File

@ -50,7 +50,7 @@ $(function() {
<hr> <hr>
<table class="footer1"> <table class="footer1">
<tr> <tr>
<td class="LFooter"><small>Generated by doxygen 1.8.14 on Mon Feb 3 2020</small></td> <td class="LFooter"><small>Generated by doxygen 1.8.14 on Sun Mar 8 2020</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td> <td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr> </tr>
</table> </table>

Some files were not shown because too many files have changed in this diff Show More