Commit 709be495 authored by dickelbeck's avatar dickelbeck
Browse files

more amazing free specctra work

parent 10ded82d
Loading
Loading
Loading
Loading
+20 −10
Original line number Original line Diff line number Diff line
@@ -5,6 +5,15 @@ Started 2007-June-11
Please add newer entries at the top, list the date and your name with
Please add newer entries at the top, list the date and your name with
email address.
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
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.
    ** 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.
    ** 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>
2008-Feb-12 UPDATE Igor Plyatov <plyatov@mail.ru>
================================================================================
================================================================================
+eeschema
+eeschema
@@ -26,6 +35,7 @@ email address.
+all
+all
    Russian translation update.
    Russian translation update.



2008-Feb-11 UPDATE   Dick Hollenbeck <dick@softplc.com>
2008-Feb-11 UPDATE   Dick Hollenbeck <dick@softplc.com>
================================================================================
================================================================================
+pcbnew
+pcbnew
+48 −47
Original line number Original line Diff line number Diff line
@@ -213,6 +213,7 @@ wxString BOARD_ITEM::MenuText( const BOARD* aPcb ) const
            {
            {
                text << wxT( " [" ) << net->m_Netname << wxT( "]" );
                text << wxT( " [" ) << net->m_Netname << wxT( "]" );
            }
            }
            text << wxChar(' ') << _("Net:") << via->GetNet();


            if( shape != VIA_THROUGH )
            if( shape != VIA_THROUGH )
            {
            {
+108 −46
Original line number Original line Diff line number Diff line
@@ -76,6 +76,7 @@ namespace DSN {


//-----<SPECCTRA_DB>-------------------------------------------------
//-----<SPECCTRA_DB>-------------------------------------------------


#if !defined(STANDALONE)


void SPECCTRA_DB::buildLayerMaps( BOARD* aBoard )
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 ) ) );
        layerIds.push_back( CONV_TO_UTF8( aBoard->GetLayerName( kilayer ) ) );
    }
    }
}
}
#endif




int SPECCTRA_DB::findLayerName( const std::string& aLayerName ) const
int SPECCTRA_DB::findLayerName( const std::string& aLayerName ) const
@@ -183,13 +185,21 @@ void SPECCTRA_DB::needRIGHT() throw( IOError )
        expecting( T_RIGHT );
        expecting( T_RIGHT );
}
}


void SPECCTRA_DB::needSYMBOL() throw( IOError )
DSN_T SPECCTRA_DB::needSYMBOL() throw( IOError )
{
{
    DSN_T tok = nextTok();
    DSN_T tok = nextTok();
    if( !isSymbol( tok ) )
    if( !isSymbol( tok ) )
        expecting( T_SYMBOL );
        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 )
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 )
void SPECCTRA_DB::doPARSER( PARSER* growth ) throw( IOError )
{
{
    DSN_T       tok;
    DSN_T       tok;
    std::string const1;
    std::string const2;


    /*  <parser_descriptor >::=
    /*  <parser_descriptor >::=
        (parser
        (parser
@@ -519,17 +531,19 @@ void SPECCTRA_DB::doPARSER( PARSER* growth ) throw( IOError )
            break;
            break;


        case T_host_version:
        case T_host_version:
            needSYMBOL();
            needSYMBOLorNUMBER();
            growth->host_version = lexer->CurText();
            growth->host_version = lexer->CurText();
            needRIGHT();
            needRIGHT();
            break;
            break;


        case T_constant:
        case T_constant:
            needSYMBOL();
            needSYMBOLorNUMBER();
            growth->const_id1 = lexer->CurText();
            const1 = lexer->CurText();
            needSYMBOL();
            needSYMBOLorNUMBER();
            growth->const_id2 = lexer->CurText();
            const2 = lexer->CurText();
            needRIGHT();
            needRIGHT();
            growth->constants.push_back( const1 );
            growth->constants.push_back( const2 );
            break;
            break;


        case T_write_resolution:   // [(writee_resolution {<character> <positive_integer >})]
        case T_write_resolution:   // [(writee_resolution {<character> <positive_integer >})]
@@ -710,6 +724,8 @@ void SPECCTRA_DB::doSTRUCTURE( STRUCTURE* growth ) throw(IOError)
            break;
            break;


        case T_layer_noise_weight:
        case T_layer_noise_weight:
            if( growth->layer_noise_weight )
                unexpected( tok );
            growth->layer_noise_weight = new LAYER_NOISE_WEIGHT( growth );
            growth->layer_noise_weight = new LAYER_NOISE_WEIGHT( growth );
            doLAYER_NOISE_WEIGHT( growth->layer_noise_weight );
            doLAYER_NOISE_WEIGHT( growth->layer_noise_weight );
            break;
            break;
@@ -755,11 +771,15 @@ L_place:
            break;
            break;


        case T_via:
        case T_via:
            if( growth->via )
                unexpected( tok );
            growth->via = new VIA( growth );
            growth->via = new VIA( growth );
            doVIA( growth->via );
            doVIA( growth->via );
            break;
            break;


        case T_control:
        case T_control:
            if( growth->control )
                unexpected( tok );
            growth->control = new CONTROL( growth );
            growth->control = new CONTROL( growth );
            doCONTROL( growth->control );
            doCONTROL( growth->control );
            break;
            break;
@@ -772,11 +792,15 @@ L_place:
            break;
            break;


        case T_rule:
        case T_rule:
            if( growth->rules )
                unexpected( tok );
            growth->rules = new RULE( growth, T_rule );
            growth->rules = new RULE( growth, T_rule );
            doRULE( growth->rules );
            doRULE( growth->rules );
            break;
            break;


        case T_place_rule:
        case T_place_rule:
            if( growth->place_rules )
                unexpected( tok );
            growth->place_rules = new RULE( growth, T_place_rule );
            growth->place_rules = new RULE( growth, T_place_rule );
            doRULE( growth->place_rules );
            doRULE( growth->place_rules );
            break;
            break;
@@ -2219,7 +2243,8 @@ void SPECCTRA_DB::doPIN( PIN* growth ) throw( IOError )


    growth->padstack_id = lexer->CurText();
    growth->padstack_id = lexer->CurText();


    tok = nextTok();
    while( (tok = nextTok()) != T_RIGHT )
    {
        if( tok == T_LEFT )
        if( tok == T_LEFT )
        {
        {
            tok = nextTok();
            tok = nextTok();
@@ -2230,9 +2255,9 @@ void SPECCTRA_DB::doPIN( PIN* growth ) throw( IOError )
                expecting( T_NUMBER );
                expecting( T_NUMBER );
            growth->SetRotation( strtod( lexer->CurText(), 0 ) );
            growth->SetRotation( strtod( lexer->CurText(), 0 ) );
            needRIGHT();
            needRIGHT();
        tok = nextTok();
        }
        }

        else
        {
            if( !isSymbol(tok) && tok!=T_NUMBER )
            if( !isSymbol(tok) && tok!=T_NUMBER )
                expecting( "pin_id" );
                expecting( "pin_id" );


@@ -2245,9 +2270,8 @@ void SPECCTRA_DB::doPIN( PIN* growth ) throw( IOError )
            if( nextTok() != T_NUMBER )
            if( nextTok() != T_NUMBER )
                expecting( T_NUMBER );
                expecting( T_NUMBER );
            growth->vertex.y = strtod( lexer->CurText(), 0 );
            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:
        case T_padstack:
            PADSTACK* padstack;
            PADSTACK* padstack;
            padstack = new PADSTACK( growth );
            padstack = new PADSTACK();
            growth->padstacks.push_back( padstack );
            growth->AddPadstack( padstack );
            doPADSTACK( padstack );
            doPADSTACK( padstack );
            break;
            break;


@@ -2308,6 +2332,7 @@ void SPECCTRA_DB::doLIBRARY( LIBRARY* growth ) throw( IOError )
void SPECCTRA_DB::doNET( NET* growth ) throw( IOError )
void SPECCTRA_DB::doNET( NET* growth ) throw( IOError )
{
{
    DSN_T       tok = nextTok();
    DSN_T       tok = nextTok();
    PIN_REFS*   pin_refs;


    /*  <net_descriptor >::=
    /*  <net_descriptor >::=
        (net <net_id >
        (net <net_id >
@@ -2358,14 +2383,38 @@ void SPECCTRA_DB::doNET( NET* growth ) throw( IOError )
        case T_pins:
        case T_pins:
        case T_order:
        case T_order:
            growth->pins_type = tok;
            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 );
                PIN_REF     empty( growth );
                while( (tok = nextTok()) != T_RIGHT )
                while( (tok = nextTok()) != T_RIGHT )
                {
                {
                    // copy the empty one, then fill its copy later thru pin_ref.
                    // 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 );
                    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 )
    if( strlen(wrapee)==0 )
        return quote_char;
        return quote_char;


    bool    isNumber = true;
//    bool    isNumber = true;


    for(  ; *wrapee;  ++wrapee )
    for(  ; *wrapee;  ++wrapee )
    {
    {
@@ -3444,12 +3493,12 @@ const char* OUTPUTFORMATTER::GetQuoteChar( const char* wrapee, const char* quote
        if( strchr( quoteThese, *wrapee ) )
        if( strchr( quoteThese, *wrapee ) )
            return quote_char;
            return quote_char;


        if( !strchr( "01234567890.-+", *wrapee ) )
//        if( !strchr( "01234567890.-+", *wrapee ) )
            isNumber = false;
//            isNumber = false;
    }
    }


    if( isNumber )
//    if( isNumber )
        return quote_char;
//        return quote_char;


    return "";      // can use an unwrapped string.
    return "";      // can use an unwrapped string.
}
}
@@ -3670,6 +3719,11 @@ int ELEM_HOLDER::FindElem( DSN_T aType, int instanceNum )
    return -1;
    return -1;
}
}



// a reasonably small memory price to pay for improved performance
STRINGFORMATTER  ELEM::sf;


//-----<UNIT_RES>---------------------------------------------------------
//-----<UNIT_RES>---------------------------------------------------------


UNIT_RES UNIT_RES::Default( NULL, T_resolution );
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 )
int PADSTACK::Compare( PADSTACK* lhs, PADSTACK* rhs )
{
{
    // printf( "PADSTACK::Compare( %p, %p)\n", lhs, rhs );

    if( !lhs->hash.size() )
    if( !lhs->hash.size() )
        lhs->hash = lhs->makeHash();
        lhs->hash = lhs->makeHash();


@@ -3725,7 +3781,6 @@ int COMPONENT::Compare( COMPONENT* lhs, COMPONENT* rhs )
*/
*/


//-----<PARSER>-----------------------------------------------------------
//-----<PARSER>-----------------------------------------------------------

PARSER::PARSER( ELEM* aParent ) :
PARSER::PARSER( ELEM* aParent ) :
    ELEM( T_parser, 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_cad \"%s\")\n", host_cad.c_str() );
    out->Print( nestLevel, "(host_version \"%s\")\n", host_version.c_str() );
    out->Print( nestLevel, "(host_version \"%s\")\n", host_version.c_str() );


    if( const_id1.length()>0 || const_id2.length()>0 )
    for( STRINGS::iterator i=constants.begin();  i!=constants.end();  )
        out->Print( nestLevel, "(constant %c%s%c %c%s%c)\n",
    {
            string_quote, const_id1.c_str(), string_quote,
        const std::string& s1 = *i++;
            string_quote, const_id2.c_str(), string_quote );
        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 )
    if( routes_include_testpoint || routes_include_guides || routes_include_image_conductor )
        out->Print( nestLevel, "(routes_include%s%s%s)\n",
        out->Print( nestLevel, "(routes_include%s%s%s)\n",
+94 −19
Original line number Original line Diff line number Diff line
@@ -29,6 +29,10 @@
//  see http://www.boost.org/libs/ptr_container/doc/ptr_sequence_adapter.html
//  see http://www.boost.org/libs/ptr_container/doc/ptr_sequence_adapter.html
#include <boost/ptr_container/ptr_vector.hpp>
#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 "fctsys.h"
#include "dsn.h"
#include "dsn.h"


@@ -303,14 +307,16 @@ protected:
     */
     */
    std::string makeHash()
    std::string makeHash()
    {
    {
        STRINGFORMATTER sf;
        sf.Clear();

        FormatContents( &sf, 0 );
        FormatContents( &sf, 0 );
        sf.StripUseless();
        sf.StripUseless();


        return sf.GetString();
        return sf.GetString();
    }
    }


    // avoid creating this for every compare, make static.
    static STRINGFORMATTER  sf;



public:
public:


@@ -466,8 +472,8 @@ class PARSER : public ELEM
    bool        via_rotate_first;
    bool        via_rotate_first;
    bool        generated_by_freeroute;
    bool        generated_by_freeroute;


    std::string const_id1;
    /// This holds pairs of strings, one pair for each constant definition
    std::string const_id2;
    STRINGS     constants;


    std::string host_cad;
    std::string host_cad;
    std::string host_version;
    std::string host_version;
@@ -1924,12 +1930,16 @@ class PIN : public ELEM
    std::string     pin_id;
    std::string     pin_id;
    POINT           vertex;
    POINT           vertex;


    int             kiNetCode;      ///< kicad netcode


public:
public:
    PIN( ELEM* aParent ) :
    PIN( ELEM* aParent ) :
        ELEM( T_pin, aParent )
        ELEM( T_pin, aParent )
    {
    {
        rotation = 0.0;
        rotation = 0.0;
        isRotated = false;
        isRotated = false;
        kiNetCode = 0;
    }
    }


    void SetRotation( double aRotation )
    void SetRotation( double aRotation )
@@ -1960,6 +1970,8 @@ public:
                   vertex.x, vertex.y );
                   vertex.x, vertex.y );
    }
    }
};
};
typedef boost::ptr_vector<PIN>  PINS;



class LIBRARY;
class LIBRARY;
class IMAGE : public ELEM_HOLDER
class IMAGE : public ELEM_HOLDER
@@ -1978,7 +1990,6 @@ class IMAGE : public ELEM_HOLDER
        the kids list.
        the kids list.
    */
    */


    typedef boost::ptr_vector<PIN>  PINS;
    PINS            pins;
    PINS            pins;


    RULE*           rules;
    RULE*           rules;
@@ -2085,7 +2096,7 @@ typedef boost::ptr_vector<IMAGE> IMAGES;
 * Class PADSTACK
 * Class PADSTACK
 * holds either a via or a pad definition.
 * 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;
    friend class SPECCTRA_DB;


@@ -2105,8 +2116,14 @@ class PADSTACK : public ELEM_HOLDER


public:
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;
        unit = 0;
        rotate = T_on;
        rotate = T_on;
@@ -2131,6 +2148,7 @@ public:
     */
     */
    static int Compare( PADSTACK* lhs, PADSTACK* rhs );
    static int Compare( PADSTACK* lhs, PADSTACK* rhs );



    void SetPadstackId( const char* aPadstackId )
    void SetPadstackId( const char* aPadstackId )
    {
    {
        padstack_id = aPadstackId;
        padstack_id = aPadstackId;
@@ -2194,6 +2212,15 @@ public:
};
};
typedef boost::ptr_vector<PADSTACK> PADSTACKS;
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
 * Class LIBRARY
@@ -2228,6 +2255,7 @@ public:


    void AddPadstack( PADSTACK* aPadstack )
    void AddPadstack( PADSTACK* aPadstack )
    {
    {
        aPadstack->SetParent( this );
        padstacks.push_back( aPadstack );
        padstacks.push_back( aPadstack );
    }
    }


@@ -2537,10 +2565,15 @@ class NET : public ELEM
    bool            unassigned;
    bool            unassigned;
    int             net_number;
    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        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           type;           ///< T_fix | T_normal


    DSN_T           supply;         ///< T_power | T_ground
    DSN_T           supply;         ///< T_power | T_ground
@@ -3525,6 +3558,9 @@ public:
};
};




typedef boost::ptr_set<PADSTACK>    PADSTACKSET;


/**
/**
 * Class SPECCTRA_DB
 * Class SPECCTRA_DB
 * holds a DSN data tree, usually coming from a DSN file.
 * 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[];
    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
     * Function buildLayerMaps
     * creates a few data translation structures for layer name and number
     * 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
     * calls nextTok() and then verifies that the token read in
     * satisfies bool isSymbol().
     * satisfies bool isSymbol().
     * If not, an IOError is thrown.
     * If not, an IOError is thrown.
     * @return DSN_T - the actual token read in.
     * @throw IOError, if the next token does not satisfy isSymbol()
     * @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
     * Function readCOMPnPIN
@@ -3718,28 +3771,35 @@ class SPECCTRA_DB : public OUTPUTFORMATTER
    /**
    /**
     * Function makeIMAGE
     * Function makeIMAGE
     * allocates an IMAGE on the heap and creates all the PINs according
     * 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
     * Function makePADSTACK
     * makes all the PADSTACKs, and marks each D_PAD with the index into the
     * creates a PADSTACK which matches the given pad.  Only pads which do not
     * LIBRARY::padstacks list that it matches.
     * 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
     * Function makeVia
     * makes a round through hole PADSTACK using the given Kicad diameter in deci-mils.
     * makes a round through hole PADSTACK using the given Kicad diameter in deci-mils.
     * @param aCopperDiameter The diameter of the copper pad.
     * @param aCopperDiameter The diameter of the copper pad.
     * @param aDrillDiameter The drill diameter, used on re-import of the session file.
     * @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
     * @return PADSTACK* - The padstack, which is on the heap only, user must save
     *  or delete it.
     *  or delete it.
     */
     */
    PADSTACK* makeVia( int aCopperDiameter, int aDrillDiameter );
    PADSTACK* makeVia( int aCopperDiameter, int aDrillDiameter,
                               int aTopLayer, int aBotLayer );


    /**
    /**
     * Function makeVia
     * Function makeVia
@@ -3751,6 +3811,19 @@ class SPECCTRA_DB : public OUTPUTFORMATTER
    PADSTACK* makeVia( const SEGVIA* aVia );
    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>-----------------------------------------------------
    //-----<FromSESSION>-----------------------------------------------------


    /**
    /**
@@ -3786,6 +3859,8 @@ public:
        delete pcb;
        delete pcb;
        delete session;
        delete session;


        deleteNETs();

        if( fp )
        if( fp )
            fclose( fp );
            fclose( fp );
    }
    }