Commit c4c2cd3a authored by jean-pierre charras's avatar jean-pierre charras

Pcbnew: fix issue about order of tracks this order was modified when reading...

Pcbnew: fix issue about order of tracks this order was modified when reading and writing a board, even without any change in board.
Fix compil warnings and wx28 compatibility.
code cleaning in autoroute functions.
parents a71857ba 8b210d05
......@@ -59,7 +59,7 @@
* graduated from 0 (rotation allowed) to 10 (rotation count null)
* the count is increased.
*/
static const float OrientPenality[11] =
static const double OrientPenality[11] =
{
2.0f, /* CntRot = 0 rotation prohibited */
1.9f, /* CntRot = 1 */
......@@ -82,7 +82,7 @@ static const float OrientPenality[11] =
static wxPoint CurrPosition; // Current position of the current module placement
static bool AutoPlaceShowAll = true;
float MinCout;
double MinCout;
static int TstModuleOnBoard( BOARD* Pcb, MODULE* Module, bool TstOtherSide );
......@@ -251,7 +251,7 @@ void PCB_EDIT_FRAME::AutoPlaceModule( MODULE* Module, int place_mode, wxDC* DC )
DrawInfoPlace( DC );
error = GetOptimalModulePlacement( Module, DC );
float BestScore = MinCout;
double BestScore = MinCout;
PosOK = CurrPosition;
if( error == ESC )
......@@ -388,8 +388,8 @@ void PCB_EDIT_FRAME::DrawInfoPlace( wxDC* DC )
ox = RoutingMatrix.m_BrdBox.GetX() + (jj * RoutingMatrix.m_GridRouting);
color = BLACK;
top_state = GetCell( ii, jj, TOP );
bottom_state = GetCell( ii, jj, BOTTOM );
top_state = RoutingMatrix.GetCell( ii, jj, TOP );
bottom_state = RoutingMatrix.GetCell( ii, jj, BOTTOM );
if( top_state & CELL_is_ZONE )
color = BLUE;
......@@ -403,7 +403,8 @@ void PCB_EDIT_FRAME::DrawInfoPlace( wxDC* DC )
color = LIGHTGREEN;
else /* Display the filling and keep out regions. */
{
if( GetDist( ii, jj, TOP ) || GetDist( ii, jj, BOTTOM ) )
if( RoutingMatrix.GetDist( ii, jj, TOP ) ||
RoutingMatrix.GetDist( ii, jj, BOTTOM ) )
color = DARKGRAY;
}
......@@ -415,7 +416,6 @@ void PCB_EDIT_FRAME::DrawInfoPlace( wxDC* DC )
int PCB_EDIT_FRAME::GenPlaceBoard()
{
int NbCells;
wxString msg;
RoutingMatrix.UnInitRoutingMatrix();
......@@ -429,14 +429,14 @@ int PCB_EDIT_FRAME::GenPlaceBoard()
}
RoutingMatrix.ComputeMatrixSize( GetBoard(), true );
NbCells = Ncols * Nrows;
int nbCells = RoutingMatrix.m_Ncols * RoutingMatrix.m_Nrows;
m_messagePanel->EraseMsgBox();
msg.Printf( wxT( "%d" ), Ncols );
msg.Printf( wxT( "%d" ), RoutingMatrix.m_Ncols );
m_messagePanel->SetMessage( 1, _( "Cols" ), msg, GREEN );
msg.Printf( wxT( "%d" ), Nrows );
msg.Printf( wxT( "%d" ), RoutingMatrix.m_Nrows );
m_messagePanel->SetMessage( 7, _( "Lines" ), msg, GREEN );
msg.Printf( wxT( "%d" ), NbCells );
msg.Printf( wxT( "%d" ), nbCells );
m_messagePanel->SetMessage( 14, _( "Cells." ), msg, YELLOW );
/* Choose the number of board sides. */
......@@ -494,7 +494,8 @@ int PCB_EDIT_FRAME::GenPlaceBoard()
// Mark cells of the routing matrix to CELL_is_ZONE
// (i.e. availlable cell to place a module )
// Init a starting point of attachment to the area.
OrCell( Nrows / 2, Ncols / 2, BOTTOM, CELL_is_ZONE );
RoutingMatrix.OrCell( RoutingMatrix.m_Nrows / 2, RoutingMatrix.m_Ncols / 2,
BOTTOM, CELL_is_ZONE );
// find and mark all other availlable cells:
for( int ii = 1; ii != 0; )
......@@ -503,7 +504,7 @@ int PCB_EDIT_FRAME::GenPlaceBoard()
// Initialize top layer. to the same value as the bottom layer
if( RoutingMatrix.m_BoardSide[TOP] )
memcpy( RoutingMatrix.m_BoardSide[TOP], RoutingMatrix.m_BoardSide[BOTTOM],
NbCells * sizeof(MATRIX_CELL) );
nbCells * sizeof(MATRIX_CELL) );
return 1;
}
......@@ -697,10 +698,10 @@ int PCB_EDIT_FRAME::GetOptimalModulePlacement( MODULE* aModule, wxDC* aDC )
LastPosOK = CurrPosition;
mincout = Score;
wxString msg;
msg.Printf( wxT( "Score %g, pos %3.4f, %3.4f" ),
msg.Printf( wxT( "Score %g, pos %3.4g, %3.4g" ),
mincout,
(float) LastPosOK.x / 10000,
(float) LastPosOK.y / 10000 );
(double) LastPosOK.x / 10000,
(double) LastPosOK.y / 10000 );
SetStatusText( msg );
}
}
......@@ -763,20 +764,20 @@ int TstRectangle( BOARD* Pcb, int ux0, int uy0, int ux1, int uy1, int side )
if( row_min < 0 )
row_min = 0;
if( row_max >= ( Nrows - 1 ) )
row_max = Nrows - 1;
if( row_max >= ( RoutingMatrix.m_Nrows - 1 ) )
row_max = RoutingMatrix.m_Nrows - 1;
if( col_min < 0 )
col_min = 0;
if( col_max >= ( Ncols - 1 ) )
col_max = Ncols - 1;
if( col_max >= ( RoutingMatrix.m_Ncols - 1 ) )
col_max = RoutingMatrix.m_Ncols - 1;
for( row = row_min; row <= row_max; row++ )
{
for( col = col_min; col <= col_max; col++ )
{
data = GetCell( row, col, side );
data = RoutingMatrix.GetCell( row, col, side );
if( ( data & CELL_is_ZONE ) == 0 )
return OUT_OF_BOARD;
......@@ -820,14 +821,14 @@ unsigned int CalculateKeepOutArea( int ux0, int uy0, int ux1, int uy1, int side
if( row_min < 0 )
row_min = 0;
if( row_max >= ( Nrows - 1 ) )
row_max = Nrows - 1;
if( row_max >= ( RoutingMatrix.m_Nrows - 1 ) )
row_max = RoutingMatrix.m_Nrows - 1;
if( col_min < 0 )
col_min = 0;
if( col_max >= ( Ncols - 1 ) )
col_max = Ncols - 1;
if( col_max >= ( RoutingMatrix.m_Ncols - 1 ) )
col_max = RoutingMatrix.m_Ncols - 1;
keepOut = 0;
......@@ -835,7 +836,7 @@ unsigned int CalculateKeepOutArea( int ux0, int uy0, int ux1, int uy1, int side
{
for( col = col_min; col <= col_max; col++ )
{
keepOut += (int) GetDist( row, col, side );
keepOut += RoutingMatrix.GetDist( row, col, side );
}
}
......@@ -1001,14 +1002,14 @@ void CreateKeepOutRectangle( int ux0, int uy0, int ux1, int uy1,
if( row_min < 0 )
row_min = 0;
if( row_max >= (Nrows - 1) )
row_max = Nrows - 1;
if( row_max >= (RoutingMatrix.m_Nrows - 1) )
row_max = RoutingMatrix.m_Nrows - 1;
if( col_min < 0 )
col_min = 0;
if( col_max >= (Ncols - 1) )
col_max = Ncols - 1;
if( col_max >= (RoutingMatrix.m_Ncols - 1) )
col_max = RoutingMatrix.m_Ncols - 1;
for( row = row_min; row <= row_max; row++ )
{
......@@ -1036,15 +1037,15 @@ void CreateKeepOutRectangle( int ux0, int uy0, int ux1, int uy1,
if( trace & 1 )
{
data = GetDist( row, col, BOTTOM ) + LocalKeepOut;
SetDist( row, col, BOTTOM, data );
data = RoutingMatrix.GetDist( row, col, BOTTOM ) + LocalKeepOut;
RoutingMatrix.SetDist( row, col, BOTTOM, data );
}
if( trace & 2 )
{
data = GetDist( row, col, TOP );
data = RoutingMatrix.GetDist( row, col, TOP );
data = MAX( data, LocalKeepOut );
SetDist( row, col, TOP, data );
RoutingMatrix.SetDist( row, col, TOP, data );
}
}
}
......@@ -1180,23 +1181,23 @@ int propagate()
#define NO_CELL_ZONE (HOLE | CELL_is_EDGE | CELL_is_ZONE)
pt_cell_V.reserve( MAX( Nrows, Ncols ) );
pt_cell_V.reserve( MAX( RoutingMatrix.m_Nrows, RoutingMatrix.m_Ncols ) );
fill( pt_cell_V.begin(), pt_cell_V.end(), 0 );
// Search from left to right and top to bottom.
for( row = 0; row < Nrows; row++ )
for( row = 0; row < RoutingMatrix.m_Nrows; row++ )
{
old_cell_H = 0;
for( col = 0; col < Ncols; col++ )
for( col = 0; col < RoutingMatrix.m_Ncols; col++ )
{
current_cell = GetCell( row, col, BOTTOM ) & NO_CELL_ZONE;
current_cell = RoutingMatrix.GetCell( row, col, BOTTOM ) & NO_CELL_ZONE;
if( current_cell == 0 ) /* a free cell is found */
{
if( (old_cell_H & CELL_is_ZONE) || (pt_cell_V[col] & CELL_is_ZONE) )
{
OrCell( row, col, BOTTOM, CELL_is_ZONE );
RoutingMatrix.OrCell( row, col, BOTTOM, CELL_is_ZONE );
current_cell = CELL_is_ZONE;
nbpoints++;
}
......@@ -1209,19 +1210,19 @@ int propagate()
// Search from right to left and top to bottom/
fill( pt_cell_V.begin(), pt_cell_V.end(), 0 );
for( row = 0; row < Nrows; row++ )
for( row = 0; row < RoutingMatrix.m_Nrows; row++ )
{
old_cell_H = 0;
for( col = Ncols - 1; col >= 0; col-- )
for( col = RoutingMatrix.m_Ncols - 1; col >= 0; col-- )
{
current_cell = GetCell( row, col, BOTTOM ) & NO_CELL_ZONE;
current_cell = RoutingMatrix.GetCell( row, col, BOTTOM ) & NO_CELL_ZONE;
if( current_cell == 0 ) /* a free cell is found */
{
if( (old_cell_H & CELL_is_ZONE) || (pt_cell_V[col] & CELL_is_ZONE) )
{
OrCell( row, col, BOTTOM, CELL_is_ZONE );
RoutingMatrix.OrCell( row, col, BOTTOM, CELL_is_ZONE );
current_cell = CELL_is_ZONE;
nbpoints++;
}
......@@ -1234,19 +1235,19 @@ int propagate()
// Search from bottom to top and right to left.
fill( pt_cell_V.begin(), pt_cell_V.end(), 0 );
for( col = Ncols - 1; col >= 0; col-- )
for( col = RoutingMatrix.m_Ncols - 1; col >= 0; col-- )
{
old_cell_H = 0;
for( row = Nrows - 1; row >= 0; row-- )
for( row = RoutingMatrix.m_Nrows - 1; row >= 0; row-- )
{
current_cell = GetCell( row, col, BOTTOM ) & NO_CELL_ZONE;
current_cell = RoutingMatrix.GetCell( row, col, BOTTOM ) & NO_CELL_ZONE;
if( current_cell == 0 ) /* a free cell is found */
{
if( (old_cell_H & CELL_is_ZONE) || (pt_cell_V[row] & CELL_is_ZONE) )
{
OrCell( row, col, BOTTOM, CELL_is_ZONE );
RoutingMatrix.OrCell( row, col, BOTTOM, CELL_is_ZONE );
current_cell = CELL_is_ZONE;
nbpoints++;
}
......@@ -1259,19 +1260,19 @@ int propagate()
// Search from bottom to top and left to right.
fill( pt_cell_V.begin(), pt_cell_V.end(), 0 );
for( col = 0; col < Ncols; col++ )
for( col = 0; col < RoutingMatrix.m_Ncols; col++ )
{
old_cell_H = 0;
for( row = Nrows - 1; row >= 0; row-- )
for( row = RoutingMatrix.m_Nrows - 1; row >= 0; row-- )
{
current_cell = GetCell( row, col, BOTTOM ) & NO_CELL_ZONE;
current_cell = RoutingMatrix.GetCell( row, col, BOTTOM ) & NO_CELL_ZONE;
if( current_cell == 0 ) /* a free cell is found */
{
if( (old_cell_H & CELL_is_ZONE) || (pt_cell_V[row] & CELL_is_ZONE) )
{
OrCell( row, col, BOTTOM, CELL_is_ZONE );
RoutingMatrix.OrCell( row, col, BOTTOM, CELL_is_ZONE );
current_cell = CELL_is_ZONE;
nbpoints++;
}
......
......@@ -48,9 +48,6 @@
int Nb_Sides; /* Number of layer for autorouting (0 or 1) */
int Nrows = ILLEGAL;
int Ncols = ILLEGAL;
int Ntotal;
int OpenNodes; /* total number of nodes opened */
int ClosNodes; /* total number of nodes closed */
int MoveNodes; /* total number of nodes moved */
......@@ -194,7 +191,7 @@ void PCB_EDIT_FRAME::Autoroute( wxDC* DC, int mode )
PlaceCells( GetBoard(), -1, FORCE_PADS );
/* Construction of the track list for router. */
Build_Work( GetBoard() );
RoutingMatrix.m_RouteCount = Build_Work( GetBoard() );
// DisplayRoutingMatrix( m_canvas, DC );
......@@ -234,7 +231,7 @@ void DisplayRoutingMatrix( EDA_DRAW_PANEL* panel, wxDC* DC )
{
int dcell0, dcell1 = 0, color;
int maxi = 600 / Ncols;
int maxi = 600 / RoutingMatrix.m_Ncols;
maxi = ( maxi * 3 ) / 4;
if( !maxi )
......@@ -242,12 +239,12 @@ void DisplayRoutingMatrix( EDA_DRAW_PANEL* panel, wxDC* DC )
GRSetDrawMode( DC, GR_COPY );
for( int col = 0; col < Ncols; col++ )
for( int col = 0; col < RoutingMatrix.m_Ncols; col++ )
{
for( int row = 0; row < Nrows; row++ )
for( int row = 0; row < RoutingMatrix.m_Nrows; row++ )
{
color = 0;
dcell0 = GetCell( row, col, BOTTOM );
dcell0 = RoutingMatrix.GetCell( row, col, BOTTOM );
if( dcell0 & HOLE )
color = GREEN;
......
......@@ -68,11 +68,6 @@ extern int Nb_Sides; /* Number of layers for autorouting (0 or 1) */
#define FORCE_PADS 1 /* Force placement of pads for any Netcode */
/* board dimensions */
extern int Nrows;
extern int Ncols;
extern int Ntotal;
/* search statistics */
extern int OpenNodes; /* total number of nodes opened */
extern int ClosNodes; /* total number of nodes closed */
......@@ -88,26 +83,35 @@ typedef char DIR_CELL;
/**
* class MATRIX_ROUTING_HEAD
* handle the matrix routing that describes the actual board
*/
class MATRIX_ROUTING_HEAD /* header of blocks of MATRIX_CELL */
class MATRIX_ROUTING_HEAD
{
public:
MATRIX_CELL* m_BoardSide[MAX_SIDES_COUNT]; /* ptr to block of memory: 2-sided board */
DIST_CELL* m_DistSide[MAX_SIDES_COUNT]; /* ptr to block of memory: path distance to
* cells */
DIR_CELL* m_DirSide[MAX_SIDES_COUNT]; /* header of blocks of chars:pointers back to
* source */
MATRIX_CELL* m_BoardSide[MAX_SIDES_COUNT]; // the image map of 2 board sides
DIST_CELL* m_DistSide[MAX_SIDES_COUNT]; // the image map of 2 board sides: distance to
// cells
DIR_CELL* m_DirSide[MAX_SIDES_COUNT]; // the image map of 2 board sides: pointers back to
// source
bool m_InitMatrixDone;
int m_Layers;
int m_Layers; // Layer count (1 2 )
int m_GridRouting; // Size of grid for autoplace/autoroute
EDA_RECT m_BrdBox; // Actual board bounding box
int m_Nrows, m_Ncols;
int m_MemSize;
int m_Nrows, m_Ncols; // Matrix size
int m_MemSize; // Memory requirement, just for statistics
int m_RouteCount; // Number of routes
private:
void (MATRIX_ROUTING_HEAD::* m_opWriteCell)( int aRow, int aCol, int aSide, MATRIX_CELL aCell); // a pointeur to the current selected cell op
public:
MATRIX_ROUTING_HEAD();
~MATRIX_ROUTING_HEAD();
void WriteCell( int aRow, int aCol, int aSide, MATRIX_CELL aCell)
{
(*this.*m_opWriteCell)( aRow, aCol, aSide, aCell );
}
/**
* Function ComputeMatrixSize
* calculates the number of rows and columns of dimensions of \a aPcb for routing and
......@@ -127,6 +131,21 @@ public:
int InitRoutingMatrix();
void UnInitRoutingMatrix();
// Initialize WriteCell to make the aLogicOp
void SetCellOperation( int aLogicOp );
// functions to read/write one cell ( point on grid routing matrix:
MATRIX_CELL GetCell( int aRow, int aCol, int aSide);
void SetCell( int aRow, int aCol, int aSide, MATRIX_CELL aCell);
void OrCell( int aRow, int aCol, int aSide, MATRIX_CELL aCell);
void XorCell( int aRow, int aCol, int aSide, MATRIX_CELL aCell);
void AndCell( int aRow, int aCol, int aSide, MATRIX_CELL aCell);
void AddCell( int aRow, int aCol, int aSide, MATRIX_CELL aCell);
DIST_CELL GetDist( int aRow, int aCol, int aSide );
void SetDist( int aRow, int aCol, int aSide, DIST_CELL );
int GetDir( int aRow, int aCol, int aSide );
void SetDir( int aRow, int aCol, int aSide, int aDir);
};
extern MATRIX_ROUTING_HEAD RoutingMatrix; /* 2-sided board */
......@@ -195,20 +214,9 @@ void SortWork(); /* order the work items; shortest first */
int GetApxDist( int r1, int c1, int r2, int c2 );
int CalcDist(int x,int y,int z ,int side );
/* BOARD.CPP */
/* routing_matrix.cpp */
int Build_Work( BOARD * Pcb );
void PlaceCells( BOARD * Pcb, int net_code, int flag = 0 );
MATRIX_CELL GetCell( int aRow, int aCol, int aSide);
void SetCell( int aRow, int aCol, int aSide, MATRIX_CELL aCell);
void OrCell( int aRow, int aCol, int aSide, MATRIX_CELL aCell);
void XorCell( int aRow, int aCol, int aSide, MATRIX_CELL aCell);
void AndCell( int aRow, int aCol, int aSide, MATRIX_CELL aCell);
void AddCell( int aRow, int aCol, int aSide, MATRIX_CELL aCell);
DIST_CELL GetDist( int aRow, int aCol, int aSide );
void SetDist( int aRow, int aCol, int aSide, DIST_CELL );
int GetDir( int aRow, int aCol, int aSide );
void SetDir( int aRow, int aCol, int aSide, int aDir);
#endif // AUTOROUT_H
......@@ -71,17 +71,17 @@ static void TraceCircle( int ux0, int uy0, int ux1, int uy1, int lg, int layer,
{ \
if( layer < 0 ) \
{ \
WriteCell( dy, dx, BOTTOM, color ); \
RoutingMatrix.WriteCell( dy, dx, BOTTOM, color ); \
if( Nb_Sides ) \
WriteCell( dy, dx, TOP, color ); \
RoutingMatrix.WriteCell( dy, dx, TOP, color ); \
} \
else \
{ \
if( layer == Route_Layer_BOTTOM ) \
WriteCell( dy, dx, BOTTOM, color ); \
RoutingMatrix.WriteCell( dy, dx, BOTTOM, color ); \
if( Nb_Sides ) \
if( layer == Route_Layer_TOP ) \
WriteCell( dy, dx, TOP, color ); \
RoutingMatrix.WriteCell( dy, dx, TOP, color ); \
} \
}
......@@ -151,8 +151,6 @@ void TraceFilledCircle( BOARD* aPcb,
int row_max, col_max, row_min, col_min;
int trace = 0;
double fdistmin, fdistx, fdisty;
void (* WriteCell)( int, int, int, MATRIX_CELL );
int tstwrite = 0;
int distmin;
......@@ -166,29 +164,7 @@ void TraceFilledCircle( BOARD* aPcb,
if( trace == 0 )
return;
switch( op_logic )
{
default:
case WRITE_CELL:
WriteCell = SetCell;
break;
case WRITE_OR_CELL:
WriteCell = OrCell;
break;
case WRITE_XOR_CELL:
WriteCell = XorCell;
break;
case WRITE_AND_CELL:
WriteCell = AndCell;
break;
case WRITE_ADD_CELL:
WriteCell = AddCell;
break;
}
RoutingMatrix.SetCellOperation( op_logic );
cx -= aPcb->GetBoundingBox().GetX();
cy -= aPcb->GetBoundingBox().GetY();
......@@ -210,14 +186,14 @@ void TraceFilledCircle( BOARD* aPcb,
if( row_min < 0 )
row_min = 0;
if( row_max >= (Nrows - 1) )
row_max = Nrows - 1;
if( row_max >= (RoutingMatrix.m_Nrows - 1) )
row_max = RoutingMatrix.m_Nrows - 1;
if( col_min < 0 )
col_min = 0;
if( col_max >= (Ncols - 1) )
col_max = Ncols - 1;
if( col_max >= (RoutingMatrix.m_Ncols - 1) )
col_max = RoutingMatrix.m_Ncols - 1;
// Calculate coordinate limits of cell belonging to the rectangle.
if( row_min > row_max )
......@@ -242,10 +218,10 @@ void TraceFilledCircle( BOARD* aPcb,
continue;
if( trace & 1 )
WriteCell( row, col, BOTTOM, color );
RoutingMatrix.WriteCell( row, col, BOTTOM, color );
if( trace & 2 )
WriteCell( row, col, TOP, color );
RoutingMatrix.WriteCell( row, col, TOP, color );
tstwrite = 1;
}
......@@ -274,10 +250,10 @@ void TraceFilledCircle( BOARD* aPcb,
continue;
if( trace & 1 )
WriteCell( row, col, BOTTOM, color );
RoutingMatrix.WriteCell( row, col, BOTTOM, color );
if( trace & 2 )
WriteCell( row, col, TOP, color );
RoutingMatrix.WriteCell( row, col, TOP, color );
}
}
}
......@@ -359,26 +335,7 @@ void TracePcbLine( int x0, int y0, int x1, int y1, int layer, int color, int op_
int dx, dy, lim;
int cumul, inc, il, delta;
void (* WriteCell)( int, int, int, MATRIX_CELL );
switch( op_logic )
{
default:
case WRITE_CELL:
WriteCell = SetCell; break;
case WRITE_OR_CELL:
WriteCell = OrCell; break;
case WRITE_XOR_CELL:
WriteCell = XorCell; break;
case WRITE_AND_CELL:
WriteCell = AndCell; break;
case WRITE_ADD_CELL:
WriteCell = AddCell; break;
}
RoutingMatrix.SetCellOperation( op_logic );
if( x0 == x1 ) // Vertical.
{
......@@ -390,14 +347,14 @@ void TracePcbLine( int x0, int y0, int x1, int y1, int layer, int color, int op_
dx = x0 / RoutingMatrix.m_GridRouting;
// Clipping limits of board.
if( ( dx < 0 ) || ( dx >= Ncols ) )
if( ( dx < 0 ) || ( dx >= RoutingMatrix.m_Ncols ) )
return;
if( dy < 0 )
dy = 0;
if( lim >= Nrows )
lim = Nrows - 1;
if( lim >= RoutingMatrix.m_Nrows )
lim = RoutingMatrix.m_Nrows - 1;
for( ; dy <= lim; dy++ )
{
......@@ -417,14 +374,14 @@ void TracePcbLine( int x0, int y0, int x1, int y1, int layer, int color, int op_
dy = y0 / RoutingMatrix.m_GridRouting;
// Clipping limits of board.
if( ( dy < 0 ) || ( dy >= Nrows ) )
if( ( dy < 0 ) || ( dy >= RoutingMatrix.m_Nrows ) )
return;
if( dx < 0 )
dx = 0;
if( lim >= Ncols )
lim = Ncols - 1;
if( lim >= RoutingMatrix.m_Ncols )
lim = RoutingMatrix.m_Ncols - 1;
for( ; dx <= lim; dx++ )
{
......@@ -455,7 +412,7 @@ void TracePcbLine( int x0, int y0, int x1, int y1, int layer, int color, int op_
for( ; dx <= lim; )
{
if( ( dx >= 0 ) && ( dy >= 0 ) && ( dx < Ncols ) && ( dy < Nrows ) )
if( ( dx >= 0 ) && ( dy >= 0 ) && ( dx < RoutingMatrix.m_Ncols ) && ( dy < RoutingMatrix.m_Nrows ) )
{
OP_CELL( layer, dy, dx );
}
......@@ -492,7 +449,7 @@ void TracePcbLine( int x0, int y0, int x1, int y1, int layer, int color, int op_
for( ; dy <= lim; )
{
if( ( dx >= 0 ) && ( dy >= 0 ) && ( dx < Ncols ) && ( dy < Nrows ) )
if( ( dx >= 0 ) && ( dy >= 0 ) && ( dx < RoutingMatrix.m_Ncols ) && ( dy < RoutingMatrix.m_Nrows ) )
{
OP_CELL( layer, dy, dx );
}
......@@ -517,8 +474,6 @@ void TraceFilledRectangle( BOARD* aPcb, int ux0, int uy0, int ux1, int uy1,
int row_min, row_max, col_min, col_max;
int trace = 0;
void (* WriteCell)( int, int, int, MATRIX_CELL );
if( ( aLayerMask & GetLayerMask( Route_Layer_BOTTOM ) ) )
trace = 1; // Trace on BOTTOM
......@@ -528,29 +483,7 @@ void TraceFilledRectangle( BOARD* aPcb, int ux0, int uy0, int ux1, int uy1,
if( trace == 0 )
return;
switch( op_logic )
{
default:
case WRITE_CELL:
WriteCell = SetCell;
break;
case WRITE_OR_CELL:
WriteCell = OrCell;
break;
case WRITE_XOR_CELL:
WriteCell = XorCell;
break;
case WRITE_AND_CELL:
WriteCell = AndCell;
break;
case WRITE_ADD_CELL:
WriteCell = AddCell;
break;
}
RoutingMatrix.SetCellOperation( op_logic );
ux0 -= aPcb->GetBoundingBox().GetX();
uy0 -= aPcb->GetBoundingBox().GetY();
......@@ -573,24 +506,24 @@ void TraceFilledRectangle( BOARD* aPcb, int ux0, int uy0, int ux1, int uy1,
if( row_min < 0 )
row_min = 0;
if( row_max >= ( Nrows - 1 ) )
row_max = Nrows - 1;
if( row_max >= ( RoutingMatrix.m_Nrows - 1 ) )
row_max = RoutingMatrix.m_Nrows - 1;
if( col_min < 0 )
col_min = 0;
if( col_max >= ( Ncols - 1 ) )
col_max = Ncols - 1;
if( col_max >= ( RoutingMatrix.m_Ncols - 1 ) )
col_max = RoutingMatrix.m_Ncols - 1;
for( row = row_min; row <= row_max; row++ )
{
for( col = col_min; col <= col_max; col++ )
{
if( trace & 1 )
WriteCell( row, col, BOTTOM, color );
RoutingMatrix.WriteCell( row, col, BOTTOM, color );
if( trace & 2 )
WriteCell( row, col, TOP, color );
RoutingMatrix.WriteCell( row, col, TOP, color );
}
}
}
......@@ -606,8 +539,6 @@ void TraceFilledRectangle( BOARD* aPcb, int ux0, int uy0, int ux1, int uy1,
int rotrow, rotcol;
int trace = 0;
void (* WriteCell)( int, int, int, MATRIX_CELL );
if( aLayerMask & GetLayerMask( Route_Layer_BOTTOM ) )
trace = 1; // Trace on BOTTOM
......@@ -620,29 +551,7 @@ void TraceFilledRectangle( BOARD* aPcb, int ux0, int uy0, int ux1, int uy1,
if( trace == 0 )
return;
switch( op_logic )
{
default:
case WRITE_CELL:
WriteCell = SetCell;
break;
case WRITE_OR_CELL:
WriteCell = OrCell;
break;
case WRITE_XOR_CELL:
WriteCell = XorCell;
break;
case WRITE_AND_CELL:
WriteCell = AndCell;
break;
case WRITE_ADD_CELL:
WriteCell = AddCell;
break;
}
RoutingMatrix.SetCellOperation( op_logic );
ux0 -= aPcb->GetBoundingBox().GetX();
uy0 -= aPcb->GetBoundingBox().GetY();
......@@ -670,14 +579,14 @@ void TraceFilledRectangle( BOARD* aPcb, int ux0, int uy0, int ux1, int uy1,
if( row_min < 0 )
row_min = 0;
if( row_max >= ( Nrows - 1 ) )
row_max = Nrows - 1;
if( row_max >= ( RoutingMatrix.m_Nrows - 1 ) )
row_max = RoutingMatrix.m_Nrows - 1;
if( col_min < 0 )
col_min = 0;
if( col_max >= ( Ncols - 1 ) )
col_max = Ncols - 1;
if( col_max >= ( RoutingMatrix.m_Ncols - 1 ) )
col_max = RoutingMatrix.m_Ncols - 1;
for( row = row_min; row <= row_max; row++ )
{
......@@ -700,10 +609,10 @@ void TraceFilledRectangle( BOARD* aPcb, int ux0, int uy0, int ux1, int uy1,
continue;
if( trace & 1 )
WriteCell( row, col, BOTTOM, color );
RoutingMatrix.WriteCell( row, col, BOTTOM, color );
if( trace & 2 )
WriteCell( row, col, TOP, color );
RoutingMatrix.WriteCell( row, col, TOP, color );
}
}
}
......@@ -721,33 +630,10 @@ void DrawSegmentQcq( int ux0, int uy0, int ux1, int uy1, int lg, int layer,
int row_max, col_max, row_min, col_min;
int demi_pas;
void (* WriteCell)( int, int, int, MATRIX_CELL );
int angle;
int cx, cy, dx, dy;
switch( op_logic )
{
default:
case WRITE_CELL:
WriteCell = SetCell;
break;
case WRITE_OR_CELL:
WriteCell = OrCell;
break;
case WRITE_XOR_CELL:
WriteCell = XorCell;
break;
case WRITE_AND_CELL:
WriteCell = AndCell;
break;
case WRITE_ADD_CELL:
WriteCell = AddCell;
break;
}
RoutingMatrix.SetCellOperation( op_logic );
// Make coordinate ux1 tj > ux0 to simplify calculations
if( ux1 < ux0 )
......@@ -771,8 +657,8 @@ void DrawSegmentQcq( int ux0, int uy0, int ux1, int uy1, int lg, int layer,
col_max = ( ux1 + lg + demi_pas ) / RoutingMatrix.m_GridRouting;
if( col_max > ( Ncols - 1 ) )
col_max = Ncols - 1;
if( col_max > ( RoutingMatrix.m_Ncols - 1 ) )
col_max = RoutingMatrix.m_Ncols - 1;
if( inc > 0 )
{
......@@ -788,14 +674,14 @@ void DrawSegmentQcq( int ux0, int uy0, int ux1, int uy1, int lg, int layer,
if( row_min < 0 )
row_min = 0;
if( row_min > ( Nrows - 1 ) )
row_min = Nrows - 1;
if( row_min > ( RoutingMatrix.m_Nrows - 1 ) )
row_min = RoutingMatrix.m_Nrows - 1;
if( row_max < 0 )
row_max = 0;
if( row_max > ( Nrows - 1 ) )
row_max = Nrows - 1;
if( row_max > ( RoutingMatrix.m_Nrows - 1 ) )
row_max = RoutingMatrix.m_Nrows - 1;
dx = ux1 - ux0;
dy = uy1 - uy0;
......
......@@ -69,14 +69,12 @@ bool MATRIX_ROUTING_HEAD::ComputeMatrixSize( BOARD* aPcb, bool aUseBoardEdgesOnl
aPcb->SetBoundingBox( m_BrdBox );
m_Nrows = Nrows = m_BrdBox.GetHeight() / m_GridRouting;
m_Ncols = Ncols = m_BrdBox.GetWidth() / m_GridRouting;
m_Nrows = m_BrdBox.GetHeight() / m_GridRouting;
m_Ncols = m_BrdBox.GetWidth() / m_GridRouting;
/* get a small margin for memory allocation: */
Ncols += 1;
m_Nrows = Nrows;
Nrows += 1;
m_Ncols = Ncols;
// gives a small margin
m_Ncols += 1;
m_Nrows += 1;
return true;
}
......@@ -103,15 +101,13 @@ int MATRIX_ROUTING_HEAD::InitRoutingMatrix()
{
int ii, kk;
if( Nrows <= 0 || Ncols <= 0 )
if( m_Nrows <= 0 || m_Ncols <= 0 )
return 0;
m_Nrows = Nrows;
m_Ncols = Ncols;
m_InitMatrixDone = true; // we have been called
// give a small margin for memory allocation:
ii = (Nrows + 1) * (Ncols + 1);
ii = (RoutingMatrix.m_Nrows + 1) * (RoutingMatrix.m_Ncols + 1);
for( kk = 0; kk < m_Layers; kk++ )
{
......@@ -354,7 +350,7 @@ int Build_Work( BOARD* Pcb )
EDA_RECT bbbox = Pcb->GetBoundingBox();
InitWork(); /* clear work list */
Ntotal = 0;
int cellCount = 0;
for( unsigned ii = 0; ii < Pcb->GetRatsnestsCount(); ii++ )
{
......@@ -379,7 +375,7 @@ int Build_Work( BOARD* Pcb )
r1 = ( pt_pad->GetPosition().y - bbbox.GetY() + demi_pas ) / RoutingMatrix.m_GridRouting;
if( r1 < 0 || r1 >= Nrows )
if( r1 < 0 || r1 >= RoutingMatrix.m_Nrows )
{
msg.Printf( wxT( "error : row = %d ( padY %d pcbY %d) " ), r1,
pt_pad->GetPosition().y, bbbox.GetY() );
......@@ -389,7 +385,7 @@ int Build_Work( BOARD* Pcb )
c1 = ( pt_pad->GetPosition().x - bbbox.GetX() + demi_pas ) / RoutingMatrix.m_GridRouting;
if( c1 < 0 || c1 >= Ncols )
if( c1 < 0 || c1 >= RoutingMatrix.m_Ncols )
{
msg.Printf( wxT( "error : col = %d ( padX %d pcbX %d) " ), c1,
pt_pad->GetPosition().x, bbbox.GetX() );
......@@ -402,7 +398,7 @@ int Build_Work( BOARD* Pcb )
r2 = ( pt_pad->GetPosition().y - bbbox.GetY()
+ demi_pas ) / RoutingMatrix.m_GridRouting;
if( r2 < 0 || r2 >= Nrows )
if( r2 < 0 || r2 >= RoutingMatrix.m_Nrows )
{
msg.Printf( wxT( "error : row = %d ( padY %d pcbY %d) " ), r2,
pt_pad->GetPosition().y, bbbox.GetY() );
......@@ -412,7 +408,7 @@ int Build_Work( BOARD* Pcb )
c2 = ( pt_pad->GetPosition().x - bbbox.GetX() + demi_pas ) / RoutingMatrix.m_GridRouting;
if( c2 < 0 || c2 >= Ncols )
if( c2 < 0 || c2 >= RoutingMatrix.m_Ncols )
{
msg.Printf( wxT( "error : col = %d ( padX %d pcbX %d) " ), c2,
pt_pad->GetPosition().x, bbbox.GetX() );
......@@ -421,115 +417,143 @@ int Build_Work( BOARD* Pcb )
}
SetWork( r1, c1, current_net_code, r2, c2, pt_ch, 0 );
Ntotal++;
cellCount++;
}
SortWork();
return Ntotal;
return cellCount;
}
// Initialize WriteCell to make the aLogicOp
void MATRIX_ROUTING_HEAD::SetCellOperation( int aLogicOp )
{
switch( aLogicOp )
{
default:
case WRITE_CELL:
m_opWriteCell = &MATRIX_ROUTING_HEAD::SetCell;
break;
case WRITE_OR_CELL:
m_opWriteCell = &MATRIX_ROUTING_HEAD::OrCell;
break;
case WRITE_XOR_CELL:
m_opWriteCell = &MATRIX_ROUTING_HEAD::XorCell;
break;
case WRITE_AND_CELL:
m_opWriteCell = &MATRIX_ROUTING_HEAD::AndCell;
break;
case WRITE_ADD_CELL:
m_opWriteCell = &MATRIX_ROUTING_HEAD::AddCell;
break;
}
}
/* return the value stored in a cell
*/
MATRIX_CELL GetCell( int aRow, int aCol, int aSide )
MATRIX_CELL MATRIX_ROUTING_HEAD::GetCell( int aRow, int aCol, int aSide )
{
MATRIX_CELL* p;
p = RoutingMatrix.m_BoardSide[aSide];
return p[aRow * Ncols + aCol];
return p[aRow * m_Ncols + aCol];
}
/* basic cell operation : WRITE operation
*/
void SetCell( int aRow, int aCol, int aSide, MATRIX_CELL x )
void MATRIX_ROUTING_HEAD::SetCell( int aRow, int aCol, int aSide, MATRIX_CELL x )
{
MATRIX_CELL* p;
p = RoutingMatrix.m_BoardSide[aSide];
p[aRow * Ncols + aCol] = x;
p[aRow * m_Ncols + aCol] = x;
}
/* basic cell operation : OR operation
*/
void OrCell( int aRow, int aCol, int aSide, MATRIX_CELL x )
void MATRIX_ROUTING_HEAD::OrCell( int aRow, int aCol, int aSide, MATRIX_CELL x )
{
MATRIX_CELL* p;
p = RoutingMatrix.m_BoardSide[aSide];
p[aRow * Ncols + aCol] |= x;
p[aRow * m_Ncols + aCol] |= x;
}
/* basic cell operation : XOR operation
*/
void XorCell( int aRow, int aCol, int aSide, MATRIX_CELL x )
void MATRIX_ROUTING_HEAD::XorCell( int aRow, int aCol, int aSide, MATRIX_CELL x )
{
MATRIX_CELL* p;
p = RoutingMatrix.m_BoardSide[aSide];
p[aRow * Ncols + aCol] ^= x;
p[aRow * m_Ncols + aCol] ^= x;
}
/* basic cell operation : AND operation
*/
void AndCell( int aRow, int aCol, int aSide, MATRIX_CELL x )
void MATRIX_ROUTING_HEAD::AndCell( int aRow, int aCol, int aSide, MATRIX_CELL x )
{
MATRIX_CELL* p;
p = RoutingMatrix.m_BoardSide[aSide];
p[aRow * Ncols + aCol] &= x;
p[aRow * m_Ncols + aCol] &= x;
}
/* basic cell operation : ADD operation
*/
void AddCell( int aRow, int aCol, int aSide, MATRIX_CELL x )
void MATRIX_ROUTING_HEAD::AddCell( int aRow, int aCol, int aSide, MATRIX_CELL x )
{
MATRIX_CELL* p;
p = RoutingMatrix.m_BoardSide[aSide];
p[aRow * Ncols + aCol] += x;
p[aRow * m_Ncols + aCol] += x;
}
/* fetch distance cell */
DIST_CELL GetDist( int aRow, int aCol, int aSide ) /* fetch distance cell */
DIST_CELL MATRIX_ROUTING_HEAD::GetDist( int aRow, int aCol, int aSide ) /* fetch distance cell */
{
DIST_CELL* p;
p = RoutingMatrix.m_DistSide[aSide];
return p[aRow * Ncols + aCol];
return p[aRow * m_Ncols + aCol];
}
/* store distance cell */
void SetDist( int aRow, int aCol, int aSide, DIST_CELL x )
void MATRIX_ROUTING_HEAD::SetDist( int aRow, int aCol, int aSide, DIST_CELL x )
{
DIST_CELL* p;
p = RoutingMatrix.m_DistSide[aSide];
p[aRow * Ncols + aCol] = x;
p[aRow * m_Ncols + aCol] = x;
}
/* fetch direction cell */
int GetDir( int aRow, int aCol, int aSide )
int MATRIX_ROUTING_HEAD::GetDir( int aRow, int aCol, int aSide )
{
DIR_CELL* p;
p = RoutingMatrix.m_DirSide[aSide];
return (int) (p[aRow * Ncols + aCol]);
return (int) (p[aRow * m_Ncols + aCol]);
}
/* store direction cell */
void SetDir( int aRow, int aCol, int aSide, int x )
void MATRIX_ROUTING_HEAD::SetDir( int aRow, int aCol, int aSide, int x )
{
DIR_CELL* p;
p = RoutingMatrix.m_DirSide[aSide];
p[aRow * Ncols + aCol] = (char) x;
p[aRow * m_Ncols + aCol] = (char) x;
}
......@@ -82,7 +82,6 @@ static int segm_oX, segm_oY;
static int segm_fX, segm_fY; /* Origin and position of the current
* trace segment. */
static RATSNEST_ITEM* pt_cur_ch;
static int Ncurrent; /* measures of progress */
static int s_Clearance; // Clearance value used in autorouter
static PICKED_ITEMS_LIST s_ItemsListPicker;
......@@ -272,13 +271,12 @@ int PCB_EDIT_FRAME::Solve( wxDC* DC, int two_sides )
NETINFO_ITEM* net;
bool stop = false;
wxString msg;
int routedCount = 0; // routed ratsnest count
m_canvas->SetAbortRequest( false );
s_Clearance = GetBoard()->m_NetClasses.GetDefault()->GetClearance();
Ncurrent = 0;
// Prepare the undo command info
s_ItemsListPicker.ClearListAndDeleteItems(); // Should not be necessary, but...
......@@ -310,14 +308,14 @@ int PCB_EDIT_FRAME::Solve( wxDC* DC, int two_sides )
EraseMsgBox();
Ncurrent++;
routedCount++;
net = GetBoard()->FindNet( current_net_code );
if( net )
{
msg.Printf( wxT( "[%8.8s]" ), GetChars( net->GetNetname() ) );
AppendMsgPanel( wxT( "Net route" ), msg, BROWN );
msg.Printf( wxT( "%d / %d" ), Ncurrent, Ntotal );
msg.Printf( wxT( "%d / %d" ), routedCount, RoutingMatrix.m_RouteCount );
AppendMsgPanel( wxT( "Activity" ), msg, BROWN );
}
......@@ -328,25 +326,15 @@ int PCB_EDIT_FRAME::Solve( wxDC* DC, int two_sides )
segm_fY = GetBoard()->GetBoundingBox().GetY() + (RoutingMatrix.m_GridRouting * row_target);
/* Draw segment. */
GRLine( m_canvas->GetClipBox(),
DC,
segm_oX,
segm_oY,
segm_fX,
segm_fY,
0,
WHITE | GR_XOR );
GRLine( m_canvas->GetClipBox(), DC,
segm_oX, segm_oY, segm_fX, segm_fY,
0, WHITE | GR_XOR );
pt_cur_ch->m_PadStart->Draw( m_canvas, DC, GR_OR | GR_HIGHLIGHT );
pt_cur_ch->m_PadEnd->Draw( m_canvas, DC, GR_OR | GR_HIGHLIGHT );
success = Autoroute_One_Track( this,
DC,
two_sides,
row_source,
col_source,
row_target,
col_target,
pt_cur_ch );
success = Autoroute_One_Track( this, DC,
two_sides, row_source, col_source,
row_target, col_target, pt_cur_ch );
switch( success )
{
......@@ -439,7 +427,7 @@ static int Autoroute_One_Track( PCB_EDIT_FRAME* pcbframe,
marge = s_Clearance + ( pcbframe->GetBoard()->GetCurrentTrackWidth() / 2 );
/* clear direction flags */
i = Nrows * Ncols * sizeof(DIR_CELL);
i = RoutingMatrix.m_Nrows * RoutingMatrix.m_Ncols * sizeof(DIR_CELL);
memset( RoutingMatrix.m_DirSide[TOP], FROM_NOWHERE, i );
memset( RoutingMatrix.m_DirSide[BOTTOM], FROM_NOWHERE, i );
......@@ -603,7 +591,7 @@ static int Autoroute_One_Track( PCB_EDIT_FRAME* pcbframe,
for( ; r != ILLEGAL; GetQueue( &r, &c, &side, &d, &apx_dist ) )
{
curcell = GetCell( r, c, side );
curcell = RoutingMatrix.GetCell( r, c, side );
if( curcell & CURRENT_PAD )
curcell &= ~HOLE;
......@@ -675,13 +663,14 @@ static int Autoroute_One_Track( PCB_EDIT_FRAME* pcbframe,
nc = c + delta[i][1];
/* off the edge? */
if( nr < 0 || nr >= Nrows || nc < 0 || nc >= Ncols )
if( nr < 0 || nr >= RoutingMatrix.m_Nrows ||
nc < 0 || nc >= RoutingMatrix.m_Ncols )
continue; /* off the edge */
if( _self == 5 && selfok2[i].present )
continue;
newcell = GetCell( nr, nc, side );
newcell = RoutingMatrix.GetCell( nr, nc, side );
if( newcell & CURRENT_PAD )
newcell &= ~HOLE;
......@@ -702,7 +691,7 @@ static int Autoroute_One_Track( PCB_EDIT_FRAME* pcbframe,
if( delta[i][0] && delta[i][1] )
{
/* check first buddy */
buddy = GetCell( r + blocking[i].r1, c + blocking[i].c1, side );
buddy = RoutingMatrix.GetCell( r + blocking[i].r1, c + blocking[i].c1, side );
if( buddy & CURRENT_PAD )
buddy &= ~HOLE;
......@@ -712,7 +701,7 @@ static int Autoroute_One_Track( PCB_EDIT_FRAME* pcbframe,
// if (buddy & (blocking[i].b1)) continue;
/* check second buddy */
buddy = GetCell( r + blocking[i].r2, c + blocking[i].c2, side );
buddy = RoutingMatrix.GetCell( r + blocking[i].r2, c + blocking[i].c2, side );
if( buddy & CURRENT_PAD )
buddy &= ~HOLE;
......@@ -723,17 +712,17 @@ static int Autoroute_One_Track( PCB_EDIT_FRAME* pcbframe,
// if (buddy & (blocking[i].b2)) continue;
}
olddir = GetDir( r, c, side );
olddir = RoutingMatrix.GetDir( r, c, side );
newdist = d + CalcDist( ndir[i], olddir,
( olddir == FROM_OTHERSIDE ) ?
GetDir( r, c, 1 - side ) : 0, side );
RoutingMatrix.GetDir( r, c, 1 - side ) : 0, side );
/* if (a) not visited yet, or (b) we have */
/* found a better path, add it to queue */
if( !GetDir( nr, nc, side ) )
if( !RoutingMatrix.GetDir( nr, nc, side ) )
{
SetDir( nr, nc, side, ndir[i] );
SetDist( nr, nc, side, newdist );
RoutingMatrix.SetDir( nr, nc, side, ndir[i] );
RoutingMatrix.SetDist( nr, nc, side, newdist );
if( SetQueue( nr, nc, side, newdist,
GetApxDist( nr, nc, row_target, col_target ),
......@@ -742,10 +731,10 @@ static int Autoroute_One_Track( PCB_EDIT_FRAME* pcbframe,
return ERR_MEMORY;
}
}
else if( newdist < GetDist( nr, nc, side ) )
else if( newdist < RoutingMatrix.GetDist( nr, nc, side ) )
{
SetDir( nr, nc, side, ndir[i] );
SetDist( nr, nc, side, newdist );
RoutingMatrix.SetDir( nr, nc, side, ndir[i] );
RoutingMatrix.SetDist( nr, nc, side, newdist );
ReSetQueue( nr, nc, side, newdist,
GetApxDist( nr, nc, row_target, col_target ),
row_target, col_target );
......@@ -755,7 +744,7 @@ static int Autoroute_One_Track( PCB_EDIT_FRAME* pcbframe,
/** Test the other layer. **/
if( two_sides )
{
olddir = GetDir( r, c, side );
olddir = RoutingMatrix.GetDir( r, c, side );
if( olddir == FROM_OTHERSIDE )
continue; /* useless move, so don't bother */
......@@ -764,7 +753,7 @@ static int Autoroute_One_Track( PCB_EDIT_FRAME* pcbframe,
continue;
/* check for holes or traces on other side */
if( ( newcell = GetCell( r, c, 1 - side ) ) != 0 )
if( ( newcell = RoutingMatrix.GetCell( r, c, 1 - side ) ) != 0 )
continue;
/* check for nearby holes or traces on both sides */
......@@ -772,16 +761,17 @@ static int Autoroute_One_Track( PCB_EDIT_FRAME* pcbframe,
{
nr = r + delta[i][0]; nc = c + delta[i][1];
if( nr < 0 || nr >= Nrows || nc < 0 || nc >= Ncols )
if( nr < 0 || nr >= RoutingMatrix.m_Nrows ||
nc < 0 || nc >= RoutingMatrix.m_Ncols )
continue; /* off the edge !! */
if( GetCell( nr, nc, side ) /* & blocking2[i]*/ )
if( RoutingMatrix.GetCell( nr, nc, side ) /* & blocking2[i]*/ )
{
skip = 1; /* can't drill via here */
break;
}
if( GetCell( nr, nc, 1 - side ) /* & blocking2[i]*/ )
if( RoutingMatrix.GetCell( nr, nc, 1 - side ) /* & blocking2[i]*/ )
{
skip = 1; /* can't drill via here */
break;
......@@ -796,22 +786,21 @@ static int Autoroute_One_Track( PCB_EDIT_FRAME* pcbframe,
/* if (a) not visited yet,
* or (b) we have found a better path,
* add it to queue */
if( !GetDir( r, c, 1 - side ) )
if( !RoutingMatrix.GetDir( r, c, 1 - side ) )
{
SetDir( r, c, 1 - side, FROM_OTHERSIDE );
SetDist( r, c, 1 - side, newdist );
RoutingMatrix.SetDir( r, c, 1 - side, FROM_OTHERSIDE );
RoutingMatrix.SetDist( r, c, 1 - side, newdist );
if( SetQueue( r, c, 1 - side, newdist, apx_dist, row_target, col_target ) == 0 )
{
return ERR_MEMORY;
}
}
else if( newdist < GetDist( r, c, 1 - side ) )
else if( newdist < RoutingMatrix.GetDist( r, c, 1 - side ) )
{
SetDir( r, c, 1 - side, FROM_OTHERSIDE );
SetDist( r, c, 1 - side, newdist );
ReSetQueue( r,
c,
RoutingMatrix.SetDir( r, c, 1 - side, FROM_OTHERSIDE );
RoutingMatrix.SetDist( r, c, 1 - side, newdist );
ReSetQueue( r, c,
1 - side,
newdist,
apx_dist,
......@@ -972,7 +961,7 @@ static int Retrace( PCB_EDIT_FRAME* pcbframe, wxDC* DC,
{
/* find where we came from to get here */
r2 = r1; c2 = c1; s2 = s1;
x = GetDir( r1, c1, s1 );
x = RoutingMatrix.GetDir( r1, c1, s1 );
switch( x )
{
......@@ -1017,12 +1006,12 @@ static int Retrace( PCB_EDIT_FRAME* pcbframe, wxDC* DC,
break;
default:
DisplayError( pcbframe, wxT( "Retrace: internal error: no way back" ) );
wxMessageBox( wxT( "Retrace: internal error: no way back" ) );
return 0;
}
if( r0 != ILLEGAL )
y = GetDir( r0, c0, s0 );
y = RoutingMatrix.GetDir( r0, c0, s0 );
/* see if target or hole */
if( ( ( r1 == row_target ) && ( c1 == col_target ) ) || ( s1 != s0 ) )
......@@ -1091,7 +1080,7 @@ static int Retrace( PCB_EDIT_FRAME* pcbframe, wxDC* DC,
}
else
{
DisplayError( pcbframe, wxT( "Retrace: error 2" ) );
wxMessageBox( wxT( "Retrace: error 2" ) );
return 0;
}
}
......@@ -1136,7 +1125,7 @@ static int Retrace( PCB_EDIT_FRAME* pcbframe, wxDC* DC,
case FROM_OTHERSIDE:
default:
DisplayError( pcbframe, wxT( "Retrace: error 3" ) );
wxMessageBox( wxT( "Retrace: error 3" ) );
return 0;
}
......
......@@ -92,13 +92,10 @@ void ReInitWork()
*/
static int GetCost( int r1, int c1, int r2, int c2 );
int SetWork( int r1,
int c1,
int SetWork( int r1, int c1,
int n_c,
int r2,
int c2,
RATSNEST_ITEM* pt_ch,
int pri )
int r2, int c2,
RATSNEST_ITEM* pt_ch, int pri )
{
CWORK* p;
......@@ -226,11 +223,10 @@ void SortWork()
static int GetCost( int r1, int c1, int r2, int c2 )
{
int dx, dy, mx, my;
double incl;
double incl = 1.0;
dx = abs( c2 - c1 );
dy = abs( r2 - r1 );
incl = 1.0;
mx = dx;
my = dy;
......
......@@ -1075,6 +1075,10 @@ void PCB_BASE_FRAME::RecalculateAllTracksNetcode()
*/
static bool SortTracksByNetCode( const TRACK* const & ref, const TRACK* const & compare )
{
// For items having the same Net, keep the order in list
if( ref->GetNet() == compare->GetNet())
return ref->m_Param < compare->m_Param;
return ref->GetNet() < compare->GetNet();
}
......@@ -1082,6 +1086,7 @@ static bool SortTracksByNetCode( const TRACK* const & ref, const TRACK* const &
* Helper function RebuildTrackChain
* rebuilds the track segment linked list in order to have a chain
* sorted by increasing netcodes.
* We try to keep order of track segments in list, when possible
* @param pcb = board to rebuild
*/
static void RebuildTrackChain( BOARD* pcb )
......@@ -1094,8 +1099,19 @@ static void RebuildTrackChain( BOARD* pcb )
std::vector<TRACK*> trackList;
trackList.reserve( item_count );
for( int i = 0; i < item_count; ++i )
// Put track list in a temporary list to sort tracks by netcode
// We try to keep the initial order of track segments in list, when possible
// so we use m_Param (a member variable used for temporary storage)
// to temporary keep trace of the order of segments
// The sort function uses this variable to sort items that
// have the same net code.
// Without this, during sorting, the initial order is sometimes lost
// by the sort algorithm
for( int ii = 0; ii < item_count; ++ii )
{
pcb->m_Track->m_Param = ii;
trackList.push_back( pcb->m_Track.PopFront() );
}
// the list is empty now
wxASSERT( pcb->m_Track == NULL && pcb->m_Track.GetCount()==0 );
......
......@@ -1103,11 +1103,11 @@ PCB_IO::PCB_IO()
BOARD* PCB_IO::Load( const wxString& aFileName, BOARD* aAppendToMe, PROPERTIES* aProperties )
{
wxFFile file( aFileName, "r" );
wxFFile file( aFileName, wxT("r") );
if( !file.IsOpened() )
{
THROW_IO_ERROR( _( "Unable to read file \"" ) + GetChars( aFileName ) + wxT( "\"" ) );
THROW_IO_ERROR( _( "Unable to read file \"" ) + aFileName + wxT( "\"" ) );
}
PCB_PARSER parser( new FILE_LINE_READER( file.fp(), aFileName ), aAppendToMe );
......
......@@ -620,7 +620,7 @@ void PCB_PARSER::parseLayers() throw( IO_ERROR, PARSE_ERROR )
T token;
wxString name;
wxString type;
bool isVisible;
bool isVisible = true;
int visibleLayers = 0;
int enabledLayers = 0;
std::vector< LAYER > layers;
......@@ -655,7 +655,7 @@ void PCB_PARSER::parseLayers() throw( IO_ERROR, PARSE_ERROR )
Expecting( "hide or )" );
}
layers.push_back( LAYER( name, LAYER::ParseType( type.c_str() ), isVisible ) );
layers.push_back( LAYER( name, LAYER::ParseType( TO_UTF8( type ) ), isVisible ) );
}
int copperLayerCount = 0;
......@@ -701,7 +701,7 @@ void PCB_PARSER::parseLayers() throw( IO_ERROR, PARSE_ERROR )
{
wxString error;
error.Printf( _( "Cannot determine fixed layer list index of layer name \"%s\"" ),
layers[i].m_Name );
GetChars( layers[i].m_Name ) );
THROW_IO_ERROR( error );
}
}
......@@ -1110,7 +1110,7 @@ void PCB_PARSER::parseNETCLASS() throw( IO_ERROR, PARSE_ERROR )
wxString error;
error.Printf( _( "duplicate NETCLASS name '%s' in file %s at line %d, offset %d" ),
nc->GetName().GetData(), CurSource(), CurLineNumber(), CurOffset() );
nc->GetName().GetData(), CurSource().GetData(), CurLineNumber(), CurOffset() );
THROW_IO_ERROR( error );
}
}
......@@ -2268,8 +2268,8 @@ ZONE_CONTAINER* PCB_PARSER::parseZONE_CONTAINER() throw( IO_ERROR, PARSE_ERROR )
wxT( "Cannot parse " ) + GetTokenString( CurTok() ) +
wxT( " as ZONE_CONTAINER." ) );
int hatchStyle;
int hatchPitch;
int hatchStyle = CPolyLine::NO_HATCH; // Fix compil warning
int hatchPitch = 0; // Fix compil warning
wxPoint pt;
T token;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment