275 lines
9.2 KiB
C++
275 lines
9.2 KiB
C++
// -*- C++ -*-
|
|
//
|
|
// This file is part of the Coriolis Software.
|
|
// Copyright (c) UPMC 2017-2018, All Rights Reserved
|
|
//
|
|
// +-----------------------------------------------------------------+
|
|
// | C O R I O L I S |
|
|
// | T o o l E n g i n e T u t o r i a l |
|
|
// | |
|
|
// | Author : Jean-Paul CHAPUT |
|
|
// | E-mail : Jean-Paul.Chaput@lip6.fr |
|
|
// | =============================================================== |
|
|
// | C++ Module : "./TutorialEngine.cpp" |
|
|
// +-----------------------------------------------------------------+
|
|
|
|
|
|
#include <Python.h>
|
|
#include <sstream>
|
|
#include <fstream>
|
|
#include <iomanip>
|
|
#include "vlsisapd/utilities/Path.h"
|
|
#include "hurricane/DebugSession.h"
|
|
#include "hurricane/UpdateSession.h"
|
|
#include "hurricane/Bug.h"
|
|
#include "hurricane/Error.h"
|
|
#include "hurricane/Warning.h"
|
|
#include "hurricane/DataBase.h"
|
|
#include "hurricane/Technology.h"
|
|
#include "hurricane/Breakpoint.h"
|
|
#include "hurricane/Layer.h"
|
|
#include "hurricane/Net.h"
|
|
#include "hurricane/RoutingPad.h"
|
|
#include "hurricane/Plug.h"
|
|
#include "hurricane/Cell.h"
|
|
#include "hurricane/Instance.h"
|
|
#include "hurricane/Vertical.h"
|
|
#include "hurricane/Horizontal.h"
|
|
#include "crlcore/AllianceFramework.h"
|
|
#include "tutorial/TutorialEngine.h"
|
|
|
|
|
|
namespace Tutorial {
|
|
|
|
using namespace std;
|
|
using Hurricane::dbo_ptr;
|
|
using Hurricane::UpdateSession;
|
|
using Hurricane::DebugSession;
|
|
using Hurricane::tab;
|
|
using Hurricane::Bug;
|
|
using Hurricane::Error;
|
|
using Hurricane::Warning;
|
|
using Hurricane::Breakpoint;
|
|
using Hurricane::Timer;
|
|
using Hurricane::DbU;
|
|
using Hurricane::Box;
|
|
using Hurricane::Layer;
|
|
using Hurricane::DataBase;
|
|
using Hurricane::Technology;
|
|
using Hurricane::Component;
|
|
using Hurricane::Contact;
|
|
using Hurricane::Horizontal;
|
|
using Hurricane::Vertical;
|
|
using Hurricane::RoutingPad;
|
|
using Hurricane::Cell;
|
|
using Hurricane::Plug;
|
|
using Hurricane::Instance;
|
|
using Hurricane::Transformation;
|
|
using Hurricane::Occurrence;
|
|
|
|
|
|
// -------------------------------------------------------------------
|
|
// Class : "Tutorial::TutorialEngine".
|
|
|
|
Name TutorialEngine::_toolName = "Tutorial";
|
|
|
|
|
|
const Name& TutorialEngine::staticGetName ()
|
|
{ return _toolName; }
|
|
|
|
|
|
TutorialEngine* TutorialEngine::get ( const Cell* cell )
|
|
{ return static_cast<TutorialEngine*>(ToolEngine::get(cell,staticGetName())); }
|
|
|
|
|
|
TutorialEngine::TutorialEngine ( Cell* cell )
|
|
: Super (cell)
|
|
, _viewer (NULL)
|
|
{ }
|
|
|
|
|
|
void TutorialEngine::_postCreate ()
|
|
{
|
|
Super::_postCreate ();
|
|
}
|
|
|
|
|
|
TutorialEngine* TutorialEngine::create ( Cell* cell )
|
|
{
|
|
TutorialEngine* tutorial = new TutorialEngine ( cell );
|
|
|
|
tutorial->_postCreate();
|
|
|
|
return tutorial;
|
|
}
|
|
|
|
|
|
void TutorialEngine::_preDestroy ()
|
|
{ }
|
|
|
|
|
|
TutorialEngine::~TutorialEngine ()
|
|
{ }
|
|
|
|
|
|
const Name& TutorialEngine::getName () const
|
|
{ return _toolName; }
|
|
|
|
|
|
Cell* TutorialEngine::runDemoPart1 ()
|
|
{
|
|
cerr << "TutorialEngine::runDemoPart1() has been called." << endl;
|
|
|
|
CRL::AllianceFramework* framework = CRL::AllianceFramework::get();
|
|
|
|
UpdateSession::open();
|
|
|
|
Cell* demo = framework->createCell( "demo_cell_2" );
|
|
demo->setAbutmentBox( Box( DbU::fromLambda( 0.0)
|
|
, DbU::fromLambda( 0.0)
|
|
, DbU::fromLambda(135.0)
|
|
, DbU::fromLambda(110.0)
|
|
) );
|
|
|
|
// Instanciation & placement of "i1_xr2".
|
|
Cell* model = framework->getCell( "xr2_x1", CRL::Catalog::State::Views );
|
|
Instance* i1_xr2 = Instance::create( demo, "i1_xr2", model );
|
|
i1_xr2->setTransformation( Transformation( DbU::fromLambda( 0.0 )
|
|
, DbU::fromLambda( 0.0 )
|
|
, Transformation::Orientation::ID
|
|
) );
|
|
i1_xr2->setPlacementStatus( Instance::PlacementStatus::PLACED );
|
|
|
|
// Instanciation & placement of "i2_xr2".
|
|
model = framework->getCell( "xr2_x1", CRL::Catalog::State::Views );
|
|
Instance* i2_xr2 = Instance::create( demo, "i2_xr2", model );
|
|
i2_xr2->setTransformation( Transformation( DbU::fromLambda( 55.0 )
|
|
, DbU::fromLambda( 0.0 )
|
|
, Transformation::Orientation::ID
|
|
) );
|
|
i2_xr2->setPlacementStatus( Instance::PlacementStatus::PLACED );
|
|
|
|
// Instanciation & placement of "i3_a2".
|
|
model = framework->getCell( "a2_x2", CRL::Catalog::State::Views );
|
|
Instance* i3_a2 = Instance::create( demo, "i3_a2", model );
|
|
i3_a2->setTransformation( Transformation( DbU::fromLambda( 0.0 )
|
|
, DbU::fromLambda( 100.0 )
|
|
, Transformation::Orientation::MY
|
|
) );
|
|
i3_a2->setPlacementStatus( Instance::PlacementStatus::PLACED );
|
|
|
|
// Instanciation & placement of "i4_a2".
|
|
model = framework->getCell( "a2_x2", CRL::Catalog::State::Views );
|
|
Instance* i4_a2 = Instance::create( demo, "i4_a2", model );
|
|
i4_a2->setTransformation( Transformation( DbU::fromLambda( 55.0 )
|
|
, DbU::fromLambda( 100.0 )
|
|
, Transformation::Orientation::MY
|
|
) );
|
|
i4_a2->setPlacementStatus( Instance::PlacementStatus::PLACED );
|
|
|
|
// Instanciation & placement of "i1_xr2".
|
|
model = framework->getCell( "o2_x2", CRL::Catalog::State::Views );
|
|
Instance* i5_o2 = Instance::create( demo, "i5_o2", model );
|
|
i5_o2->setTransformation( Transformation( DbU::fromLambda( 110.0 )
|
|
, DbU::fromLambda( 0.0 )
|
|
, Transformation::Orientation::ID
|
|
) );
|
|
i5_o2->setPlacementStatus( Instance::PlacementStatus::PLACED );
|
|
|
|
UpdateSession::close();
|
|
|
|
return demo;
|
|
}
|
|
|
|
|
|
void TutorialEngine::runDemoPart2 ()
|
|
{
|
|
cerr << "TutorialEngine::runDemoPart2() has been called." << endl;
|
|
|
|
Cell* cell = getCell();
|
|
|
|
UpdateSession::open();
|
|
|
|
Net* net = Net::create( cell, "demo" );
|
|
Instance* i1_xr2 = cell->getInstance( "i1_xr2" );
|
|
Plug* plug = i1_xr2->getPlug( i1_xr2->getMasterCell()->getNet("q") );
|
|
plug->setNet( net );
|
|
|
|
RoutingPad* rp1 = RoutingPad::create( net, Occurrence(plug) );
|
|
rp1->setOnBestComponent( RoutingPad::BiggestArea );
|
|
|
|
Instance* i2_xr2 = cell->getInstance( "i2_xr2" );
|
|
plug = i2_xr2->getPlug( i2_xr2->getMasterCell()->getNet("i0") );
|
|
plug->setNet( net );
|
|
|
|
RoutingPad* rp2 = RoutingPad::create( net, Occurrence(plug) );
|
|
rp2->setOnBestComponent( RoutingPad::BiggestArea );
|
|
|
|
Instance* i4_a2 = cell->getInstance( "i4_a2" );
|
|
plug = i4_a2->getPlug( i4_a2->getMasterCell()->getNet("i0") );
|
|
plug->setNet( net );
|
|
|
|
RoutingPad* rp3 = RoutingPad::create( net, Occurrence(plug) );
|
|
rp3->setOnBestComponent( RoutingPad::BiggestArea );
|
|
|
|
UpdateSession::close();
|
|
Breakpoint::stop( 1, "RoutingPad createds" );
|
|
UpdateSession::open();
|
|
|
|
Technology* technology = DataBase::getDB()->getTechnology();
|
|
Layer* metal2 = technology->getLayer( "METAL2" );
|
|
Layer* metal3 = technology->getLayer( "METAL3" );
|
|
Layer* via1 = technology->getLayer( "VIA12" );
|
|
Layer* via2 = technology->getLayer( "VIA23" );
|
|
|
|
Contact* contact1 = Contact::create( rp1, via1, DbU::fromLambda( 0.0), DbU::fromLambda( 0.0) );
|
|
Contact* contact2 = Contact::create( rp2, via1, DbU::fromLambda( 0.0), DbU::fromLambda(-5.0) );
|
|
Contact* contact3 = Contact::create( rp3, via1, DbU::fromLambda( 0.0), DbU::fromLambda( 0.0) );
|
|
Contact* contact4 = Contact::create( net, via2, DbU::fromLambda(50.0), DbU::fromLambda(20.0) );
|
|
Contact* contact5 = Contact::create( net, via2, DbU::fromLambda(50.0), DbU::fromLambda(75.0) );
|
|
|
|
Horizontal::create( contact1, contact4, metal2, DbU::fromLambda(20.0), DbU::fromLambda(2.0) );
|
|
Horizontal::create( contact4, contact2, metal2, DbU::fromLambda(20.0), DbU::fromLambda(2.0) );
|
|
Horizontal::create( contact5, contact3, metal2, DbU::fromLambda(75.0), DbU::fromLambda(2.0) );
|
|
Vertical::create ( contact4, contact5, metal3, DbU::fromLambda(50.0), DbU::fromLambda(2.0) );
|
|
|
|
UpdateSession::close();
|
|
|
|
cout << "All components of " << net << endl;
|
|
for ( Component* component : net->getComponents() ) {
|
|
cout << "| " << component << endl;
|
|
}
|
|
Breakpoint::stop( 1, "Contacts and wires createds" );
|
|
UpdateSession::open();
|
|
|
|
contact5->destroy();
|
|
|
|
UpdateSession::close();
|
|
}
|
|
|
|
|
|
string TutorialEngine::_getTypeName () const
|
|
{ return "Tutorial::TutorialEngine"; }
|
|
|
|
|
|
string TutorialEngine::_getString () const
|
|
{
|
|
ostringstream os;
|
|
os << "<" << "TutorialEngine " << _cell->getName () << ">";
|
|
return os.str();
|
|
}
|
|
|
|
|
|
Record* TutorialEngine::_getRecord () const
|
|
{
|
|
Record* record = Super::_getRecord ();
|
|
|
|
if (record) {
|
|
// Add new records here.
|
|
}
|
|
return record;
|
|
}
|
|
|
|
|
|
} // Tutorial namespace.
|