coriolis/crlcore/src/cyclop/CyclopMain.cpp

248 lines
8.8 KiB
C++
Raw Normal View History

// -*- C++ -*-
//
// This file is part of the Coriolis Software.
2016-01-20 17:41:19 -06:00
// Copyright (c) UPMC 2008-2016, All Rights Reserved
//
// +-----------------------------------------------------------------+
// | C O R I O L I S |
// | C y c l o p - S i m p l e V i e w e r |
// | |
// | Author : Jean-Paul CHAPUT |
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== |
// | C++ Module : "./CyclopMain.cpp" |
// +-----------------------------------------------------------------+
#include <memory>
#include <vector>
#include <algorithm>
using namespace std;
#include <boost/program_options.hpp>
namespace boptions = boost::program_options;
#include <QtGui>
Update to Qt 5, requires cmake 2.8.9. New placer: Etesian. Update to Qt 5: * Change: Now requires at least cmake 2.8.9. * Change: CMakeLists.txt needs small changes. Qt modules must be found one by one (Core, Gui, Widgets). Must add "set(CMAKE_AUTOMOC ON)" in the top file and replace "qt4" prefix in macros by "qt5". Added simpler macro "setup_qt()" in FindBootstrap.cmake. * Change: No longer need to include <QGtkStyle> is is choosen by default according to the current desktop environment. * Change: In <hurricane>, In HApplication, launch ExceptionWidget when a std::exception is catched instead of silently discarting it. New placer Tool: Etesian * New: <etesian> analytical placer. Encapsulate Coloquinte from Gabriel Gouvine. * New: in <documentation>, add stub demonstration ToolEngine <smurf>. Needs to be commented. Miscellaneous: * New: in <boostrap> and <unicorn>, added support for Etesian, the new analytic placer. The tool itself will be added in the next commit. * Bug: in <CellWidget>, when shifting the display buffer, we no longer can copy the buffer on itself (we should never have). Now go through a temporary one (PlaneId::AutoCopy) which is added to the DrawingPlanes. Affect "goLeft()" and "goUp()". * Bug: In <CellWidget>, remove the WA_PaintOnScreen flag/attribute. When it's on, no PaintEvent is transmitted to the CellWidget when it's the central widget of the <CellViewer> (QMainWindow). It's something I still don't understand from the doc of Qt. * Change: In <AreaCommand>, use the PlaneId enumeration instead of a anonymous numerical index. * Change: In <HApplication>, no longer catch and silently discard standartd exceptions but launch the ExceptionWidget... Suppress the now deprecated constructor with "Type" argument. * Change: In <SelectionModel>, the "reset()" method is deprecated in Qt5, instead enclose the "clear()" by a "beginResetModel()" and "endResetModel()" pair. * New: In <crlcore>, add support for ISPD05 benchmarks (in Bookshelf format). Forked from ISPD04 and not finished yet. * Change: In <Mauka>, distinguish the Action string identifier from <Etesian> * New: In <unicorn>, add entry for ISPD05 loader. Add entry for <Etesian> analytic placer.
2014-03-22 05:50:36 -05:00
#if (QT_VERSION >= QT_VERSION_CHECK(4,5,0)) and \
(QT_VERSION < QT_VERSION_CHECK(5,0,0)) and \
not defined (__APPLE__) and not defined (__CYGWIN__)
# include <QGtkStyle>
#endif
#include "vlsisapd/utilities/Path.h"
#include "hurricane/DataBase.h"
#include "hurricane/Technology.h"
#include "hurricane/Layer.h"
#include "hurricane/BasicLayer.h"
#include "hurricane/Cell.h"
#include "hurricane/Warning.h"
#include "hurricane/ExtensionGo.h"
#include "hurricane/Timer.h"
#include "hurricane/viewer/Graphics.h"
#include "hurricane/viewer/CellWidget.h"
#include "hurricane/viewer/HApplication.h"
using namespace Hurricane;
#include "DemoGo.h"
#include "Cyclop.h"
#include "crlcore/Utilities.h"
using namespace CRL;
namespace {
// -------------------------------------------------------------------
// Function : "printHelp()".
// void printHelp ()
// {
// cout << endl;
// cout << "Usage: cyclop [-v|--verbose] [-V|--very-verbose] [-D|--core-dump] \\\n"
// << " [-l|--trace-level <traceLevel>] [-c|--cell <cellName>] \\\n"
// << endl;
// cout << "Options:\n"
// << " o [-v|--verbose] : First level of verbosity.\n"
// << " o [-V|--very-verbose] : Second level of verbosity (very talkative).\n"
// << " o [-D|--core-dump] : Enable core dumping.\n"
// << " o [-l|--trace-level <traceLevel>] :\n"
// << " Sets the level of trace, trace messages with a level superior to\n"
// << " <traceLevel> will be printed on <stderr>.\n"
// << " o [-c|--cell <cellName>] :\n"
// << " The name of the Cell to load, without extention.\n"
// << endl;
// }
} // End of anonymous namespace.
// x-----------------------------------------------------------------x
// | Fonctions Definitions |
// x-----------------------------------------------------------------x
// -------------------------------------------------------------------
// Function : "main()".
int main ( int argc, char *argv[] )
{
int returnCode = 0;
try {
bool verbose1;
bool verbose2;
bool coreDump;
bool textMode;
boptions::options_description options ("Command line arguments & options");
options.add_options()
( "help,h" , "Print this help." )
( "verbose,v" , boptions::bool_switch(&verbose1)->default_value(false)
, "First level of verbosity.")
( "very-verbose,V", boptions::bool_switch(&verbose2)->default_value(false)
, "Second level of verbosity.")
( "core-dump,D" , boptions::bool_switch(&coreDump)->default_value(false)
, "Enable core dumping.")
( "text,t" , boptions::bool_switch(&textMode)->default_value(false)
, "Run in pure text mode.")
( "cell,c" , boptions::value<string>()
, "The name of the cell to load, whithout extension." );
boptions::variables_map arguments;
boptions::store ( boptions::parse_command_line(argc,argv,options), arguments );
boptions::notify ( arguments );
Utilities::Path userConfFile ( "ma/configuration" );
New Library Manager Widget. Access with Tools menu or CTRL+M. * New: In CRL Core, created a LibraryManager widget. It provides a composite information based on what is present, for each Alliance library: 1. - A Cell in memory, without Catalog::State. 2. - A Catalog::State, with or whithout the Cell in memory. 3. - The files of the Cell in the librariy's directory. 4. - A file with a format referenced for one of the importers. File type recognition is based *only* on the file extension, so it may easily confused. Be careful about what you put in the library's directory. One of the big limitation is that it will not display Hurricane libraries that do not have the AllianceLibrary extension. This widget is put in a separate library <libmanager>, included in the default CRLCORE_LIBRARIES. * Change: In CRL Core, in State (through the loader), now sets the InMemory flag (event if nobody uses it yet...). Display it in the state _getString(). In AllianceFramework, new getAllianceLibraries() method. In CatalogExtension, make the static method "get()" publicly accessible, for sometimes we want the whole State. * Bug: In vlsisapd, in Path, the pathcache was not rebuild when it should, leading to incorrect results. * New: In vlsisapd, in Path, added a listdir() method to access the contents of a directory and a stat() method to poll the status of a file/directory. Rename the ".string()" method in ".toString()" to avoid tricky name resolution with std::string, refactor in all the other tools. * Change: In Hurricane, in Controller, no longer oversize the fonts of the table's headers. * New: In Unicorn, in UnicornGui, integrate LibraryManager.
2015-05-09 10:03:17 -05:00
cerr << "Mark:" << userConfFile.toString() << endl;
if ( arguments.count("help") ) {
cout << options << endl;
exit ( 0 );
}
System::get()->setCatchCore ( not coreDump );
if (verbose1) mstream::enable ( mstream::Verbose0|mstream::Verbose1 );
if (verbose2) mstream::enable ( mstream::Verbose0|mstream::Verbose1|mstream::Verbose2 );
Implementation of DataBase native save/restore in JSON (step 3). * Test: post-receive hook on server should send mail [1]. * New: In VLSISAPD, in Parameter, callback have now a tag, which the pointer to the caller. This allow for the callback removal when the caller is destroyed. * New: In VLSISAPD, in WidgetDescription, when associated to a parameter, the destructor must remove the associated callback function on the Parameter. * New: In Hurricane, added JSON support for Configuration, separated from vlsisapd, as the support is not available at this point. JSON support for Configuration, Parameter & LayoutDescription. * Change: In Hurricane, in JsonStack, the stack of JsonObjects has been displaced here from HurricaneHandler. This way, all JsonObject::toData() can access the JsonOjects in the context of the parser. * New: In Hurricane, in DBo::toJson() added support for Entity by reference (ids). * New: In Hurricane, added JSON support for all Layer sub-class types. * New: In Hurricane, in Technology, export the Layers, but must be sorted by increasing mask value. * New: In Hurricane, in Entity, added support for Entity by reference (ids). * New: In Hurricane, in DataBase, added technology full support. * New: In Hurricane, In JsonNet, move the ring rebuild management from JsonStack to JsonNet. * New: In Hurricane, added JSON support for NetAlias, NetExternalcomponents (not cleanly implemented as a Relation). * New: In Hurricane, new method Cell::fromJson() to load a cell from a JSON file. * New: In Hurricane, In Graphics, make it an observable, for when JSON fully reload the graphic state, it must be able to notify other objects (namely the Controller). * New: In Hurricane, in ControllerWidget, observe the Graphics to regenerate the palette as needed. New method ControllerTab::graphicsUpdated(). * New: In Hurricane, in RawDrawingStyle added a destructor to release the Qt pen/brush. Added JSON support for HSVr, DrawingStyle, DrawingGroup, & DisplayStyle. * New: In Hurricane, in GraphicsWidget, rewrite correctly the readGraphics() to erase the previous widgets and re-create the new ones. * New: In Hurricane, in PaletteWidget, correct re-creation of the layout/widgets in case of Graphics change. * New: In CRL Core, in System, register the parameters callbacks with the address of the object, for later deletion. * New: In CRL Core, in AllianceFramework, make it observable, to notify library changes. For the AllianceFramework creation, now allow to completly bypass the Python initialization system, when we expect to restore it from a full blob. Added methods to sets the default RoutingGauge & CellGauge. * New: In CRL Core, added JSON suppport for CellGauge, RoutingLayerGauge & RoutingGauge. * New: In CRL Core, in LibraryManager, oberver AllianceFramework, to update the list of libraries in case of change (for JSON full reload).
2016-02-20 14:24:44 -06:00
dbo_ptr<AllianceFramework> af ( AllianceFramework::get() );
* ./crlcore: - New: In AllianceFramework constructor, now look for an XML configuration file in the current directory (<cwd>/.environment.alliance.xml). - New: DefParser, DefDriver & LefDriver are replaced by DefImport, DefExport and LefExport (resp.). LEF/DEF parser/driver are no longer integrated in among Alliance ones due to too much difference in data organisation. Instead they are build as Import/Export utilities. - New: Iccad04Lefdef import the ICCAD'04 benchmarks into the SxLib format suitable for Knik/Kite. They are derived from the ISPD'98 (ibm01--ibm18) benchmarks. Many corrections are applieds to ensure a more realistic representation. Generate a new library from the LEF file "on the fly". - New: Ispd04Bookshelf import the ISPD'04 benchmarks in SxLib from bookshelf. Thoses benchmarks can be placeds whith fastplace. Unfortunatly fastplace do not manage blocks and reduce them to standard cell which is not usable for detailed placement. Too bad, the parser exists still. Make uses of the new vlsisapd/bookshelf parser. A whole library is generated "on the fly" on the basis of "one node, one Cell" (so we have a bijection between Cell and Instance). The result of this parsing is different from the one of the stand-alone ispd04 binary in the sense it fits the circuit to the SxLib gauge thus changing the routing capacity: from 16 to 20. - Change: In ApDriver, the lookup modify the lookup table for matching Alliance layers against Hurricane ones, "OBSTACLEx" became "BLOCKAGEx". - Change: In default <enviromnent.alliance.xml> adds the name of the blockage net: "^obstacleNet$". Some work over the coherency of the blockage managment remains to be done. - Change: In AllianceFramework, partial rewrite of the get/creation of AllianceLibrary to fit the requirements of the "on the fly" generation from the benchmarks loaders. And correct some bugs by the way. - Change: In Environment, suppress any reference to LEF technology as LEF/ DEF is now used as import/exports. - Bug: In VstDriver, perform only one lookup for global signals among all nets and not for each instance master cell. That was making the driver quadratic! Now it's linear and reasonably fast.
2010-08-18 15:22:10 -05:00
Technology* technology = DataBase::getDB()->getTechnology();
// technology->setWorkingLayer ( "cut0" );
// technology->setWorkingLayer ( "cut1" );
// technology->setWorkingLayer ( "cut2" );
// technology->setWorkingLayer ( "cut3" );
// technology->setWorkingLayer ( "cut4" );
// technology->setWorkingLayer ( "cut5" );
// technology->setWorkingLayer ( "METAL1" );
// technology->setWorkingLayer ( "METAL2" );
// technology->setWorkingLayer ( "METAL3" );
// technology->setWorkingLayer ( "METAL4" );
// technology->setWorkingLayer ( "METAL5" );
// technology->setWorkingLayer ( "METAL6" );
// technology->setWorkingLayer ( "VIA12" );
// technology->setWorkingLayer ( "VIA23" );
// technology->setWorkingLayer ( "VIA34" );
// technology->setWorkingLayer ( "VIA45" );
// technology->setWorkingLayer ( "VIA56" );
* ./crlcore: - New: In AllianceFramework constructor, now look for an XML configuration file in the current directory (<cwd>/.environment.alliance.xml). - New: DefParser, DefDriver & LefDriver are replaced by DefImport, DefExport and LefExport (resp.). LEF/DEF parser/driver are no longer integrated in among Alliance ones due to too much difference in data organisation. Instead they are build as Import/Export utilities. - New: Iccad04Lefdef import the ICCAD'04 benchmarks into the SxLib format suitable for Knik/Kite. They are derived from the ISPD'98 (ibm01--ibm18) benchmarks. Many corrections are applieds to ensure a more realistic representation. Generate a new library from the LEF file "on the fly". - New: Ispd04Bookshelf import the ISPD'04 benchmarks in SxLib from bookshelf. Thoses benchmarks can be placeds whith fastplace. Unfortunatly fastplace do not manage blocks and reduce them to standard cell which is not usable for detailed placement. Too bad, the parser exists still. Make uses of the new vlsisapd/bookshelf parser. A whole library is generated "on the fly" on the basis of "one node, one Cell" (so we have a bijection between Cell and Instance). The result of this parsing is different from the one of the stand-alone ispd04 binary in the sense it fits the circuit to the SxLib gauge thus changing the routing capacity: from 16 to 20. - Change: In ApDriver, the lookup modify the lookup table for matching Alliance layers against Hurricane ones, "OBSTACLEx" became "BLOCKAGEx". - Change: In default <enviromnent.alliance.xml> adds the name of the blockage net: "^obstacleNet$". Some work over the coherency of the blockage managment remains to be done. - Change: In AllianceFramework, partial rewrite of the get/creation of AllianceLibrary to fit the requirements of the "on the fly" generation from the benchmarks loaders. And correct some bugs by the way. - Change: In Environment, suppress any reference to LEF technology as LEF/ DEF is now used as import/exports. - Bug: In VstDriver, perform only one lookup for global signals among all nets and not for each instance master cell. That was making the driver quadratic! Now it's linear and reasonably fast.
2010-08-18 15:22:10 -05:00
Layer* contact = technology->getLayer("CONT_POLY");
cerr << "CONT_POLY Mask " << contact->getMask() << endl;
cerr << contact->getTop() << " is top of CONT_POLY" << endl;
cerr << contact->getBottom() << " is bottom of CONT_POLY" << endl;
// Layer* metal2 = technology->getLayer("METAL2");
// Layer* above = technology->getLayer("METAL2")->getMetalAbove();
// cerr << above << " is above METAL2" << endl;
// Layer* below = technology->getLayer("METAL2")->getMetalBelow();
// cerr << below << " is below METAL2" << endl;
// Layer* via = technology->getLayer("VIA23");
// cerr << via->getTop() << " is top of VIA23" << endl;
// cerr << via->getBottom() << " is bottom of VIA23" << endl;
// cerr << "VIA23 mask: " << via->getMask() << endl;
// cerr << technology->getViaBetween ( above, metal2 ) << " connects METAL2 & METAL3." << endl;
// cerr << technology->getNthMetal ( 4 ) << " is the fourth metal layer." << endl;
// Layer::Mask mask = 512;
// forEach ( Layer*, ilayer, getRangeCollection(&(technology->_getLayerMaskMap()),mask) ) {
// cerr << *ilayer << " Mask:" << (*ilayer)->getMask() << endl;
// //BasicLayer* basicLayer = dynamic_cast<BasicLayer*>(*ilayer);
// }
// af->loadLibraryCells ( "ramlib" );
Cell* cell = NULL;
if ( arguments.count("cell") ) {
cell = af->getCell (arguments["cell"].as<string>().c_str(), Catalog::State::Views );
if ( cell == NULL ) {
cerr << af->getPrint() << endl;
cerr << "[ERROR] Cell not found: " << arguments["cell"].as<string>().c_str() << endl;
exit ( -45 );
}
// Slot* slot = getSlot ( "_netMap", &(cell->_getNetMap()) );
// Record* record = slot->getDataRecord();
// cerr << "_netMap(0): " << record->getSlot(0)->getDataString() << endl;
}
if ( not textMode ) {
auto_ptr<QApplication> qa ( new HApplication(argc,argv) );
Update to Qt 5, requires cmake 2.8.9. New placer: Etesian. Update to Qt 5: * Change: Now requires at least cmake 2.8.9. * Change: CMakeLists.txt needs small changes. Qt modules must be found one by one (Core, Gui, Widgets). Must add "set(CMAKE_AUTOMOC ON)" in the top file and replace "qt4" prefix in macros by "qt5". Added simpler macro "setup_qt()" in FindBootstrap.cmake. * Change: No longer need to include <QGtkStyle> is is choosen by default according to the current desktop environment. * Change: In <hurricane>, In HApplication, launch ExceptionWidget when a std::exception is catched instead of silently discarting it. New placer Tool: Etesian * New: <etesian> analytical placer. Encapsulate Coloquinte from Gabriel Gouvine. * New: in <documentation>, add stub demonstration ToolEngine <smurf>. Needs to be commented. Miscellaneous: * New: in <boostrap> and <unicorn>, added support for Etesian, the new analytic placer. The tool itself will be added in the next commit. * Bug: in <CellWidget>, when shifting the display buffer, we no longer can copy the buffer on itself (we should never have). Now go through a temporary one (PlaneId::AutoCopy) which is added to the DrawingPlanes. Affect "goLeft()" and "goUp()". * Bug: In <CellWidget>, remove the WA_PaintOnScreen flag/attribute. When it's on, no PaintEvent is transmitted to the CellWidget when it's the central widget of the <CellViewer> (QMainWindow). It's something I still don't understand from the doc of Qt. * Change: In <AreaCommand>, use the PlaneId enumeration instead of a anonymous numerical index. * Change: In <HApplication>, no longer catch and silently discard standartd exceptions but launch the ExceptionWidget... Suppress the now deprecated constructor with "Type" argument. * Change: In <SelectionModel>, the "reset()" method is deprecated in Qt5, instead enclose the "clear()" by a "beginResetModel()" and "endResetModel()" pair. * New: In <crlcore>, add support for ISPD05 benchmarks (in Bookshelf format). Forked from ISPD04 and not finished yet. * Change: In <Mauka>, distinguish the Action string identifier from <Etesian> * New: In <unicorn>, add entry for ISPD05 loader. Add entry for <Etesian> analytic placer.
2014-03-22 05:50:36 -05:00
#if (QT_VERSION >= QT_VERSION_CHECK(4,5,0)) and \
(QT_VERSION < QT_VERSION_CHECK(5,0,0)) and \
not defined (__APPLE__) and not defined (__CYGWIN__)
qa->setStyle ( new QGtkStyle() );
#endif
Graphics::enable ();
// Layer* layer = DataBase::getDB()->getTechnology()->getLayer("poly");
// if ( cell && cell->getName() == "inv_x1" ) {
// forEach ( Component*, icomponent, cell->getComponents(layer->getMask()) ) {
// Occurrence occurrence ( *icomponent );
// cyclop->select ( occurrence );
// cerr << "Selecting: " << occurrence << endl;
// }
// }
if ( cell && cell->getName() == "inv_x1" ) {
// Box box = cell->getAbutmentBox();
// DemoGo::create ( cell, box.inflate(DbU::lambda(2)) );
Reference::create ( cell, "Label", DbU::lambda(0.0), DbU::lambda(0.0), Reference::Label );
}
dbo_ptr<Cyclop> cyclop ( Cyclop::create() );
cmess1 << cyclop->getBanner() << endl;;
cmess2 << af->getPrint() << endl;
cyclop->setCell ( cell );
cyclop->show();
//cyclop->getCellWidget()->setLayerVisible ( Name("metal1"), false );
returnCode = qa->exec();
}
}
catch ( Error& e ) {
cerr << e.what() << endl;
exit ( 1 );
}
catch ( boptions::error& e ) {
cerr << "[ERROR] " << e.what() << endl;
exit ( 1 );
}
catch ( exception& e ) {
cerr << "[ERROR] " << e.what() << endl;
exit ( 1 );
}
catch ( ... ) {
cout << "[ERROR] Abnormal termination: unmanaged exception.\n" << endl;
exit ( 2 );
}
return returnCode;
}