* ./knik/src:
- Change: In LoadSolution check for missing global routing on nets. Nets with more than one pad, a BB greater than a GCell and no GContacts.
This commit is contained in:
parent
b4887b1180
commit
4a33fa12b3
|
@ -2,14 +2,9 @@
|
|||
// -*- C++ -*-
|
||||
//
|
||||
// This file is part of the Coriolis Software.
|
||||
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
|
||||
// Copyright (c) UPMC 2008-2013, All Rights Reserved
|
||||
//
|
||||
// ===================================================================
|
||||
//
|
||||
// $Id$
|
||||
//
|
||||
// x-----------------------------------------------------------------x
|
||||
// | |
|
||||
// +-----------------------------------------------------------------+
|
||||
// | C O R I O L I S |
|
||||
// | K n i k - Global Router |
|
||||
// | |
|
||||
|
@ -17,36 +12,30 @@
|
|||
// | E-mail : Damien.Dupuis@lip6.fr |
|
||||
// | =============================================================== |
|
||||
// | C++ Module : "./LoadSolution.cpp" |
|
||||
// | *************************************************************** |
|
||||
// | U p d a t e s |
|
||||
// | |
|
||||
// x-----------------------------------------------------------------x
|
||||
// +-----------------------------------------------------------------+
|
||||
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include "hurricane/Error.h"
|
||||
#include "hurricane/DataBase.h"
|
||||
#include "hurricane/Technology.h"
|
||||
#include "hurricane/Layer.h"
|
||||
#include "hurricane/Contact.h"
|
||||
#include "hurricane/Vertical.h"
|
||||
#include "hurricane/Horizontal.h"
|
||||
#include "hurricane/RoutingPad.h"
|
||||
#include "hurricane/Cell.h"
|
||||
#include "hurricane/UpdateSession.h"
|
||||
|
||||
#include "crlcore/Utilities.h"
|
||||
#include "crlcore/Measures.h"
|
||||
|
||||
#include "knik/Configuration.h"
|
||||
#include "knik/Graph.h"
|
||||
#include "knik/KnikEngine.h"
|
||||
#include <iostream>
|
||||
#include "hurricane/Error.h"
|
||||
#include "hurricane/Warning.h"
|
||||
#include "hurricane/DataBase.h"
|
||||
#include "hurricane/Technology.h"
|
||||
#include "hurricane/Layer.h"
|
||||
#include "hurricane/Contact.h"
|
||||
#include "hurricane/Vertical.h"
|
||||
#include "hurricane/Horizontal.h"
|
||||
#include "hurricane/RoutingPad.h"
|
||||
#include "hurricane/Cell.h"
|
||||
#include "hurricane/UpdateSession.h"
|
||||
#include "crlcore/Utilities.h"
|
||||
#include "crlcore/Measures.h"
|
||||
#include "knik/Configuration.h"
|
||||
#include "knik/Graph.h"
|
||||
#include "knik/KnikEngine.h"
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
|
||||
using std::string;
|
||||
using std::cerr;
|
||||
using std::endl;
|
||||
|
@ -58,6 +47,7 @@ namespace {
|
|||
|
||||
using Hurricane::ForEachIterator;
|
||||
using Hurricane::Error;
|
||||
using Hurricane::Warning;
|
||||
using Hurricane::DbU;
|
||||
using Hurricane::Point;
|
||||
using Hurricane::Box;
|
||||
|
@ -293,117 +283,140 @@ namespace {
|
|||
|
||||
void SolutionParser::load ()
|
||||
{
|
||||
UpdateSession::open ();
|
||||
UpdateSession::open();
|
||||
|
||||
|
||||
try {
|
||||
cmess1 << " o Loading solution: \"" << _fileName << "\"." << endl;
|
||||
|
||||
CRL::IoFile fileStream ( _fileName );
|
||||
fileStream.open ( "r" );
|
||||
if ( !fileStream.isOpen() )
|
||||
throw Error ("Can't open/read file: %s.",_fileName.c_str());
|
||||
fileStream.open( "r" );
|
||||
if (not fileStream.isOpen())
|
||||
throw Error( "Can't open/read file: %s.", _fileName.c_str() );
|
||||
|
||||
unsigned int contactCount = 0;
|
||||
unsigned int segmentCount = 0;
|
||||
GContactMap contactMap ( _knik, _gmetalh, _gmetalv );
|
||||
unsigned int missingGlobalRouting = 0;
|
||||
unsigned int contactCount = 0;
|
||||
unsigned int segmentCount = 0;
|
||||
GContactMap contactMap ( _knik, _gmetalh, _gmetalv );
|
||||
|
||||
while ( !fileStream.eof() ) {
|
||||
fileStream.readLine ( _rawLine, RawLineSize );
|
||||
while ( not fileStream.eof() ) {
|
||||
fileStream.readLine( _rawLine, RawLineSize );
|
||||
_lineNumber++;
|
||||
|
||||
if ( _rawLine[0] == '\0' ) break;
|
||||
if ( _rawLine[0] == '\n' ) continue;
|
||||
if (_rawLine[0] == '\0') break;
|
||||
if (_rawLine[0] == '\n') continue;
|
||||
|
||||
vector<char*> fields = _splitString ( _rawLine );
|
||||
vector<char*> fields = _splitString( _rawLine );
|
||||
if ( fields.size() != 3 )
|
||||
throw Error ( LoadError, "Malformed Net Line", _fileName.c_str(), _lineNumber );
|
||||
throw Error( LoadError, "Malformed Net Line", _fileName.c_str(), _lineNumber );
|
||||
else {
|
||||
Name netName = Name ( fields[0] );
|
||||
unsigned nbPins = _getLong ( fields[2] );
|
||||
Net* net = _knik->getCell()->getNet ( netName );
|
||||
Name netName = Name ( fields[0] );
|
||||
unsigned int nbPins = _getLong( fields[2] );
|
||||
unsigned int nbSegments = 0;
|
||||
unsigned int nbRoutingPad = 0;
|
||||
Net* net = _knik->getCell()->getNet( netName );
|
||||
|
||||
if ( !net ) {
|
||||
if (not net) {
|
||||
string message = "Cell has no Net: ";
|
||||
message += getString(netName);
|
||||
throw Error ( LoadError, message.c_str(), _fileName.c_str(), _lineNumber );
|
||||
throw Error( LoadError, message.c_str(), _fileName.c_str(), _lineNumber );
|
||||
}
|
||||
|
||||
contactMap.setNet ( net );
|
||||
contactMap.setNet( net );
|
||||
|
||||
for ( unsigned i = 0 ; i < nbPins ; i++ ) {
|
||||
fileStream.readLine ( _rawLine, RawLineSize );
|
||||
fileStream.readLine( _rawLine, RawLineSize );
|
||||
_lineNumber++;
|
||||
fields = _splitSegmentString ( _rawLine );
|
||||
if ( fields.size() != 6 )
|
||||
throw Error ( LoadError, "Malformed Net Line", _fileName.c_str(), _lineNumber );
|
||||
fields = _splitSegmentString( _rawLine );
|
||||
if (fields.size() != 6)
|
||||
throw Error( LoadError, "Malformed Net Line", _fileName.c_str(), _lineNumber );
|
||||
else {
|
||||
DbU::Unit xSource = DbU::lambda(_getLong(fields[0]));
|
||||
DbU::Unit ySource = DbU::lambda(_getLong(fields[1]));
|
||||
unsigned zSource = (unsigned) (_getLong(fields[2]));
|
||||
DbU::Unit xTarget = DbU::lambda(_getLong(fields[3]));
|
||||
DbU::Unit yTarget = DbU::lambda(_getLong(fields[4]));
|
||||
unsigned zTarget = (unsigned) (_getLong(fields[5]));
|
||||
DbU::Unit xSource = DbU::lambda( _getLong(fields[0]) );
|
||||
DbU::Unit ySource = DbU::lambda( _getLong(fields[1]) );
|
||||
unsigned int zSource = (unsigned) ( _getLong(fields[2]) );
|
||||
DbU::Unit xTarget = DbU::lambda( _getLong(fields[3]) );
|
||||
DbU::Unit yTarget = DbU::lambda( _getLong(fields[4]) );
|
||||
unsigned int zTarget = (unsigned) ( _getLong(fields[5]) );
|
||||
|
||||
Contact* source = contactMap.find ( xSource, ySource, zSource );
|
||||
Contact* target = contactMap.find ( xTarget, yTarget, zTarget );
|
||||
Segment* segment = NULL;
|
||||
Contact* source = contactMap.find( xSource, ySource, zSource );
|
||||
Contact* target = contactMap.find( xTarget, yTarget, zTarget );
|
||||
Segment* segment = NULL;
|
||||
|
||||
unsigned int type = ((ySource == yTarget)?1:0) + ((xSource == xTarget)?2:0);
|
||||
switch ( type ) {
|
||||
case 0:
|
||||
throw Error(NotManhattan
|
||||
,DbU::getValueString(xSource).c_str()
|
||||
,DbU::getValueString(ySource).c_str()
|
||||
,DbU::getValueString(xTarget).c_str()
|
||||
,DbU::getValueString(yTarget).c_str()
|
||||
,_fileName.c_str()
|
||||
,_lineNumber
|
||||
throw Error( NotManhattan
|
||||
, DbU::getValueString(xSource).c_str()
|
||||
, DbU::getValueString(ySource).c_str()
|
||||
, DbU::getValueString(xTarget).c_str()
|
||||
, DbU::getValueString(yTarget).c_str()
|
||||
, _fileName.c_str()
|
||||
, _lineNumber
|
||||
);
|
||||
case 1:
|
||||
segment = Horizontal::create ( source, target, _gmetalh, ySource, DbU::lambda(2.0) );
|
||||
segmentCount++;
|
||||
segment = Horizontal::create( source, target, _gmetalh, ySource, DbU::lambda(2.0) );
|
||||
++nbSegments;
|
||||
break;
|
||||
case 2:
|
||||
segment = Vertical::create ( source, target, _gmetalv, xSource, DbU::lambda(2.0) );
|
||||
segmentCount++;
|
||||
segment = Vertical::create( source, target, _gmetalv, xSource, DbU::lambda(2.0) );
|
||||
++nbSegments;
|
||||
break;
|
||||
case 3:
|
||||
break;
|
||||
}
|
||||
|
||||
if ( segment ) _knik->insertSegment ( segment );
|
||||
if (segment) _knik->insertSegment( segment );
|
||||
}
|
||||
}
|
||||
fileStream.readLine ( _rawLine, RawLineSize );
|
||||
fileStream.readLine( _rawLine, RawLineSize );
|
||||
_lineNumber++;
|
||||
if ( _rawLine[0] != '!' )
|
||||
throw Error("KnikEngine::loadSolution(): Tu t'es vu quand t'as bu! (%ld)."
|
||||
,getString(_lineNumber).c_str());
|
||||
if (_rawLine[0] != '!')
|
||||
throw Error( "KnikEngine::loadSolution(): Tu t'es vu quand t'as bu! (%ld)."
|
||||
, getString(_lineNumber).c_str());
|
||||
|
||||
RoutingPad* previousRp = NULL;
|
||||
forEach ( RoutingPad*, rp, net->getComponents().getSubSet<RoutingPad*>() ) {
|
||||
Contact* gcontact = contactMap.findVertexContact ( rp->getBoundingBox() );
|
||||
if ( gcontact ) {
|
||||
rp->getBodyHook()->attach ( gcontact->getBodyHook() );
|
||||
Box rpBox;
|
||||
RoutingPad* previousRp = NULL;
|
||||
forEach ( RoutingPad*, rp, net->getRoutingPads() ) {
|
||||
rpBox.merge( rp->getBoundingBox() );
|
||||
Contact* gcontact = contactMap.findVertexContact( rp->getBoundingBox() );
|
||||
if (gcontact) {
|
||||
rp->getBodyHook()->attach( gcontact->getBodyHook() );
|
||||
} else {
|
||||
if ( previousRp )
|
||||
rp->getBodyHook()->attach ( previousRp->getBodyHook() );
|
||||
if (previousRp)
|
||||
rp->getBodyHook()->attach( previousRp->getBodyHook() );
|
||||
}
|
||||
previousRp = *rp;
|
||||
++nbRoutingPad;
|
||||
//cerr << rp->_getString() << " should be attached to " << gcontact << endl;
|
||||
}
|
||||
|
||||
contactCount += contactMap.size ();
|
||||
contactMap.clear ();
|
||||
if ( (nbRoutingPad > 1)
|
||||
and (not contactMap.size())
|
||||
and ( (rpBox.getHeight() > DbU::fromLambda(50.0))
|
||||
or (rpBox.getWidth () > DbU::fromLambda(50.0)) ) ) {
|
||||
++missingGlobalRouting;
|
||||
cerr << Warning( "Net <%s> is missing global routing."
|
||||
, getString(net->getName()).c_str() ) << endl;
|
||||
}
|
||||
|
||||
segmentCount += nbSegments;
|
||||
contactCount += contactMap.size();
|
||||
contactMap.clear();
|
||||
}
|
||||
}
|
||||
|
||||
fileStream.close ();
|
||||
fileStream.close();
|
||||
|
||||
if (missingGlobalRouting)
|
||||
throw Error( "At least %d nets are missing global routing. Maybe a corrupted <.kgr> file?"
|
||||
, missingGlobalRouting
|
||||
);
|
||||
}
|
||||
catch ( Error& e ) {
|
||||
cerr << e << endl;
|
||||
UpdateSession::close ();
|
||||
//cerr << e << endl;
|
||||
throw;
|
||||
}
|
||||
|
||||
UpdateSession::close ();
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#include <ext/algorithm>
|
||||
#include <algorithm>
|
||||
|
||||
#include "hurricane/Cell.h"
|
||||
#include "hurricane/Box.h"
|
||||
|
|
Loading…
Reference in New Issue