* nero/src/MNet.cpp,
nero/src/MDefs.h, nero/src/RMBK.cpp : - Ajout d'une prise en compte limitee du pre-routage. Ceci implique de pouvoir fusionner deux CTerm au cours de la construction d'un CNet. D'ou l'introduction d'une nouvelle exception "merge_term" qui est relachee par "CNet::newaccess()" pour etre attrapee par "CNet::newaccess()".
This commit is contained in:
parent
d9d3489a97
commit
7b5147ff05
|
@ -1,7 +1,7 @@
|
|||
|
||||
// -*- C++ -*-
|
||||
//
|
||||
// $Id: MDefs.h,v 1.4 2002/10/29 18:46:03 jpc Exp $
|
||||
// $Id: MDefs.h,v 1.5 2002/11/04 14:43:08 jpc Exp $
|
||||
//
|
||||
// /-----------------------------------------------------------------\
|
||||
// | |
|
||||
|
@ -534,6 +534,26 @@
|
|||
|
||||
|
||||
|
||||
// ---------------------------------------------------------------
|
||||
// Terminal merging exception.
|
||||
|
||||
class merge_term : public except_done {
|
||||
|
||||
// Attributes.
|
||||
public: int id;
|
||||
|
||||
// Constructor.
|
||||
public: merge_term (int mergeid) { id = mergeid; }
|
||||
|
||||
// Overridables.
|
||||
public: const char* what () const throw () {
|
||||
return ((char*)"Terminal must be merged.");
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
// ---------------------------------------------------------------
|
||||
// Terminal class.
|
||||
|
||||
|
@ -558,8 +578,9 @@
|
|||
|
||||
// Modifiers.
|
||||
public: CNode *newaccess (int x, int y, int z, int ident, CNet *net)
|
||||
throw (dup_term, bad_grab);
|
||||
throw (dup_term, bad_grab, merge_term);
|
||||
public: void newaccess (CRect &rect, int z, int ident, CNet *net);
|
||||
public: void merge (CTerm *other, int ident, CNet *net);
|
||||
public: void lockalone (bool global=false);
|
||||
public: void setid (int ident);
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
|
||||
// -*- C++ -*-
|
||||
//
|
||||
// $Id: MNet.cpp,v 1.5 2002/10/29 18:46:03 jpc Exp $
|
||||
// $Id: MNet.cpp,v 1.6 2002/11/04 14:43:08 jpc Exp $
|
||||
//
|
||||
// /----------------------------------------------------------------\
|
||||
// | |
|
||||
|
@ -50,11 +50,11 @@ CTerm::~CTerm (void)
|
|||
//list<CNode*>::iterator pNode;
|
||||
|
||||
|
||||
//for (pNode = nodes.begin (); pNode != nodes.end (); pNode++) {
|
||||
// if ((*pNode)->coord.z() == 0) delete (*pNode);
|
||||
//}
|
||||
//for (pNode = nodes.begin (); pNode != nodes.end (); pNode++)
|
||||
// (*pNode)->ungrab ();
|
||||
|
||||
nodes.clear ();
|
||||
rects.clear ();
|
||||
}
|
||||
|
||||
|
||||
|
@ -139,7 +139,7 @@ CDRGrid::iterator &CTerm::lowest (void)
|
|||
// Method : "CTerm::newaccess()".
|
||||
|
||||
CNode *CTerm::newaccess (int x, int y, int z, int ident, CNet *net)
|
||||
throw (dup_term, bad_grab)
|
||||
throw (dup_term, bad_grab, merge_term)
|
||||
{
|
||||
list<CDRGrid::iterator>::iterator itNode;
|
||||
CDRGrid::iterator coord;
|
||||
|
@ -150,30 +150,38 @@ CNode *CTerm::newaccess (int x, int y, int z, int ident, CNet *net)
|
|||
coord = net->_drgrid->origin;
|
||||
coord.set (x, y, z);
|
||||
|
||||
// Check if the node is already in the list...
|
||||
for (itNode = nodes.begin (); itNode != nodes.end (); itNode++) {
|
||||
if (*itNode == coord) {
|
||||
throw dup_term (name, *itNode);
|
||||
}
|
||||
}
|
||||
|
||||
pNode = &coord.node ();
|
||||
if ((z == 0) && coord.isnodehole()) {
|
||||
pNode = &coord.addnode ();
|
||||
}
|
||||
|
||||
// Check if the node has already been took by another terminal.
|
||||
if (pNode->data.owner && (pNode->data.owner != net))
|
||||
throw bad_grab ( pNode->data.owner->terms[pNode->getid()]->name
|
||||
, net->name
|
||||
, coord.x()
|
||||
, coord.y()
|
||||
, coord.z()
|
||||
, 0
|
||||
, pNode->data.pri
|
||||
, pNode->terminal()
|
||||
, pNode->data.ident
|
||||
);
|
||||
if (pNode->data.owner) {
|
||||
// Check if the node has already been took by another terminal.
|
||||
if (pNode->data.owner != net)
|
||||
throw bad_grab ( pNode->data.owner->terms[pNode->getid()]->name
|
||||
, net->name
|
||||
, coord.x()
|
||||
, coord.y()
|
||||
, coord.z()
|
||||
, 0
|
||||
, pNode->data.pri
|
||||
, pNode->terminal()
|
||||
, pNode->data.ident
|
||||
);
|
||||
|
||||
// Check if the node belongs to another terminal of this net.
|
||||
// If so, send a merging exception to CNet::newaccess ().
|
||||
if (pNode->getid () != ident) throw merge_term ( pNode->getid () );
|
||||
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
// Check if the node is already in the list (this should never appens !)
|
||||
for (itNode = nodes.begin (); itNode != nodes.end (); itNode++) {
|
||||
if (*itNode == coord) {
|
||||
throw dup_term (name, *itNode);
|
||||
}
|
||||
}
|
||||
|
||||
pNode->data.owner = net;
|
||||
pNode->data.obstacle = false;
|
||||
|
@ -211,6 +219,23 @@ void CTerm::newaccess (CRect &rect, int z, int ident, CNet *net)
|
|||
|
||||
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
// Method : "CTerm::merge()".
|
||||
|
||||
void CTerm::merge (CTerm *other, int ident, CNet *Net)
|
||||
{
|
||||
list<CDRGrid::iterator>::iterator coord;
|
||||
|
||||
|
||||
for (coord = other->nodes.begin (); coord != other->nodes.end (); coord++) {
|
||||
(*coord).node().setid (ident);
|
||||
nodes.push_back (*coord);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
// Method : "CTerm::lockalone()".
|
||||
|
||||
|
@ -423,7 +448,7 @@ void CNet::newaccess (string termName, int x, int y, int z)
|
|||
void CNet::newaccess (string termName, CRect &rect, int z)
|
||||
{
|
||||
CCoord coord;
|
||||
int id;
|
||||
int id, mergeid;
|
||||
|
||||
|
||||
// Find the terminal in the table.
|
||||
|
@ -440,7 +465,31 @@ void CNet::newaccess (string termName, CRect &rect, int z)
|
|||
}
|
||||
|
||||
// Add the access to the terminal & update the bounding box.
|
||||
terms[id]->newaccess (rect, z, id, this);
|
||||
do {
|
||||
mergeid = INT_MAX;
|
||||
|
||||
try {
|
||||
terms[id]->newaccess (rect, z, id, this);
|
||||
}
|
||||
|
||||
catch (merge_term &e) {
|
||||
mergeid = e.id;
|
||||
|
||||
// Merge terminals ...
|
||||
terms[mergeid]->merge (terms[id], mergeid, this);
|
||||
|
||||
// Erase the merged terminal.
|
||||
delete terms[id];
|
||||
terms.erase (terms.begin () + id);
|
||||
|
||||
size -= 1;
|
||||
|
||||
// Re-computes the terminal's ids.
|
||||
for (id = 0; id < size; id++) terms[id]->setid (id);
|
||||
|
||||
id = mergeid;
|
||||
}
|
||||
} while (mergeid != INT_MAX);
|
||||
|
||||
// Update the bounding box.
|
||||
bb.merge (coord.set (rect.x1, rect.y1, z));
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
|
||||
// -*- C++ -*-
|
||||
//
|
||||
// $Id: RBox.cpp,v 1.2 2002/10/29 18:46:03 jpc Exp $
|
||||
// $Id: RBox.cpp,v 1.3 2002/11/04 14:43:08 jpc Exp $
|
||||
//
|
||||
// /----------------------------------------------------------------\
|
||||
// | |
|
||||
|
@ -168,6 +168,46 @@ void CRBox::route (void)
|
|||
|
||||
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
// Method : "CRBox::findnet()".
|
||||
|
||||
CNet *CRBox::findnet (char *signame)
|
||||
{
|
||||
string name;
|
||||
|
||||
|
||||
name = signame;
|
||||
|
||||
return (findnet(name));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
// Method : "CRBox::findnet()".
|
||||
|
||||
CNet *CRBox::findnet (string &signame)
|
||||
{
|
||||
MNet::iterator itNet, endNet;
|
||||
CNet *pNet;
|
||||
|
||||
|
||||
endNet = nets.end ();
|
||||
itNet = nets.find (signame);
|
||||
|
||||
if (itNet == endNet) {
|
||||
pNet = NULL;
|
||||
} else
|
||||
pNet = itNet->second;
|
||||
|
||||
|
||||
return (pNet);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
// Method : "CRBox::getnet()".
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
|
||||
// -*- C++ -*-
|
||||
//
|
||||
// $Id: RDefs.h,v 1.2 2002/10/29 18:46:03 jpc Exp $
|
||||
// $Id: RDefs.h,v 1.3 2002/11/04 14:43:08 jpc Exp $
|
||||
//
|
||||
// /-----------------------------------------------------------------\
|
||||
// | |
|
||||
|
@ -58,6 +58,8 @@
|
|||
public: ~CRBox (void);
|
||||
|
||||
// Modifiers.
|
||||
public: CNet *findnet (string &signame);
|
||||
public: CNet *findnet (char *signame);
|
||||
public: CNet *getnet (string &signame);
|
||||
public: CNet *getnet (char *signame);
|
||||
public: void mbkload (MBK::CFig *mbkfig, int z, int zup, int rtype);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
|
||||
// -*- C++ -*-
|
||||
//
|
||||
// $Id: RMBK.cpp,v 1.5 2002/10/29 18:46:03 jpc Exp $
|
||||
// $Id: RMBK.cpp,v 1.6 2002/11/04 14:43:08 jpc Exp $
|
||||
//
|
||||
// /----------------------------------------------------------------\
|
||||
// | |
|
||||
|
@ -111,6 +111,44 @@ void CRBox::mbkload (MBK::CFig *mbkfig, int z, int zup, int rtype)
|
|||
rect = new MBK::CXRect (fig->XAB1(), fig->YAB1());
|
||||
|
||||
|
||||
cmess2 << " o Loading external terminals.\n";
|
||||
|
||||
// Browse layout for terminals.
|
||||
for (pPhcon = fig->phfig.fig->PHCON; pPhcon != NULL; pPhcon = pPhcon->NEXT) {
|
||||
if (fig->lofig.signals.find(pPhcon->NAME) == endSig) {
|
||||
cerr << hwarn ("")
|
||||
<< " The terminal \"" << pPhcon->NAME << "\" at ("
|
||||
<< MBK::UNSCALE (pPhcon->XCON) << ","
|
||||
<< MBK::UNSCALE (pPhcon->YCON) << ") layer "
|
||||
<< MBK::layer2a (pPhcon->LAYER) << "\n"
|
||||
<< " do not not belong to any logical signal : ignored.\n";
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
pNet = getnet (pPhcon->NAME);
|
||||
|
||||
term_name = "external.";
|
||||
term_name += pPhcon->NAME;
|
||||
|
||||
flatSeg.X1 = pPhcon->XCON;
|
||||
flatSeg.Y1 = pPhcon->YCON;
|
||||
flatSeg.X2 = pPhcon->XCON;
|
||||
flatSeg.Y2 = pPhcon->YCON;
|
||||
flatSeg.WIDTH = MBK::env.layer2width (pPhcon->LAYER);
|
||||
flatSeg.LAYER = pPhcon->LAYER;
|
||||
flatSeg.NAME = pPhcon->NAME;
|
||||
|
||||
rect->setSeg (flatSeg);
|
||||
|
||||
pNet->newaccess ( term_name
|
||||
, rect->grid
|
||||
, MBK::env.layer2z (pPhcon->LAYER)
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
cmess2 << " o Finding obstacles.\n";
|
||||
|
||||
|
||||
|
@ -201,42 +239,6 @@ void CRBox::mbkload (MBK::CFig *mbkfig, int z, int zup, int rtype)
|
|||
}
|
||||
|
||||
|
||||
// Browse layout for terminals.
|
||||
for (pPhcon = fig->phfig.fig->PHCON; pPhcon != NULL; pPhcon = pPhcon->NEXT) {
|
||||
if (fig->lofig.signals.find(pPhcon->NAME) == endSig) {
|
||||
cerr << hwarn ("")
|
||||
<< " The terminal \"" << pPhcon->NAME << "\" at ("
|
||||
<< MBK::UNSCALE (pPhcon->XCON) << ","
|
||||
<< MBK::UNSCALE (pPhcon->YCON) << ") layer "
|
||||
<< MBK::layer2a (pPhcon->LAYER) << "\n"
|
||||
<< " do not not belong to any logical signal : ignored.\n";
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
pNet = getnet (pPhcon->NAME);
|
||||
|
||||
term_name = "external.";
|
||||
term_name += pPhcon->NAME;
|
||||
|
||||
flatSeg.X1 = pPhcon->XCON;
|
||||
flatSeg.Y1 = pPhcon->YCON;
|
||||
flatSeg.X2 = pPhcon->XCON;
|
||||
flatSeg.Y2 = pPhcon->YCON;
|
||||
flatSeg.WIDTH = MBK::env.layer2width (pPhcon->LAYER);
|
||||
flatSeg.LAYER = pPhcon->LAYER;
|
||||
flatSeg.NAME = pPhcon->NAME;
|
||||
|
||||
rect->setSeg (flatSeg);
|
||||
|
||||
pNet->newaccess ( term_name
|
||||
, rect->grid
|
||||
, MBK::env.layer2z (pPhcon->LAYER)
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// Browse instances & orphans for obstacles.
|
||||
for (itIns = fig->instances.begin(); ; itIns++) {
|
||||
if (itIns == endInstances) itIns = fig->orphans.begin ();
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
|
||||
// -*- C++ -*-
|
||||
//
|
||||
// $Id: nero.cpp,v 1.3 2002/10/29 18:46:03 jpc Exp $
|
||||
// $Id: nero.cpp,v 1.4 2002/11/04 14:43:08 jpc Exp $
|
||||
//
|
||||
// /----------------------------------------------------------------\
|
||||
// | |
|
||||
|
@ -94,7 +94,7 @@ static void help (void)
|
|||
|
||||
static void serial (void)
|
||||
{
|
||||
cout << " S/N 20021028.1\n";
|
||||
cout << " S/N 20021104.1\n";
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue