* nero/src/ :

- Bug : the size of the non-default width VIA was not correctly computed.
       The result was bigger obstacles cluttering the routing grid and
       forcing unneeded detours.
This commit is contained in:
Jean-Paul Chaput 2005-04-07 14:56:18 +00:00
parent 883eda0309
commit be25914da2
7 changed files with 90 additions and 22 deletions

View File

@ -1,7 +1,7 @@
// -*- C++ -*-
//
// $Id: AAstar.cpp,v 1.9 2004/12/14 19:02:07 jpc Exp $
// $Id: AAstar.cpp,v 1.10 2005/04/07 14:56:18 jpc Exp $
//
// /----------------------------------------------------------------\
// | |
@ -322,7 +322,10 @@ void CAStar::CNodeAS::successors (CNodeASSet &NS, CNet *net, CNodeAS *(*success
}
// Check if the node is an obstacle.
if (neighbor.node().data.obstacle) continue;
if (neighbor.node().data.obstacle) {
cdebug << "+ neighbour is an obstacle." << "\n";
continue;
}
// Check the tag map (already reached if tagged.)
if (pNodeAS->tagged) continue;

View File

@ -1,7 +1,7 @@
// -*- C++ -*-
//
// $Id: MMBK.cpp,v 1.4 2002/10/24 07:51:33 hcl Exp $
// $Id: MMBK.cpp,v 1.5 2005/04/07 14:56:18 jpc Exp $
//
// /-----------------------------------------------------------------\
// | |
@ -770,7 +770,7 @@ CFig::~CFig (void)
// -------------------------------------------------------------------
// Method : "CFig::addphseg()".
void CFig::addphseg (phseg_list &seg)
void CFig::addphseg (phseg_list &seg, bool isTerm )
{
MBK::addphseg ( phfig.fig
, seg.LAYER
@ -781,6 +781,18 @@ void CFig::addphseg (phseg_list &seg)
, seg.Y2
, seg.NAME
);
if ( !isTerm ) {
MBK::addphseg ( phfig.fig
, layer2TALU(seg.LAYER)
, seg.WIDTH
, seg.X1
, seg.Y1
, seg.X2
, seg.Y2
, "obs"
);
}
}
@ -928,6 +940,48 @@ bool isCALU (char layer)
// -------------------------------------------------------------------
// Function : "layer2TALU()".
char layer2TALU (char layer)
{
switch (layer) {
case ALU1:
case TALU1:
return (TALU1);
case ALU2:
case TALU2:
return (TALU2);
case ALU3:
case TALU3:
return (TALU3);
case ALU4:
case TALU4:
return (TALU4);
case ALU5:
case TALU5:
return (TALU5);
case ALU6:
case TALU6:
return (TALU6);
case TALU7:
case ALU7:
return (TALU7);
case TALU8:
case ALU8:
return (TALU8);
case TALU9:
case ALU9:
return (TALU9);
}
return (TALU1);
}
// -------------------------------------------------------------------
// Function : "layer2CALU()".

View File

@ -1,7 +1,7 @@
// -*- C++ -*-
//
// $Id: MMBK.h,v 1.2 2002/10/17 21:57:27 jpc Exp $
// $Id: MMBK.h,v 1.3 2005/04/07 14:56:18 jpc Exp $
//
// /-----------------------------------------------------------------\
// | |
@ -93,6 +93,7 @@ namespace MBK {
extern bool isCALU (char layer);
extern char layer2ALU (char layer);
extern char layer2CALU (char layer);
extern char layer2TALU (char layer);
extern long cmpALU (char layer1, char layer2);
extern char topVIALayer (char type);
extern char bottomVIALayer (char type);
@ -267,7 +268,7 @@ namespace MBK {
losig_list *LOSIG (void) { return (lofig.fig->LOSIG); }
// Modifiers.
void addphseg (phseg_list &seg);
void addphseg (phseg_list &seg, bool isTerm=false );
void addphvia (phvia_list &VIA);
void addphcon (phcon_list &con);

View File

@ -1,7 +1,7 @@
// -*- C++ -*-
//
// $Id: MNodes.cpp,v 1.2 2002/10/13 14:22:47 jpc Exp $
// $Id: MNodes.cpp,v 1.3 2005/04/07 14:56:18 jpc Exp $
//
// /----------------------------------------------------------------\
// | |
@ -121,8 +121,10 @@ void CMatrixNodes::obstacle (CRect &rect, int z)
for (x = rect.x1; x <= X; x++) {
for (y = rect.y1; y <= Y; y++) {
if ( ! (*this)[ coord.set (x, y, z) ].terminal () )
if ( ! (*this)[ coord.set (x, y, z) ].terminal () ) {
cdebug << "+ Obstacle at (" << x << "," << y << "," << z << ")" << "\n";
(*this)[ coord ].data.obstacle = true;
}
}
}
}

View File

@ -1,7 +1,7 @@
// -*- C++ -*-
//
// $Id: MPower.cpp,v 1.2 2002/10/13 14:22:47 jpc Exp $
// $Id: MPower.cpp,v 1.3 2005/04/07 14:56:18 jpc Exp $
//
// /-----------------------------------------------------------------\
// | |
@ -325,7 +325,7 @@ void CPowers::dump (CFig *fig)
}
}
fig->addphseg (seg);
fig->addphseg (seg,true);
if (con1.ORIENT != (char)0) fig->addphcon (con1);
if (con2.ORIENT != (char)0) fig->addphcon (con2);

View File

@ -1,7 +1,7 @@
// -*- C++ -*-
//
// $Id: RMBK.cpp,v 1.7 2004/12/14 19:02:07 jpc Exp $
// $Id: RMBK.cpp,v 1.8 2005/04/07 14:56:18 jpc Exp $
//
// /----------------------------------------------------------------\
// | |
@ -173,6 +173,7 @@ void CRBox::mbkload (MBK::CFig *mbkfig, int z, int zup, int rtype)
if (pSeg->LAYER != MBK::CALU1) {
rect->setSeg (*pSeg);
//cerr << "+ Top power obstacle" << endl;
drgrid->nodes->obstacle (rect->grid, MBK::env.layer2z (pSeg->LAYER));
}
@ -227,14 +228,17 @@ void CRBox::mbkload (MBK::CFig *mbkfig, int z, int zup, int rtype)
if (flatSeg.LAYER == MBK::CALU1) continue;
flatSeg.X1 = pVIA->XVIA - pVIA->DX / 2;
flatSeg.X2 = pVIA->XVIA - pVIA->DX / 2;
long xVIAshrink = 0;
if (pVIA->DX) { xVIAshrink = (pVIA->DX - MBK::SCALE(3)) / 2; }
flatSeg.X1 = pVIA->XVIA - xVIAshrink;
flatSeg.X2 = pVIA->XVIA + xVIAshrink;
flatSeg.Y1 = pVIA->YVIA;
flatSeg.Y2 = pVIA->YVIA;
flatSeg.WIDTH = pVIA->DY;
rect->setSeg (flatSeg);
//cerr << "+ Top VIA obstacle (" << pVIA->XVIA << "," << pVIA->YVIA << ")" << endl;
drgrid->nodes->obstacle (rect->grid, MBK::env.layer2z (flatSeg.LAYER));
}
@ -261,7 +265,11 @@ void CRBox::mbkload (MBK::CFig *mbkfig, int z, int zup, int rtype)
itIns->second->flatseg (flatSeg, *pSeg);
rect->setSeg (flatSeg);
//cerr << "+ Instance obstacle (" << flatSeg.X1 << "," << flatSeg.Y1 << ")" << endl;
drgrid->nodes->obstacle (rect->grid, MBK::env.layer2z (pSeg->LAYER));
if ( !MBK::ISVDD (pSeg->NAME) && !MBK::ISVSS (pSeg->NAME) )
fig->addphseg ( flatSeg, true );
}
}
}
@ -463,7 +471,7 @@ void CRBox::mbkload (MBK::CFig *mbkfig, int z, int zup, int rtype)
// Dump the current one.
if (seg.X1 < seg.X2) {
// This is not a "dot" segment (i.e a VIA).
fig->addphseg (seg);
fig->addphseg (seg,pNet->external);
}
// Force segment restarting.
@ -494,7 +502,7 @@ void CRBox::mbkload (MBK::CFig *mbkfig, int z, int zup, int rtype)
// Dump the current one.
if (seg.X1 < seg.X2) {
// This is not a "dot" segment (i.e a VIA).
fig->addphseg (seg);
fig->addphseg (seg,pNet->external);
}
}
@ -507,7 +515,7 @@ void CRBox::mbkload (MBK::CFig *mbkfig, int z, int zup, int rtype)
// This segment touch the AB.
if (seg.X1 < seg.X2) {
// This is not a "dot" segment (i.e a VIA).
fig->addphseg (seg);
fig->addphseg (seg,pNet->external);
}
}
@ -528,7 +536,7 @@ void CRBox::mbkload (MBK::CFig *mbkfig, int z, int zup, int rtype)
// Dump the current one.
if (seg.Y1 < seg.Y2) {
// This is not a "dot" segment (i.e a VIA).
fig->addphseg (seg);
fig->addphseg (seg,pNet->external);
}
// Force segment restarting.
@ -560,7 +568,7 @@ void CRBox::mbkload (MBK::CFig *mbkfig, int z, int zup, int rtype)
// Dump the current one.
if (seg.Y1 < seg.Y2) {
// This is not a "dot" segment (i.e a VIA).
fig->addphseg (seg);
fig->addphseg (seg,pNet->external);
}
}
@ -573,7 +581,7 @@ void CRBox::mbkload (MBK::CFig *mbkfig, int z, int zup, int rtype)
// This segment touch the AB.
if (seg.Y1 < seg.Y2) {
// This is not a "dot" segment (i.e a VIA).
fig->addphseg (seg);
fig->addphseg (seg,pNet->external);
}
}
@ -703,7 +711,7 @@ void CRBox::mbkload (MBK::CFig *mbkfig, int z, int zup, int rtype)
seg.WIDTH = MBK::env.z2width (0);
seg.LAYER = MBK::env.z2calu (0);
fig->addphseg (seg);
fig->addphseg (seg,itNet->second->external);
}

View File

@ -1,7 +1,7 @@
// -*- C++ -*-
//
// $Id: nero.cpp,v 1.7 2005/02/07 05:54:41 hcl Exp $
// $Id: nero.cpp,v 1.8 2005/04/07 14:56:18 jpc Exp $
//
// /----------------------------------------------------------------\
// | |
@ -94,7 +94,7 @@ static void help (void)
static void serial (void)
{
cout << " S/N 20021117.1\n";
cout << " S/N 20050406.1\n";
}