coriolis/crlcore/src/cyclop/CyclopMain.cpp

252 lines
9.2 KiB
C++
Raw Normal View History

// -*- C++ -*-
//
// This file is part of the Coriolis Software.
2015-03-17 10:42:12 -05:00
// Copyright (c) UPMC 2008-2015, 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 {
unsigned int traceLevel;
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.")
( "trace-level,l" , boptions::value<unsigned int>(&traceLevel)->default_value(1000)
, "Set the level of trace, trace messages with a level superior to "
"<arg> will be printed on <stderr>." )
( "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" );
cerr << "Mark:" << userConfFile.string() << 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 );
dbo_ptr<AllianceFramework> af ( AllianceFramework::create() );
* ./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;
}