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
709be495
Commit
709be495
authored
Feb 14, 2008
by
dickelbeck
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
more amazing free specctra work
parent
10ded82d
Changes
5
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
657 additions
and
525 deletions
+657
-525
change_log.txt
change_log.txt
+20
-10
class_board_item.cpp
pcbnew/class_board_item.cpp
+48
-47
specctra.cpp
pcbnew/specctra.cpp
+108
-46
specctra.h
pcbnew/specctra.h
+94
-19
specctra_export.cpp
pcbnew/specctra_export.cpp
+387
-403
No files found.
change_log.txt
View file @
709be495
...
...
@@ -5,6 +5,15 @@ Started 2007-June-11
Please add newer entries at the top, list the date and your name with
email address.
2008-Feb-13 UPDATE Dick Hollenbeck <dick@softplc.com>
================================================================================
+pcbnew
specctra export: now generate unique pin names from module padnames in the
case where there are non-unique pad names within a module. Tested with
Electra demo, and *.dsn files load OK in there as well as in freerouter.
Stopped using reserved layer name "signal" and instead output a full
padstack consisting of all pertinent layers for via, pads, and keepouts.
2008-Feb-12 UPDATE Tim Hanson sideskate@gmail.com
================================================================================
...
...
@@ -18,7 +27,7 @@ email address.
** GetScreen is virtual, as some of the dialogs keep around a WinEDA_BaseScreen pointer.
** all sub-sheets in a given schematic must have different names to generate a meaningful netlist.
=======
2008-Feb-12 UPDATE Igor Plyatov <plyatov@mail.ru>
================================================================================
+eeschema
...
...
@@ -26,6 +35,7 @@ email address.
+all
Russian translation update.
2008-Feb-11 UPDATE Dick Hollenbeck <dick@softplc.com>
================================================================================
+pcbnew
...
...
pcbnew/class_board_item.cpp
View file @
709be495
...
...
@@ -213,6 +213,7 @@ wxString BOARD_ITEM::MenuText( const BOARD* aPcb ) const
{
text
<<
wxT
(
" ["
)
<<
net
->
m_Netname
<<
wxT
(
"]"
);
}
text
<<
wxChar
(
' '
)
<<
_
(
"Net:"
)
<<
via
->
GetNet
();
if
(
shape
!=
VIA_THROUGH
)
{
...
...
pcbnew/specctra.cpp
View file @
709be495
...
...
@@ -76,6 +76,7 @@ namespace DSN {
//-----<SPECCTRA_DB>-------------------------------------------------
#if !defined(STANDALONE)
void
SPECCTRA_DB
::
buildLayerMaps
(
BOARD
*
aBoard
)
{
...
...
@@ -100,6 +101,7 @@ void SPECCTRA_DB::buildLayerMaps( BOARD* aBoard )
layerIds
.
push_back
(
CONV_TO_UTF8
(
aBoard
->
GetLayerName
(
kilayer
)
)
);
}
}
#endif
int
SPECCTRA_DB
::
findLayerName
(
const
std
::
string
&
aLayerName
)
const
...
...
@@ -183,13 +185,21 @@ void SPECCTRA_DB::needRIGHT() throw( IOError )
expecting
(
T_RIGHT
);
}
void
SPECCTRA_DB
::
needSYMBOL
()
throw
(
IOError
)
DSN_T
SPECCTRA_DB
::
needSYMBOL
()
throw
(
IOError
)
{
DSN_T
tok
=
nextTok
();
if
(
!
isSymbol
(
tok
)
)
expecting
(
T_SYMBOL
);
return
tok
;
}
DSN_T
SPECCTRA_DB
::
needSYMBOLorNUMBER
()
throw
(
IOError
)
{
DSN_T
tok
=
nextTok
();
if
(
!
isSymbol
(
tok
)
&&
tok
!=
T_NUMBER
)
expecting
(
"symbol|number"
);
return
tok
;
}
void
SPECCTRA_DB
::
readCOMPnPIN
(
std
::
string
*
component_id
,
std
::
string
*
pin_id
)
throw
(
IOError
)
{
...
...
@@ -468,6 +478,8 @@ void SPECCTRA_DB::doPCB( PCB* growth ) throw( IOError )
void
SPECCTRA_DB
::
doPARSER
(
PARSER
*
growth
)
throw
(
IOError
)
{
DSN_T
tok
;
std
::
string
const1
;
std
::
string
const2
;
/* <parser_descriptor >::=
(parser
...
...
@@ -519,17 +531,19 @@ void SPECCTRA_DB::doPARSER( PARSER* growth ) throw( IOError )
break
;
case
T_host_version
:
needSYMBOL
();
needSYMBOL
orNUMBER
();
growth
->
host_version
=
lexer
->
CurText
();
needRIGHT
();
break
;
case
T_constant
:
needSYMBOL
();
growth
->
const_id
1
=
lexer
->
CurText
();
needSYMBOL
();
growth
->
const_id
2
=
lexer
->
CurText
();
needSYMBOL
orNUMBER
();
const
1
=
lexer
->
CurText
();
needSYMBOL
orNUMBER
();
const
2
=
lexer
->
CurText
();
needRIGHT
();
growth
->
constants
.
push_back
(
const1
);
growth
->
constants
.
push_back
(
const2
);
break
;
case
T_write_resolution
:
// [(writee_resolution {<character> <positive_integer >})]
...
...
@@ -710,6 +724,8 @@ void SPECCTRA_DB::doSTRUCTURE( STRUCTURE* growth ) throw(IOError)
break
;
case
T_layer_noise_weight
:
if
(
growth
->
layer_noise_weight
)
unexpected
(
tok
);
growth
->
layer_noise_weight
=
new
LAYER_NOISE_WEIGHT
(
growth
);
doLAYER_NOISE_WEIGHT
(
growth
->
layer_noise_weight
);
break
;
...
...
@@ -755,11 +771,15 @@ L_place:
break
;
case
T_via
:
if
(
growth
->
via
)
unexpected
(
tok
);
growth
->
via
=
new
VIA
(
growth
);
doVIA
(
growth
->
via
);
break
;
case
T_control
:
if
(
growth
->
control
)
unexpected
(
tok
);
growth
->
control
=
new
CONTROL
(
growth
);
doCONTROL
(
growth
->
control
);
break
;
...
...
@@ -772,11 +792,15 @@ L_place:
break
;
case
T_rule
:
if
(
growth
->
rules
)
unexpected
(
tok
);
growth
->
rules
=
new
RULE
(
growth
,
T_rule
);
doRULE
(
growth
->
rules
);
break
;
case
T_place_rule
:
if
(
growth
->
place_rules
)
unexpected
(
tok
);
growth
->
place_rules
=
new
RULE
(
growth
,
T_place_rule
);
doRULE
(
growth
->
place_rules
);
break
;
...
...
@@ -2219,7 +2243,8 @@ void SPECCTRA_DB::doPIN( PIN* growth ) throw( IOError )
growth
->
padstack_id
=
lexer
->
CurText
();
tok
=
nextTok
();
while
(
(
tok
=
nextTok
())
!=
T_RIGHT
)
{
if
(
tok
==
T_LEFT
)
{
tok
=
nextTok
();
...
...
@@ -2230,9 +2255,9 @@ void SPECCTRA_DB::doPIN( PIN* growth ) throw( IOError )
expecting
(
T_NUMBER
);
growth
->
SetRotation
(
strtod
(
lexer
->
CurText
(),
0
)
);
needRIGHT
();
tok
=
nextTok
();
}
else
{
if
(
!
isSymbol
(
tok
)
&&
tok
!=
T_NUMBER
)
expecting
(
"pin_id"
);
...
...
@@ -2245,9 +2270,8 @@ void SPECCTRA_DB::doPIN( PIN* growth ) throw( IOError )
if
(
nextTok
()
!=
T_NUMBER
)
expecting
(
T_NUMBER
);
growth
->
vertex
.
y
=
strtod
(
lexer
->
CurText
(),
0
);
if
(
nextTok
()
!=
T_RIGHT
)
unexpected
(
lexer
->
CurText
()
);
}
}
}
...
...
@@ -2286,8 +2310,8 @@ void SPECCTRA_DB::doLIBRARY( LIBRARY* growth ) throw( IOError )
case
T_padstack
:
PADSTACK
*
padstack
;
padstack
=
new
PADSTACK
(
growth
);
growth
->
padstacks
.
push_b
ack
(
padstack
);
padstack
=
new
PADSTACK
();
growth
->
AddPadst
ack
(
padstack
);
doPADSTACK
(
padstack
);
break
;
...
...
@@ -2308,6 +2332,7 @@ void SPECCTRA_DB::doLIBRARY( LIBRARY* growth ) throw( IOError )
void
SPECCTRA_DB
::
doNET
(
NET
*
growth
)
throw
(
IOError
)
{
DSN_T
tok
=
nextTok
();
PIN_REFS
*
pin_refs
;
/* <net_descriptor >::=
(net <net_id >
...
...
@@ -2358,14 +2383,38 @@ void SPECCTRA_DB::doNET( NET* growth ) throw( IOError )
case
T_pins
:
case
T_order
:
growth
->
pins_type
=
tok
;
pin_refs
=
&
growth
->
pins
;
goto
L_pins
;
case
T_expose
:
pin_refs
=
&
growth
->
expose
;
goto
L_pins
;
case
T_noexpose
:
pin_refs
=
&
growth
->
noexpose
;
goto
L_pins
;
case
T_source
:
pin_refs
=
&
growth
->
source
;
goto
L_pins
;
case
T_load
:
pin_refs
=
&
growth
->
load
;
goto
L_pins
;
case
T_terminator
:
pin_refs
=
&
growth
->
terminator
;
//goto L_pins;
L_pins
:
{
PIN_REF
empty
(
growth
);
while
(
(
tok
=
nextTok
())
!=
T_RIGHT
)
{
// copy the empty one, then fill its copy later thru pin_ref.
growth
->
pins
.
push_back
(
empty
);
pin_refs
->
push_back
(
empty
);
PIN_REF
*
pin_ref
=
&
growth
->
pins
.
back
();
PIN_REF
*
pin_ref
=
&
pin_refs
->
back
();
readCOMPnPIN
(
&
pin_ref
->
component_id
,
&
pin_ref
->
pin_id
);
}
...
...
@@ -3431,7 +3480,7 @@ const char* OUTPUTFORMATTER::GetQuoteChar( const char* wrapee, const char* quote
if
(
strlen
(
wrapee
)
==
0
)
return
quote_char
;
bool
isNumber
=
true
;
//
bool isNumber = true;
for
(
;
*
wrapee
;
++
wrapee
)
{
...
...
@@ -3444,12 +3493,12 @@ const char* OUTPUTFORMATTER::GetQuoteChar( const char* wrapee, const char* quote
if
(
strchr
(
quoteThese
,
*
wrapee
)
)
return
quote_char
;
if
(
!
strchr
(
"01234567890.-+"
,
*
wrapee
)
)
isNumber
=
false
;
//
if( !strchr( "01234567890.-+", *wrapee ) )
//
isNumber = false;
}
if
(
isNumber
)
return
quote_char
;
//
if( isNumber )
//
return quote_char;
return
""
;
// can use an unwrapped string.
}
...
...
@@ -3670,6 +3719,11 @@ int ELEM_HOLDER::FindElem( DSN_T aType, int instanceNum )
return
-
1
;
}
// a reasonably small memory price to pay for improved performance
STRINGFORMATTER
ELEM
::
sf
;
//-----<UNIT_RES>---------------------------------------------------------
UNIT_RES
UNIT_RES
::
Default
(
NULL
,
T_resolution
);
...
...
@@ -3679,6 +3733,8 @@ UNIT_RES UNIT_RES::Default( NULL, T_resolution );
int
PADSTACK
::
Compare
(
PADSTACK
*
lhs
,
PADSTACK
*
rhs
)
{
// printf( "PADSTACK::Compare( %p, %p)\n", lhs, rhs );
if
(
!
lhs
->
hash
.
size
()
)
lhs
->
hash
=
lhs
->
makeHash
();
...
...
@@ -3725,7 +3781,6 @@ int COMPONENT::Compare( COMPONENT* lhs, COMPONENT* rhs )
*/
//-----<PARSER>-----------------------------------------------------------
PARSER
::
PARSER
(
ELEM
*
aParent
)
:
ELEM
(
T_parser
,
aParent
)
{
...
...
@@ -3752,10 +3807,17 @@ void PARSER::FormatContents( OUTPUTFORMATTER* out, int nestLevel ) throw( IOErro
out
->
Print
(
nestLevel
,
"(host_cad
\"
%s
\"
)
\n
"
,
host_cad
.
c_str
()
);
out
->
Print
(
nestLevel
,
"(host_version
\"
%s
\"
)
\n
"
,
host_version
.
c_str
()
);
if
(
const_id1
.
length
()
>
0
||
const_id2
.
length
()
>
0
)
out
->
Print
(
nestLevel
,
"(constant %c%s%c %c%s%c)
\n
"
,
string_quote
,
const_id1
.
c_str
(),
string_quote
,
string_quote
,
const_id2
.
c_str
(),
string_quote
);
for
(
STRINGS
::
iterator
i
=
constants
.
begin
();
i
!=
constants
.
end
();
)
{
const
std
::
string
&
s1
=
*
i
++
;
const
std
::
string
&
s2
=
*
i
++
;
const
char
*
q1
=
out
->
GetQuoteChar
(
s1
.
c_str
()
);
const
char
*
q2
=
out
->
GetQuoteChar
(
s2
.
c_str
()
);
out
->
Print
(
nestLevel
,
"(constant %s%s%s %s%s%s)
\n
"
,
q1
,
s1
.
c_str
(),
q1
,
q2
,
s2
.
c_str
(),
q2
);
}
if
(
routes_include_testpoint
||
routes_include_guides
||
routes_include_image_conductor
)
out
->
Print
(
nestLevel
,
"(routes_include%s%s%s)
\n
"
,
...
...
pcbnew/specctra.h
View file @
709be495
...
...
@@ -29,6 +29,10 @@
// see http://www.boost.org/libs/ptr_container/doc/ptr_sequence_adapter.html
#include <boost/ptr_container/ptr_vector.hpp>
// see http://www.boost.org/libs/ptr_container/doc/ptr_set.html
#include <boost/ptr_container/ptr_set.hpp>
#include <boost/noncopyable.hpp>
#include "fctsys.h"
#include "dsn.h"
...
...
@@ -303,14 +307,16 @@ protected:
*/
std
::
string
makeHash
()
{
STRINGFORMATTER
sf
;
sf
.
Clear
();
FormatContents
(
&
sf
,
0
);
sf
.
StripUseless
();
return
sf
.
GetString
();
}
// avoid creating this for every compare, make static.
static
STRINGFORMATTER
sf
;
public
:
...
...
@@ -466,8 +472,8 @@ class PARSER : public ELEM
bool
via_rotate_first
;
bool
generated_by_freeroute
;
std
::
string
const_id1
;
std
::
string
const_id2
;
/// This holds pairs of strings, one pair for each constant definition
STRINGS
constants
;
std
::
string
host_cad
;
std
::
string
host_version
;
...
...
@@ -1924,12 +1930,16 @@ class PIN : public ELEM
std
::
string
pin_id
;
POINT
vertex
;
int
kiNetCode
;
///< kicad netcode
public
:
PIN
(
ELEM
*
aParent
)
:
ELEM
(
T_pin
,
aParent
)
{
rotation
=
0
.
0
;
isRotated
=
false
;
kiNetCode
=
0
;
}
void
SetRotation
(
double
aRotation
)
...
...
@@ -1960,6 +1970,8 @@ public:
vertex
.
x
,
vertex
.
y
);
}
};
typedef
boost
::
ptr_vector
<
PIN
>
PINS
;
class
LIBRARY
;
class
IMAGE
:
public
ELEM_HOLDER
...
...
@@ -1978,7 +1990,6 @@ class IMAGE : public ELEM_HOLDER
the kids list.
*/
typedef
boost
::
ptr_vector
<
PIN
>
PINS
;
PINS
pins
;
RULE
*
rules
;
...
...
@@ -2085,7 +2096,7 @@ typedef boost::ptr_vector<IMAGE> IMAGES;
* Class PADSTACK
* holds either a via or a pad definition.
*/
class
PADSTACK
:
public
ELEM_HOLDER
class
PADSTACK
:
public
ELEM_HOLDER
,
private
boost
::
noncopyable
{
friend
class
SPECCTRA_DB
;
...
...
@@ -2105,8 +2116,14 @@ class PADSTACK : public ELEM_HOLDER
public
:
PADSTACK
(
ELEM
*
aParent
)
:
ELEM_HOLDER
(
T_padstack
,
aParent
)
/**
* Constructor PADSTACK()
* cannot take ELEM* aParent because PADSTACKSET confuses this with a
* copy constructor and causes havoc. Instead set parent with
* LIBRARY::AddPadstack()
*/
PADSTACK
()
:
ELEM_HOLDER
(
T_padstack
,
NULL
)
{
unit
=
0
;
rotate
=
T_on
;
...
...
@@ -2131,6 +2148,7 @@ public:
*/
static
int
Compare
(
PADSTACK
*
lhs
,
PADSTACK
*
rhs
);
void
SetPadstackId
(
const
char
*
aPadstackId
)
{
padstack_id
=
aPadstackId
;
...
...
@@ -2194,6 +2212,15 @@ public:
};
typedef
boost
::
ptr_vector
<
PADSTACK
>
PADSTACKS
;
/**
* Function operator<()
* is used by the PADSTACKSET boost::ptr_set below
*/
inline
bool
operator
<
(
const
PADSTACK
&
lhs
,
const
PADSTACK
&
rhs
)
{
return
PADSTACK
::
Compare
(
(
PADSTACK
*
)
&
lhs
,
(
PADSTACK
*
)
&
rhs
)
<
0
;
}
/**
* Class LIBRARY
...
...
@@ -2228,6 +2255,7 @@ public:
void
AddPadstack
(
PADSTACK
*
aPadstack
)
{
aPadstack
->
SetParent
(
this
);
padstacks
.
push_back
(
aPadstack
);
}
...
...
@@ -2537,10 +2565,15 @@ class NET : public ELEM
bool
unassigned
;
int
net_number
;
DSN_T
pins_type
;
///< T_pins | T_order
DSN_T
pins_type
;
///< T_pins | T_order, type of field 'pins' below
PIN_REFS
pins
;
PIN_REFS
expose
;
PIN_REFS
noexpose
;
PIN_REFS
source
;
PIN_REFS
load
;
PIN_REFS
terminator
;
DSN_T
type
;
///< T_fix | T_normal
DSN_T
supply
;
///< T_power | T_ground
...
...
@@ -3525,6 +3558,9 @@ public:
};
typedef
boost
::
ptr_set
<
PADSTACK
>
PADSTACKSET
;
/**
* Class SPECCTRA_DB
* holds a DSN data tree, usually coming from a DSN file.
...
...
@@ -3561,6 +3597,12 @@ class SPECCTRA_DB : public OUTPUTFORMATTER
static
const
KICAD_T
scanPADs
[];
PADSTACKSET
padstackset
;
/// we don't want ownership here permanently, so we don't use boost::ptr_vector
std
::
vector
<
NET
*>
nets
;
/**
* Function buildLayerMaps
* creates a few data translation structures for layer name and number
...
...
@@ -3612,9 +3654,20 @@ class SPECCTRA_DB : public OUTPUTFORMATTER
* calls nextTok() and then verifies that the token read in
* satisfies bool isSymbol().
* If not, an IOError is thrown.
* @return DSN_T - the actual token read in.
* @throw IOError, if the next token does not satisfy isSymbol()
*/
void
needSYMBOL
()
throw
(
IOError
);
DSN_T
needSYMBOL
()
throw
(
IOError
);
/**
* Function needSYMBOLorNUMBER
* calls nextTok() and then verifies that the token read in
* satisfies bool isSymbol() or tok==T_NUMBER.
* If not, an IOError is thrown.
* @return DSN_T - the actual token read in.
* @throw IOError, if the next token does not satisfy the above test
*/
DSN_T
needSYMBOLorNUMBER
()
throw
(
IOError
);
/**
* Function readCOMPnPIN
...
...
@@ -3718,28 +3771,35 @@ class SPECCTRA_DB : public OUTPUTFORMATTER
/**
* Function makeIMAGE
* allocates an IMAGE on the heap and creates all the PINs according
* to the PADs in the MODULE.
* to the D_PADs in the MODULE.
* @param aBoard The owner of the MODULE.
* @param aModule The MODULE from which to build the IMAGE.
* @return IMAGE* - not tested for duplication yet.
*/
IMAGE
*
makeIMAGE
(
MODULE
*
aModule
);
IMAGE
*
makeIMAGE
(
BOARD
*
aBoard
,
MODULE
*
aModule
);
/**
* Function makePADSTACKs
* makes all the PADSTACKs, and marks each D_PAD with the index into the
* LIBRARY::padstacks list that it matches.
* Function makePADSTACK
* creates a PADSTACK which matches the given pad. Only pads which do not
* satisfy the function isKeepout() should be passed to this function.
* @param aPad The D_PAD which needs to be made into a PADSTACK.
* @return PADSTACK* - The created padstack, including its padstack_id.
*/
void
makePADSTACKs
(
BOARD
*
aBoard
,
TYPE_COLLECTOR
&
aPads
);
PADSTACK
*
makePADSTACK
(
BOARD
*
aBoard
,
D_PAD
*
aPad
);
/**
* Function makeVia
* makes a round through hole PADSTACK using the given Kicad diameter in deci-mils.
* @param aCopperDiameter The diameter of the copper pad.
* @param aDrillDiameter The drill diameter, used on re-import of the session file.
* @param aTopLayer The DSN::PCB top most layer index.
* @param aBotLayer The DSN::PCB bottom most layer index.
* @return PADSTACK* - The padstack, which is on the heap only, user must save
* or delete it.
*/
PADSTACK
*
makeVia
(
int
aCopperDiameter
,
int
aDrillDiameter
);
PADSTACK
*
makeVia
(
int
aCopperDiameter
,
int
aDrillDiameter
,
int
aTopLayer
,
int
aBotLayer
);
/**
* Function makeVia
...
...
@@ -3751,6 +3811,19 @@ class SPECCTRA_DB : public OUTPUTFORMATTER
PADSTACK
*
makeVia
(
const
SEGVIA
*
aVia
);
/**
* Function deleteNETs
* deletes all the NETs that may be in here.
*/
void
deleteNETs
()
{
for
(
unsigned
n
=
0
;
n
<
nets
.
size
();
++
n
)
delete
nets
[
n
];
nets
.
clear
();
}
//-----<FromSESSION>-----------------------------------------------------
/**
...
...
@@ -3786,6 +3859,8 @@ public:
delete
pcb
;
delete
session
;
deleteNETs
();
if
(
fp
)
fclose
(
fp
);
}
...
...
pcbnew/specctra_export.cpp
View file @
709be495
This diff is collapsed.
Click to expand it.
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