Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
K
kicad-source-mirror
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
Elphel
kicad-source-mirror
Commits
3312da31
Commit
3312da31
authored
Aug 21, 2007
by
dickelbeck
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
beautification
parent
40efaf41
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
412 additions
and
392 deletions
+412
-392
board.cpp
pcbnew/board.cpp
+412
-392
No files found.
pcbnew/board.cpp
View file @
3312da31
/************************************************/
/* EDITEUR de PCB: AUTOROUTAGE: routines d'init */
/************************************************/
/************************************************/
/* EDITEUR de PCB: AUTOROUTAGE: routines d'init */
/************************************************/
/* Fichier BOARD.CC */
/* Fichier BOARD.CC */
#include "fctsys.h"
#include "gr_basic.h"
...
...
@@ -17,383 +17,404 @@
/* routines externes : */
/* Routines definies ici: */
int
Build_Work
(
BOARD
*
Pcb
,
CHEVELU
*
pt_base_chevelu
);
void
PlaceCells
(
BOARD
*
Pcb
,
int
net_code
,
int
flag
);
int
InitBoard
(
void
);
BoardCell
GetCell
(
int
,
int
,
int
);
void
SetCell
(
int
row
,
int
col
,
int
side
,
BoardCell
x
);
void
OrCell
(
int
,
int
,
int
,
BoardCell
);
void
AndCell
(
int
,
int
,
int
,
BoardCell
);
void
AddCell
(
int
,
int
,
int
,
BoardCell
);
void
XorCell
(
int
,
int
,
int
,
BoardCell
);
void
AddCell
(
int
,
int
,
int
,
BoardCell
);
DistCell
GetDist
(
int
,
int
,
int
);
void
SetDist
(
int
,
int
,
int
,
DistCell
);
int
GetDir
(
int
,
int
,
int
);
void
SetDir
(
int
,
int
,
int
,
int
);
int
Build_Work
(
BOARD
*
Pcb
,
CHEVELU
*
pt_base_chevelu
);
void
PlaceCells
(
BOARD
*
Pcb
,
int
net_code
,
int
flag
);
int
InitBoard
(
void
);
BoardCell
GetCell
(
int
,
int
,
int
);
void
SetCell
(
int
row
,
int
col
,
int
side
,
BoardCell
x
);
void
OrCell
(
int
,
int
,
int
,
BoardCell
);
void
AndCell
(
int
,
int
,
int
,
BoardCell
);
void
AddCell
(
int
,
int
,
int
,
BoardCell
);
void
XorCell
(
int
,
int
,
int
,
BoardCell
);
void
AddCell
(
int
,
int
,
int
,
BoardCell
);
DistCell
GetDist
(
int
,
int
,
int
);
void
SetDist
(
int
,
int
,
int
,
DistCell
);
int
GetDir
(
int
,
int
,
int
);
void
SetDir
(
int
,
int
,
int
,
int
);
/*****************************************************************/
bool
ComputeMatriceSize
(
WinEDA_BasePcbFrame
*
frame
,
int
g_GridRoutingSize
)
bool
ComputeMatriceSize
(
WinEDA_BasePcbFrame
*
frame
,
int
g_GridRoutingSize
)
/*****************************************************************/
/*
Calcule Nrows et Ncols, dimensions de la matrice de representation du BOARD
pour les routages automatiques et calculs de zone
*/
*
Calcule Nrows et Ncols, dimensions de la matrice de representation du BOARD
*
pour les routages automatiques et calculs de zone
*/
{
BOARD
*
pcb
=
frame
->
m_Pcb
;
pcb
->
ComputeBoundaryBox
();
/* The boundary box must have its start point on routing grid: */
pcb
->
m_BoundaryBox
.
m_Pos
.
x
-=
pcb
->
m_BoundaryBox
.
m_Pos
.
x
%
g_GridRoutingSize
;
pcb
->
m_BoundaryBox
.
m_Pos
.
y
-=
pcb
->
m_BoundaryBox
.
m_Pos
.
y
%
g_GridRoutingSize
;
/* The boundary box must have its end point on routing grid: */
wxPoint
end
=
pcb
->
m_BoundaryBox
.
GetEnd
();
end
.
x
-=
end
.
x
%
g_GridRoutingSize
;
end
.
x
+=
g_GridRoutingSize
;
end
.
y
-=
end
.
y
%
g_GridRoutingSize
;
end
.
y
+=
g_GridRoutingSize
;
pcb
->
m_BoundaryBox
.
SetEnd
(
end
);
Nrows
=
pcb
->
m_BoundaryBox
.
m_Size
.
y
/
g_GridRoutingSize
;
Ncols
=
pcb
->
m_BoundaryBox
.
m_Size
.
x
/
g_GridRoutingSize
;
/* get a small margin for memory allocation: */
Ncols
+=
2
;
Nrows
+=
2
;
return
TRUE
;
BOARD
*
pcb
=
frame
->
m_Pcb
;
pcb
->
ComputeBoundaryBox
();
/* The boundary box must have its start point on routing grid: */
pcb
->
m_BoundaryBox
.
m_Pos
.
x
-=
pcb
->
m_BoundaryBox
.
m_Pos
.
x
%
g_GridRoutingSize
;
pcb
->
m_BoundaryBox
.
m_Pos
.
y
-=
pcb
->
m_BoundaryBox
.
m_Pos
.
y
%
g_GridRoutingSize
;
/* The boundary box must have its end point on routing grid: */
wxPoint
end
=
pcb
->
m_BoundaryBox
.
GetEnd
();
end
.
x
-=
end
.
x
%
g_GridRoutingSize
;
end
.
x
+=
g_GridRoutingSize
;
end
.
y
-=
end
.
y
%
g_GridRoutingSize
;
end
.
y
+=
g_GridRoutingSize
;
pcb
->
m_BoundaryBox
.
SetEnd
(
end
);
Nrows
=
pcb
->
m_BoundaryBox
.
m_Size
.
y
/
g_GridRoutingSize
;
Ncols
=
pcb
->
m_BoundaryBox
.
m_Size
.
x
/
g_GridRoutingSize
;
/* get a small margin for memory allocation: */
Ncols
+=
2
;
Nrows
+=
2
;
return
TRUE
;
}
/*******************/
/* class BOARDHEAD */
/*******************/
BOARDHEAD
::
BOARDHEAD
(
void
)
/*******************/
/* class BOARDHEAD */
/*******************/
BOARDHEAD
::
BOARDHEAD
(
void
)
{
m_BoardSide
[
0
]
=
m_BoardSide
[
1
]
=
NULL
;
m_DistSide
[
0
]
=
m_DistSide
[
1
]
=
NULL
;
m_DirSide
[
0
]
=
m_DirSide
[
1
]
=
NULL
;
m_InitBoardDone
=
FALSE
;
m_Layers
=
2
;
m_Nrows
=
m_Ncols
=
0
;
m_MemSize
=
0
;
m_BoardSide
[
0
]
=
m_BoardSide
[
1
]
=
NULL
;
m_DistSide
[
0
]
=
m_DistSide
[
1
]
=
NULL
;
m_DirSide
[
0
]
=
m_DirSide
[
1
]
=
NULL
;
m_InitBoardDone
=
FALSE
;
m_Layers
=
2
;
m_Nrows
=
m_Ncols
=
0
;
m_MemSize
=
0
;
}
BOARDHEAD
::~
BOARDHEAD
(
void
)
BOARDHEAD
::~
BOARDHEAD
(
void
)
{
}
/******************************/
int
BOARDHEAD
::
InitBoard
(
void
)
int
BOARDHEAD
::
InitBoard
(
void
)
/*****************************/
/* initialize the data structures
retourne la taille RAM utilisee, ou -1 si defaut
*/
/* initialize the data structures
* retourne la taille RAM utilisee, ou -1 si defaut
*/
{
int
ii
,
kk
;
int
ii
,
kk
;
if
(
Nrows
<=
0
||
Ncols
<=
0
)
return
(
0
);
m_Nrows
=
Nrows
;
m_Ncols
=
Ncols
;
if
(
Nrows
<=
0
||
Ncols
<=
0
)
return
0
;
m_Nrows
=
Nrows
;
m_Ncols
=
Ncols
;
m_InitBoardDone
=
TRUE
;
/* we have been called */
m_InitBoardDone
=
TRUE
;
/* we have been called */
ii
=
(
Nrows
+
1
)
*
(
Ncols
+
1
);
ii
=
(
Nrows
+
1
)
*
(
Ncols
+
1
);
for
(
kk
=
0
;
kk
<
m_Layers
;
kk
++
)
{
m_BoardSide
[
kk
]
=
NULL
;
m_DistSide
[
kk
]
=
NULL
;
m_DirSide
[
kk
]
=
NULL
;
for
(
kk
=
0
;
kk
<
m_Layers
;
kk
++
)
{
m_BoardSide
[
kk
]
=
NULL
;
m_DistSide
[
kk
]
=
NULL
;
m_DirSide
[
kk
]
=
NULL
;
/* allocate Board & initialize everything to empty */
m_BoardSide
[
kk
]
=
(
BoardCell
*
)
MyZMalloc
(
ii
*
sizeof
(
BoardCell
)
);
if
(
m_BoardSide
[
kk
]
==
NULL
)
return
(
-
1
);
/* allocate Board & initialize everything to empty */
m_BoardSide
[
kk
]
=
(
BoardCell
*
)
MyZMalloc
(
ii
*
sizeof
(
BoardCell
)
);
if
(
m_BoardSide
[
kk
]
==
NULL
)
return
-
1
;
/***** allocate Distances *****/
m_DistSide
[
kk
]
=
(
DistCell
*
)
MyZMalloc
(
ii
*
sizeof
(
DistCell
)
);
if
(
m_DistSide
[
kk
]
==
NULL
)
return
(
-
1
);
/***** allocate Distances *****/
m_DistSide
[
kk
]
=
(
DistCell
*
)
MyZMalloc
(
ii
*
sizeof
(
DistCell
)
);
if
(
m_DistSide
[
kk
]
==
NULL
)
return
-
1
;
/***** allocate Dir (chars) *****/
m_DirSide
[
kk
]
=
(
char
*
)
MyZMalloc
(
ii
);
if
(
m_DirSide
[
kk
]
==
NULL
)
return
(
-
1
);
}
/***** allocate Dir (chars) *****/
m_DirSide
[
kk
]
=
(
char
*
)
MyZMalloc
(
ii
);
if
(
m_DirSide
[
kk
]
==
NULL
)
return
-
1
;
}
m_MemSize
=
m_Layers
*
ii
*
(
sizeof
(
BoardCell
)
+
sizeof
(
DistCell
)
+
sizeof
(
char
)
);
m_MemSize
=
m_Layers
*
ii
*
(
sizeof
(
BoardCell
)
+
sizeof
(
DistCell
)
+
sizeof
(
char
)
);
return
(
m_MemSize
)
;
return
m_MemSize
;
}
/*********************************/
void
BOARDHEAD
::
UnInitBoard
(
void
)
void
BOARDHEAD
::
UnInitBoard
(
void
)
/*********************************/
/* deallocation de la memoire */
{
int
ii
;
m_InitBoardDone
=
FALSE
;
for
(
ii
=
0
;
ii
<
2
;
ii
++
)
{
/***** de-allocate Dir (chars) *****/
if
(
m_DirSide
[
ii
]
)
{
MyFree
(
m_DirSide
[
ii
]
);
m_DirSide
[
ii
]
=
NULL
;
}
/***** de-allocate Distances *****/
if
(
m_DistSide
[
ii
]
)
{
MyFree
(
m_DistSide
[
ii
]
);
m_DistSide
[
ii
]
=
NULL
;
}
/**** de-allocate Board *****/
if
(
m_BoardSide
[
ii
]
)
{
MyFree
(
m_BoardSide
[
ii
]
);
m_BoardSide
[
ii
]
=
NULL
;
}
}
m_Nrows
=
m_Ncols
=
0
;
int
ii
;
m_InitBoardDone
=
FALSE
;
for
(
ii
=
0
;
ii
<
2
;
ii
++
)
{
/***** de-allocate Dir (chars) *****/
if
(
m_DirSide
[
ii
]
)
{
MyFree
(
m_DirSide
[
ii
]
);
m_DirSide
[
ii
]
=
NULL
;
}
/***** de-allocate Distances *****/
if
(
m_DistSide
[
ii
]
)
{
MyFree
(
m_DistSide
[
ii
]
);
m_DistSide
[
ii
]
=
NULL
;
}
/**** de-allocate Board *****/
if
(
m_BoardSide
[
ii
]
)
{
MyFree
(
m_BoardSide
[
ii
]
);
m_BoardSide
[
ii
]
=
NULL
;
}
}
m_Nrows
=
m_Ncols
=
0
;
}
/*****************************************************/
void
PlaceCells
(
BOARD
*
Pcb
,
int
net_code
,
int
flag
)
void
PlaceCells
(
BOARD
*
Pcb
,
int
net_code
,
int
flag
)
/*****************************************************/
/* Initialise les cellules du board a la valeur HOLE et VIA_IMPOSSIBLE
selon les marges d'isolement
les elements de net_code = net_code ne seront pas places comme occupe
mais en VIA_IMPOSSIBLE uniquement
Pour Routage 1 seule face:
le plan BOTTOM est utilise
et Route_Layer_BOTTOM = Route_Layer_TOP
Selon les bits = 1 du parametre flag:
si FORCE_PADS : tous les pads seront places meme ceux de meme net_code
*/
*
selon les marges d'isolement
*
les elements de net_code = net_code ne seront pas places comme occupe
*
mais en VIA_IMPOSSIBLE uniquement
*
Pour Routage 1 seule face:
*
le plan BOTTOM est utilise
*
et Route_Layer_BOTTOM = Route_Layer_TOP
*
*
Selon les bits = 1 du parametre flag:
*
si FORCE_PADS : tous les pads seront places meme ceux de meme net_code
*/
{
int
ii
;
LISTE_PAD
*
ptr
;
TRACK
*
pt_segm
;
TEXTE_PCB
*
PtText
;
DRAWSEGMENT
*
DrawSegm
;
EDA_BaseStruct
*
PtStruct
;
int
ux0
=
0
,
uy0
=
0
,
ux1
,
uy1
,
dx
,
dy
;
int
marge
,
via_marge
;
int
masque_layer
;
marge
=
g_DesignSettings
.
m_TrackClearence
+
(
g_DesignSettings
.
m_CurrentTrackWidth
/
2
);
via_marge
=
g_DesignSettings
.
m_TrackClearence
+
(
g_DesignSettings
.
m_CurrentViaSize
/
2
);
/////////////////////////////////////
// Placement des PADS sur le board //
/////////////////////////////////////
ptr
=
(
LISTE_PAD
*
)
Pcb
->
m_Pads
;
ii
=
Pcb
->
m_NbPads
;
for
(
;
ii
>
0
;
ii
--
,
ptr
++
)
{
if
(
(
net_code
!=
(
*
ptr
)
->
m_NetCode
)
||
(
flag
&
FORCE_PADS
)
)
{
Place_1_Pad_Board
(
Pcb
,
*
ptr
,
HOLE
,
marge
,
WRITE_CELL
);
}
Place_1_Pad_Board
(
Pcb
,
*
ptr
,
VIA_IMPOSSIBLE
,
via_marge
,
WRITE_OR_CELL
);
}
///////////////////////////////////////////////
// Placement des elements de modules sur PCB //
///////////////////////////////////////////////
PtStruct
=
Pcb
->
m_Modules
;
for
(
;
PtStruct
!=
NULL
;
PtStruct
=
PtStruct
->
Pnext
)
{
EDA_BaseStruct
*
PtModStruct
=
((
MODULE
*
)
PtStruct
)
->
m_Drawings
;
for
(
;
PtModStruct
!=
NULL
;
PtModStruct
=
PtModStruct
->
Pnext
)
{
switch
(
PtModStruct
->
m_StructType
)
{
case
TYPEEDGEMODULE
:
{
TRACK
*
TmpSegm
=
new
TRACK
(
NULL
);
TmpSegm
->
m_Layer
=
((
EDGE_MODULE
*
)
PtModStruct
)
->
m_Layer
;
if
(
TmpSegm
->
m_Layer
==
EDGE_N
)
TmpSegm
->
m_Layer
=
-
1
;
TmpSegm
->
m_Start
=
((
EDGE_MODULE
*
)
PtModStruct
)
->
m_Start
;
TmpSegm
->
m_End
=
((
EDGE_MODULE
*
)
PtModStruct
)
->
m_End
;
TmpSegm
->
m_Shape
=
((
EDGE_MODULE
*
)
PtModStruct
)
->
m_Shape
;
TmpSegm
->
m_Width
=
((
EDGE_MODULE
*
)
PtModStruct
)
->
m_Width
;
TmpSegm
->
m_Param
=
((
EDGE_MODULE
*
)
PtModStruct
)
->
m_Angle
;
TmpSegm
->
m_NetCode
=
-
1
;
TraceSegmentPcb
(
Pcb
,
TmpSegm
,
HOLE
,
marge
,
WRITE_CELL
);
TraceSegmentPcb
(
Pcb
,
TmpSegm
,
VIA_IMPOSSIBLE
,
via_marge
,
WRITE_OR_CELL
);
delete
TmpSegm
;
break
;
}
default
:
break
;
}
}
}
////////////////////////////////////////////
// Placement des contours et segments PCB //
////////////////////////////////////////////
PtStruct
=
Pcb
->
m_Drawings
;
for
(
;
PtStruct
!=
NULL
;
PtStruct
=
PtStruct
->
Pnext
)
{
switch
(
PtStruct
->
m_StructType
)
{
case
TYPEDRAWSEGMENT
:
{
int
type_cell
=
HOLE
;
TRACK
*
TmpSegm
=
new
TRACK
(
NULL
);
DrawSegm
=
(
DRAWSEGMENT
*
)
PtStruct
;
TmpSegm
->
m_Layer
=
DrawSegm
->
m_Layer
;
if
(
DrawSegm
->
m_Layer
==
EDGE_N
)
{
TmpSegm
->
m_Layer
=
-
1
;
type_cell
|=
CELL_is_EDGE
;
}
TmpSegm
->
m_Start
=
DrawSegm
->
m_Start
;
TmpSegm
->
m_End
=
DrawSegm
->
m_End
;
TmpSegm
->
m_Shape
=
DrawSegm
->
m_Shape
;
TmpSegm
->
m_Width
=
DrawSegm
->
m_Width
;
TmpSegm
->
m_Param
=
DrawSegm
->
m_Angle
;
TmpSegm
->
m_NetCode
=
-
1
;
TraceSegmentPcb
(
Pcb
,
TmpSegm
,
type_cell
,
marge
,
WRITE_CELL
);
int
ii
;
LISTE_PAD
*
ptr
;
TRACK
*
pt_segm
;
TEXTE_PCB
*
PtText
;
DRAWSEGMENT
*
DrawSegm
;
EDA_BaseStruct
*
PtStruct
;
int
ux0
=
0
,
uy0
=
0
,
ux1
,
uy1
,
dx
,
dy
;
int
marge
,
via_marge
;
int
masque_layer
;
marge
=
g_DesignSettings
.
m_TrackClearence
+
(
g_DesignSettings
.
m_CurrentTrackWidth
/
2
);
via_marge
=
g_DesignSettings
.
m_TrackClearence
+
(
g_DesignSettings
.
m_CurrentViaSize
/
2
);
/////////////////////////////////////
// Placement des PADS sur le board //
/////////////////////////////////////
ptr
=
(
LISTE_PAD
*
)
Pcb
->
m_Pads
;
ii
=
Pcb
->
m_NbPads
;
for
(
;
ii
>
0
;
ii
--
,
ptr
++
)
{
if
(
(
net_code
!=
(
*
ptr
)
->
m_NetCode
)
||
(
flag
&
FORCE_PADS
)
)
{
Place_1_Pad_Board
(
Pcb
,
*
ptr
,
HOLE
,
marge
,
WRITE_CELL
);
}
Place_1_Pad_Board
(
Pcb
,
*
ptr
,
VIA_IMPOSSIBLE
,
via_marge
,
WRITE_OR_CELL
);
}
///////////////////////////////////////////////
// Placement des elements de modules sur PCB //
///////////////////////////////////////////////
PtStruct
=
Pcb
->
m_Modules
;
for
(
;
PtStruct
!=
NULL
;
PtStruct
=
PtStruct
->
Pnext
)
{
EDA_BaseStruct
*
PtModStruct
=
(
(
MODULE
*
)
PtStruct
)
->
m_Drawings
;
for
(
;
PtModStruct
!=
NULL
;
PtModStruct
=
PtModStruct
->
Pnext
)
{
switch
(
PtModStruct
->
m_StructType
)
{
case
TYPEEDGEMODULE
:
{
TRACK
*
TmpSegm
=
new
TRACK
(
NULL
);
TmpSegm
->
m_Layer
=
(
(
EDGE_MODULE
*
)
PtModStruct
)
->
m_Layer
;
if
(
TmpSegm
->
m_Layer
==
EDGE_N
)
TmpSegm
->
m_Layer
=
-
1
;
TmpSegm
->
m_Start
=
(
(
EDGE_MODULE
*
)
PtModStruct
)
->
m_Start
;
TmpSegm
->
m_End
=
(
(
EDGE_MODULE
*
)
PtModStruct
)
->
m_End
;
TmpSegm
->
m_Shape
=
(
(
EDGE_MODULE
*
)
PtModStruct
)
->
m_Shape
;
TmpSegm
->
m_Width
=
(
(
EDGE_MODULE
*
)
PtModStruct
)
->
m_Width
;
TmpSegm
->
m_Param
=
(
(
EDGE_MODULE
*
)
PtModStruct
)
->
m_Angle
;
TmpSegm
->
m_NetCode
=
-
1
;
TraceSegmentPcb
(
Pcb
,
TmpSegm
,
HOLE
,
marge
,
WRITE_CELL
);
TraceSegmentPcb
(
Pcb
,
TmpSegm
,
VIA_IMPOSSIBLE
,
via_marge
,
WRITE_OR_CELL
);
delete
TmpSegm
;
break
;
}
default
:
break
;
}
}
}
////////////////////////////////////////////
// Placement des contours et segments PCB //
////////////////////////////////////////////
PtStruct
=
Pcb
->
m_Drawings
;
for
(
;
PtStruct
!=
NULL
;
PtStruct
=
PtStruct
->
Pnext
)
{
switch
(
PtStruct
->
m_StructType
)
{
case
TYPEDRAWSEGMENT
:
{
int
type_cell
=
HOLE
;
TRACK
*
TmpSegm
=
new
TRACK
(
NULL
);
DrawSegm
=
(
DRAWSEGMENT
*
)
PtStruct
;
TmpSegm
->
m_Layer
=
DrawSegm
->
m_Layer
;
if
(
DrawSegm
->
m_Layer
==
EDGE_N
)
{
TmpSegm
->
m_Layer
=
-
1
;
type_cell
|=
CELL_is_EDGE
;
}
TmpSegm
->
m_Start
=
DrawSegm
->
m_Start
;
TmpSegm
->
m_End
=
DrawSegm
->
m_End
;
TmpSegm
->
m_Shape
=
DrawSegm
->
m_Shape
;
TmpSegm
->
m_Width
=
DrawSegm
->
m_Width
;
TmpSegm
->
m_Param
=
DrawSegm
->
m_Angle
;
TmpSegm
->
m_NetCode
=
-
1
;
TraceSegmentPcb
(
Pcb
,
TmpSegm
,
type_cell
,
marge
,
WRITE_CELL
);
// TraceSegmentPcb(Pcb, TmpSegm, VIA_IMPOSSIBLE, via_marge,WRITE_OR_CELL );
delete
TmpSegm
;
break
;
}
case
TYPETEXTE
:
PtText
=
(
TEXTE_PCB
*
)
PtStruct
;
if
(
PtText
->
GetLength
()
==
0
)
break
;
ux0
=
PtText
->
m_Pos
.
x
;
uy0
=
PtText
->
m_Pos
.
y
;
dx
=
PtText
->
Pitch
()
*
PtText
->
GetLength
();
dy
=
PtText
->
m_Size
.
y
+
PtText
->
m_Width
;
/* Calcul du rectangle d'encadrement */
dx
/=
2
;
dy
/=
2
;
/* dx et dy = demi dimensionx X et Y */
ux1
=
ux0
+
dx
;
uy1
=
uy0
+
dy
;
ux0
-=
dx
;
uy0
-=
dy
;
masque_layer
=
g_TabOneLayerMask
[
PtText
->
m_Layer
];
TraceFilledRectangle
(
Pcb
,
ux0
-
marge
,
uy0
-
marge
,
ux1
+
marge
,
uy1
+
marge
,
(
int
)(
PtText
->
m_Orient
),
masque_layer
,
HOLE
,
WRITE_CELL
);
TraceFilledRectangle
(
Pcb
,
ux0
-
via_marge
,
uy0
-
via_marge
,
ux1
+
via_marge
,
uy1
+
via_marge
,
(
int
)(
PtText
->
m_Orient
),
masque_layer
,
VIA_IMPOSSIBLE
,
WRITE_OR_CELL
);
break
;
default
:
break
;
}
}
/* Placement des PISTES */
pt_segm
=
Pcb
->
m_Track
;
for
(
;
pt_segm
!=
NULL
;
pt_segm
=
(
TRACK
*
)
pt_segm
->
Pnext
)
{
if
(
net_code
==
pt_segm
->
m_NetCode
)
continue
;
TraceSegmentPcb
(
Pcb
,
pt_segm
,
HOLE
,
marge
,
WRITE_CELL
);
TraceSegmentPcb
(
Pcb
,
pt_segm
,
VIA_IMPOSSIBLE
,
via_marge
,
WRITE_OR_CELL
);
}
/* Placement des ZONES */
pt_segm
=
(
TRACK
*
)
Pcb
->
m_Zone
;
for
(
;
pt_segm
!=
NULL
;
pt_segm
=
(
TRACK
*
)
pt_segm
->
Pnext
)
{
if
(
net_code
==
pt_segm
->
m_NetCode
)
continue
;
TraceSegmentPcb
(
Pcb
,
pt_segm
,
HOLE
,
marge
,
WRITE_CELL
);
TraceSegmentPcb
(
Pcb
,
pt_segm
,
VIA_IMPOSSIBLE
,
via_marge
,
WRITE_OR_CELL
);
}
delete
TmpSegm
;
break
;
}
case
TYPETEXTE
:
PtText
=
(
TEXTE_PCB
*
)
PtStruct
;
if
(
PtText
->
GetLength
()
==
0
)
break
;
ux0
=
PtText
->
m_Pos
.
x
;
uy0
=
PtText
->
m_Pos
.
y
;
dx
=
PtText
->
Pitch
()
*
PtText
->
GetLength
();
dy
=
PtText
->
m_Size
.
y
+
PtText
->
m_Width
;
/* Calcul du rectangle d'encadrement */
dx
/=
2
;
dy
/=
2
;
/* dx et dy = demi dimensionx X et Y */
ux1
=
ux0
+
dx
;
uy1
=
uy0
+
dy
;
ux0
-=
dx
;
uy0
-=
dy
;
masque_layer
=
g_TabOneLayerMask
[
PtText
->
m_Layer
];
TraceFilledRectangle
(
Pcb
,
ux0
-
marge
,
uy0
-
marge
,
ux1
+
marge
,
uy1
+
marge
,
(
int
)
(
PtText
->
m_Orient
),
masque_layer
,
HOLE
,
WRITE_CELL
);
TraceFilledRectangle
(
Pcb
,
ux0
-
via_marge
,
uy0
-
via_marge
,
ux1
+
via_marge
,
uy1
+
via_marge
,
(
int
)
(
PtText
->
m_Orient
),
masque_layer
,
VIA_IMPOSSIBLE
,
WRITE_OR_CELL
);
break
;
default
:
break
;
}
}
/* Placement des PISTES */
pt_segm
=
Pcb
->
m_Track
;
for
(
;
pt_segm
!=
NULL
;
pt_segm
=
(
TRACK
*
)
pt_segm
->
Pnext
)
{
if
(
net_code
==
pt_segm
->
m_NetCode
)
continue
;
TraceSegmentPcb
(
Pcb
,
pt_segm
,
HOLE
,
marge
,
WRITE_CELL
);
TraceSegmentPcb
(
Pcb
,
pt_segm
,
VIA_IMPOSSIBLE
,
via_marge
,
WRITE_OR_CELL
);
}
/* Placement des ZONES */
pt_segm
=
(
TRACK
*
)
Pcb
->
m_Zone
;
for
(
;
pt_segm
!=
NULL
;
pt_segm
=
(
TRACK
*
)
pt_segm
->
Pnext
)
{
if
(
net_code
==
pt_segm
->
m_NetCode
)
continue
;
TraceSegmentPcb
(
Pcb
,
pt_segm
,
HOLE
,
marge
,
WRITE_CELL
);
TraceSegmentPcb
(
Pcb
,
pt_segm
,
VIA_IMPOSSIBLE
,
via_marge
,
WRITE_OR_CELL
);
}
}
/******************************************************/
int
Build_Work
(
BOARD
*
Pcb
,
CHEVELU
*
pt_base_chevelu
)
int
Build_Work
(
BOARD
*
Pcb
,
CHEVELU
*
pt_base_chevelu
)
/*****************************************************/
/* Build liste conn */
/* Build liste conn */
{
int
ii
;
CHEVELU
*
pt_rats
=
pt_base_chevelu
;
D_PAD
*
pt_pad
;
int
r1
,
r2
,
c1
,
c2
,
current_net_code
;
CHEVELU
*
pt_ch
;
int
demi_pas
=
g_GridRoutingSize
/
2
;
wxString
msg
;
InitWork
();
/* clear work list */
Ntotal
=
0
;
for
(
ii
=
Pcb
->
GetNumRatsnests
();
ii
>
0
;
ii
--
,
pt_rats
++
)
{
/* On ne route que les chevelus actifs et routables */
if
(
(
pt_rats
->
status
&
CH_ACTIF
)
==
0
)
continue
;
if
(
pt_rats
->
status
&
CH_UNROUTABLE
)
continue
;
if
(
(
pt_rats
->
status
&
CH_ROUTE_REQ
)
==
0
)
continue
;
pt_pad
=
pt_rats
->
pad_start
;
current_net_code
=
pt_pad
->
m_NetCode
;
pt_ch
=
pt_rats
;
r1
=
(
pt_pad
->
m_Pos
.
y
-
Pcb
->
m_BoundaryBox
.
m_Pos
.
y
+
demi_pas
)
/
g_GridRoutingSize
;
if
(
r1
<
0
||
r1
>=
Nrows
)
{
msg
.
Printf
(
wxT
(
"erreur : row = %d ( padY %d pcbY %d) "
),
r1
,
pt_pad
->
m_Pos
.
y
,
Pcb
->
m_BoundaryBox
.
m_Pos
.
y
);
DisplayError
(
NULL
,
msg
);
return
(
0
);
}
c1
=
(
pt_pad
->
m_Pos
.
x
-
Pcb
->
m_BoundaryBox
.
m_Pos
.
x
+
demi_pas
)
/
g_GridRoutingSize
;
if
(
c1
<
0
||
c1
>=
Ncols
)
{
msg
.
Printf
(
wxT
(
"erreur : col = %d ( padX %d pcbX %d) "
),
c1
,
pt_pad
->
m_Pos
.
x
,
Pcb
->
m_BoundaryBox
.
m_Pos
.
x
);
DisplayError
(
NULL
,
msg
);
return
(
0
);
}
pt_pad
=
pt_rats
->
pad_end
;
r2
=
(
pt_pad
->
m_Pos
.
y
-
Pcb
->
m_BoundaryBox
.
m_Pos
.
y
+
demi_pas
)
/
g_GridRoutingSize
;
if
(
r2
<
0
||
r2
>=
Nrows
)
{
msg
.
Printf
(
wxT
(
"erreur : row = %d ( padY %d pcbY %d) "
),
r2
,
pt_pad
->
m_Pos
.
y
,
Pcb
->
m_BoundaryBox
.
m_Pos
.
y
);
DisplayError
(
NULL
,
msg
);
return
(
0
);
}
c2
=
(
pt_pad
->
m_Pos
.
x
-
Pcb
->
m_BoundaryBox
.
m_Pos
.
x
+
demi_pas
)
/
g_GridRoutingSize
;
if
(
c2
<
0
||
c2
>=
Ncols
)
{
msg
.
Printf
(
wxT
(
"erreur : col = %d ( padX %d pcbX %d) "
),
c2
,
pt_pad
->
m_Pos
.
x
,
Pcb
->
m_BoundaryBox
.
m_Pos
.
x
);
DisplayError
(
NULL
,
msg
);
return
(
0
);
}
SetWork
(
r1
,
c1
,
current_net_code
,
r2
,
c2
,
pt_ch
,
0
);
Ntotal
++
;
}
SortWork
();
return
(
Ntotal
);
int
ii
;
CHEVELU
*
pt_rats
=
pt_base_chevelu
;
D_PAD
*
pt_pad
;
int
r1
,
r2
,
c1
,
c2
,
current_net_code
;
CHEVELU
*
pt_ch
;
int
demi_pas
=
g_GridRoutingSize
/
2
;
wxString
msg
;
InitWork
();
/* clear work list */
Ntotal
=
0
;
for
(
ii
=
Pcb
->
GetNumRatsnests
();
ii
>
0
;
ii
--
,
pt_rats
++
)
{
/* On ne route que les chevelus actifs et routables */
if
(
(
pt_rats
->
status
&
CH_ACTIF
)
==
0
)
continue
;
if
(
pt_rats
->
status
&
CH_UNROUTABLE
)
continue
;
if
(
(
pt_rats
->
status
&
CH_ROUTE_REQ
)
==
0
)
continue
;
pt_pad
=
pt_rats
->
pad_start
;
current_net_code
=
pt_pad
->
m_NetCode
;
pt_ch
=
pt_rats
;
r1
=
(
pt_pad
->
m_Pos
.
y
-
Pcb
->
m_BoundaryBox
.
m_Pos
.
y
+
demi_pas
)
/
g_GridRoutingSize
;
if
(
r1
<
0
||
r1
>=
Nrows
)
{
msg
.
Printf
(
wxT
(
"erreur : row = %d ( padY %d pcbY %d) "
),
r1
,
pt_pad
->
m_Pos
.
y
,
Pcb
->
m_BoundaryBox
.
m_Pos
.
y
);
DisplayError
(
NULL
,
msg
);
return
0
;
}
c1
=
(
pt_pad
->
m_Pos
.
x
-
Pcb
->
m_BoundaryBox
.
m_Pos
.
x
+
demi_pas
)
/
g_GridRoutingSize
;
if
(
c1
<
0
||
c1
>=
Ncols
)
{
msg
.
Printf
(
wxT
(
"erreur : col = %d ( padX %d pcbX %d) "
),
c1
,
pt_pad
->
m_Pos
.
x
,
Pcb
->
m_BoundaryBox
.
m_Pos
.
x
);
DisplayError
(
NULL
,
msg
);
return
0
;
}
pt_pad
=
pt_rats
->
pad_end
;
r2
=
(
pt_pad
->
m_Pos
.
y
-
Pcb
->
m_BoundaryBox
.
m_Pos
.
y
+
demi_pas
)
/
g_GridRoutingSize
;
if
(
r2
<
0
||
r2
>=
Nrows
)
{
msg
.
Printf
(
wxT
(
"erreur : row = %d ( padY %d pcbY %d) "
),
r2
,
pt_pad
->
m_Pos
.
y
,
Pcb
->
m_BoundaryBox
.
m_Pos
.
y
);
DisplayError
(
NULL
,
msg
);
return
0
;
}
c2
=
(
pt_pad
->
m_Pos
.
x
-
Pcb
->
m_BoundaryBox
.
m_Pos
.
x
+
demi_pas
)
/
g_GridRoutingSize
;
if
(
c2
<
0
||
c2
>=
Ncols
)
{
msg
.
Printf
(
wxT
(
"erreur : col = %d ( padX %d pcbX %d) "
),
c2
,
pt_pad
->
m_Pos
.
x
,
Pcb
->
m_BoundaryBox
.
m_Pos
.
x
);
DisplayError
(
NULL
,
msg
);
return
0
;
}
SetWork
(
r1
,
c1
,
current_net_code
,
r2
,
c2
,
pt_ch
,
0
);
Ntotal
++
;
}
SortWork
();
return
Ntotal
;
}
/*******************************************/
BoardCell
GetCell
(
int
row
,
int
col
,
int
side
)
BoardCell
GetCell
(
int
row
,
int
col
,
int
side
)
/*******************************************/
/* fetch board cell :
*/
/* fetch board cell :
*/
{
BoardCell
*
p
;
BoardCell
*
p
;
p
=
Board
.
m_BoardSide
[
side
];
return
(
p
[
row
*
Ncols
+
col
]
)
;
p
=
Board
.
m_BoardSide
[
side
];
return
p
[
row
*
Ncols
+
col
]
;
}
...
...
@@ -402,119 +423,118 @@ BoardCell *p;
/************************************************/
/* store board cell */
void
SetCell
(
int
row
,
int
col
,
int
side
,
BoardCell
x
)
void
SetCell
(
int
row
,
int
col
,
int
side
,
BoardCell
x
)
{
BoardCell
*
p
;
BoardCell
*
p
;
p
=
Board
.
m_BoardSide
[
side
];
p
[
row
*
Ncols
+
col
]
=
x
;
p
=
Board
.
m_BoardSide
[
side
];
p
[
row
*
Ncols
+
col
]
=
x
;
}
/******************************************/
/* void OrCell(int r,int c,int s,BoardCell x ) */
/******************************************/
/******************************************/
/* void OrCell(int r,int c,int s,BoardCell x ) */
/******************************************/
void
OrCell
(
int
r
,
int
c
,
int
s
,
BoardCell
x
)
void
OrCell
(
int
r
,
int
c
,
int
s
,
BoardCell
x
)
{
BoardCell
*
p
;
BoardCell
*
p
;
p
=
Board
.
m_BoardSide
[
s
];
p
[
r
*
Ncols
+
c
]
|=
x
;
p
=
Board
.
m_BoardSide
[
s
];
p
[
r
*
Ncols
+
c
]
|=
x
;
}
/******************************************/
/* void XorCell(int r,int c,int s,BoardCell x ) */
/******************************************/
void
XorCell
(
int
r
,
int
c
,
int
s
,
BoardCell
x
)
/******************************************/
/* void XorCell(int r,int c,int s,BoardCell x ) */
/******************************************/
void
XorCell
(
int
r
,
int
c
,
int
s
,
BoardCell
x
)
{
BoardCell
*
p
;
BoardCell
*
p
;
p
=
Board
.
m_BoardSide
[
s
];
p
[
r
*
Ncols
+
c
]
^=
x
;
p
=
Board
.
m_BoardSide
[
s
];
p
[
r
*
Ncols
+
c
]
^=
x
;
}
/************************************************/
/* void AndCell(int r,int c,int s,BoardCell x ) */
/************************************************/
/************************************************/
/* void AndCell(int r,int c,int s,BoardCell x ) */
/************************************************/
void
AndCell
(
int
r
,
int
c
,
int
s
,
BoardCell
x
)
void
AndCell
(
int
r
,
int
c
,
int
s
,
BoardCell
x
)
{
BoardCell
*
p
;
BoardCell
*
p
;
p
=
Board
.
m_BoardSide
[
s
];
p
[
r
*
Ncols
+
c
]
&=
x
;
p
=
Board
.
m_BoardSide
[
s
];
p
[
r
*
Ncols
+
c
]
&=
x
;
}
/************************************************/
/* void AddCell(int r,int c,int s,BoardCell x ) */
/************************************************/
void
AddCell
(
int
r
,
int
c
,
int
s
,
BoardCell
x
)
/************************************************/
/* void AddCell(int r,int c,int s,BoardCell x ) */
/************************************************/
void
AddCell
(
int
r
,
int
c
,
int
s
,
BoardCell
x
)
{
BoardCell
*
p
;
BoardCell
*
p
;
p
=
Board
.
m_BoardSide
[
s
];
p
[
r
*
Ncols
+
c
]
+=
x
;
p
=
Board
.
m_BoardSide
[
s
];
p
[
r
*
Ncols
+
c
]
+=
x
;
}
/****************************************/
/* DistCell GetDist(int r,int c,int s ) */
/****************************************/
/****************************************/
/* DistCell GetDist(int r,int c,int s ) */
/****************************************/
/* fetch distance cell */
DistCell
GetDist
(
int
r
,
int
c
,
int
s
)
/* fetch distance cell */
DistCell
GetDist
(
int
r
,
int
c
,
int
s
)
/* fetch distance cell */
{
DistCell
*
p
;
DistCell
*
p
;
p
=
Board
.
m_DistSide
[
s
];
return
(
p
[
r
*
Ncols
+
c
]
)
;
p
=
Board
.
m_DistSide
[
s
];
return
p
[
r
*
Ncols
+
c
]
;
}
/***********************************************/
/* void SetDist(int r,int c,int s,DistCell x ) */
/***********************************************/
/***********************************************/
/* void SetDist(int r,int c,int s,DistCell x ) */
/***********************************************/
/* store distance cell */
void
SetDist
(
int
r
,
int
c
,
int
s
,
DistCell
x
)
void
SetDist
(
int
r
,
int
c
,
int
s
,
DistCell
x
)
{
DistCell
*
p
;
DistCell
*
p
;
p
=
Board
.
m_DistSide
[
s
];
p
[
r
*
Ncols
+
c
]
=
x
;
p
=
Board
.
m_DistSide
[
s
];
p
[
r
*
Ncols
+
c
]
=
x
;
}
/**********************************/
/* int GetDir(int r,int c,int s ) */
/**********************************/
/**********************************/
/* int GetDir(int r,int c,int s ) */
/**********************************/
/* fetch direction cell */
int
GetDir
(
int
r
,
int
c
,
int
s
)
int
GetDir
(
int
r
,
int
c
,
int
s
)
{
char
*
p
;
char
*
p
;
p
=
Board
.
m_DirSide
[
s
];
return
(
(
int
)(
p
[
r
*
Ncols
+
c
])
);
p
=
Board
.
m_DirSide
[
s
];
return
(
int
)
(
p
[
r
*
Ncols
+
c
]
);
}
/*****************************************/
/* void SetDir(int r,int c,int s,int x ) */
/*****************************************/
/*****************************************/
/* void SetDir(int r,int c,int s,int x ) */
/*****************************************/
/* store direction cell */
void
SetDir
(
int
r
,
int
c
,
int
s
,
int
x
)
void
SetDir
(
int
r
,
int
c
,
int
s
,
int
x
)
{
char
*
p
;
char
*
p
;
p
=
Board
.
m_DirSide
[
s
];
p
[
r
*
Ncols
+
c
]
=
(
char
)
x
;
p
=
Board
.
m_DirSide
[
s
];
p
[
r
*
Ncols
+
c
]
=
(
char
)
x
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment