KiCad PCB EDA Suite
netlist_reader.h
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2012 Jean-Pierre Charras.
5 * Copyright (C) 2013-2017 Wayne Stambaugh <[email protected]>.
6 * Copyright (C) 2012-2021 KiCad Developers, see AUTHORS.txt for contributors.
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, you may find one here:
20 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
21 * or you may search the http://www.gnu.org website for the version 2 license,
22 * or you may write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
24 */
25
26#ifndef NETLIST_READER_H
27#define NETLIST_READER_H
28
29#include <boost/ptr_container/ptr_vector.hpp>
30
31#include <macros.h>
32#include <lib_id.h>
33
34#include <netlist_lexer.h> // netlist_lexer is common to Eeschema and Pcbnew
35
36
37class NETLIST;
38class COMPONENT;
39
40
45{
46public:
52 CMP_READER( LINE_READER* aLineReader )
53 {
54 m_lineReader = aLineReader;
55 }
56
58 {
59 if( m_lineReader )
60 {
61 delete m_lineReader;
62 m_lineReader = nullptr;
63 }
64 }
65
92 bool Load( NETLIST* aNetlist );
93
94private:
96};
97
98
103{
104public:
105
107 {
112
113 // Add new types here. Don't forget to create the appropriate class derived from
114 // NETCLASS_READER and add the entry to the NETLIST_READER::GetNetlistReader()
115 // function.
116 };
117
124 NETLIST* aNetlist,
125 CMP_READER* aFootprintLinkReader = nullptr )
126 {
127 wxASSERT( aLineReader != nullptr );
128
129 m_lineReader = aLineReader;
130 m_footprintReader = aFootprintLinkReader;
131 m_netlist = aNetlist;
133 m_loadNets = true;
134 }
135
136 virtual ~NETLIST_READER();
137
145 static NETLIST_FILE_T GuessNetlistFileType( LINE_READER* aLineReader );
146
159 static NETLIST_READER* GetNetlistReader( NETLIST* aNetlist,
160 const wxString& aNetlistFileName,
161 const wxString& aCompFootprintFileName = wxEmptyString );
162
169 virtual void LoadNetlist() = 0;
170
171protected:
176
179};
180
181
189{
201 COMPONENT* loadComponent( char* aText );
202
222
231 void loadNet( char* aText, COMPONENT* aComponent );
232
233public:
234
236 NETLIST* aNetlist,
237 CMP_READER* aFootprintLinkReader = nullptr ) :
238 NETLIST_READER( aLineReader, aNetlist, aFootprintLinkReader )
239 {
240 }
241
262 virtual void LoadNetlist() override;
263};
264
265
269class KICAD_NETLIST_PARSER : public NETLIST_LEXER
270{
271public:
272 KICAD_NETLIST_PARSER( LINE_READER* aReader, NETLIST* aNetlist );
273
278 void Parse();
279
280 // Useful for debug only:
281 const char* getTokenName( NL_T::T aTok )
282 {
283 return NETLIST_LEXER::TokenName( aTok );
284 }
285
286private:
291 void skipCurrent();
292
303 void parseComponent();
304
314 void parseNet();
315
337 void parseLibPartList();
338
339 NL_T::T token;
342};
343
344
349{
350public:
352 NETLIST* aNetlist,
353 CMP_READER* aFootprintLinkReader = nullptr ) :
354 NETLIST_READER( aLineReader, aNetlist, aFootprintLinkReader )
355 { }
356
358 { }
359
360 virtual void LoadNetlist() override;
361};
362
363
364#endif // NETLIST_READER_H
Read a component footprint link file (*.cmp) format.
bool Load(NETLIST *aNetlist)
Read the *.cmp file format contains the component footprint assignments created by CvPcb into aNetlis...
LINE_READER * m_lineReader
The line reader to read.
CMP_READER(LINE_READER *aLineReader)
Store all of the related footprint information found in a netlist.
Definition: pcb_netlist.h:85
The parser for reading the KiCad s-expression netlist format.
KICAD_NETLIST_PARSER(LINE_READER *aReader, NETLIST *aNetlist)
void parseComponent()
Parse a component description: (comp (ref P1) (value DB25FEMELLE) (footprint DB25FC) (libsource (lib ...
void Parse()
Function Parse parse the full netlist.
void parseNet()
Parse a net section (net (code 20) (name /PC-A0) (node (ref BUS1) (pin 62)) (node (ref U3) (pin 3)) (...
NETLIST * m_netlist
The netlist to parse into. Not owned.
void parseLibPartList()
Read the section "libparts" in the netlist: (libparts (libpart (lib device) (part C) (description "Co...
LINE_READER * m_lineReader
The line reader used to parse the netlist. Not owned.
const char * getTokenName(NL_T::T aTok)
void skipCurrent()
Skip the current token level, i.e search for the RIGHT parenthesis which closes the current descripti...
Read the new s-expression based KiCad netlist format.
virtual void LoadNetlist() override
Load the contents of the netlist file into aNetlist.
KICAD_NETLIST_READER(LINE_READER *aLineReader, NETLIST *aNetlist, CMP_READER *aFootprintLinkReader=nullptr)
virtual ~KICAD_NETLIST_READER()
Read the KiCad legacy and the old Orcad netlist formats.
LEGACY_NETLIST_READER(LINE_READER *aLineReader, NETLIST *aNetlist, CMP_READER *aFootprintLinkReader=nullptr)
COMPONENT * loadComponent(char *aText)
Read the aLine containing the description of a component from a legacy format netlist and add it to t...
void loadFootprintFilters()
Load the footprint filter section of netlist file.
void loadNet(char *aText, COMPONENT *aComponent)
Function loadNet read a component net description from aText.
virtual void LoadNetlist() override
Read the netlist file in the legacy format into aNetlist.
An abstract class from which implementation specific LINE_READERs may be derived to read single lines...
Definition: richio.h:81
A pure virtual class to derive a specific type of netlist reader from.
static NETLIST_READER * GetNetlistReader(NETLIST *aNetlist, const wxString &aNetlistFileName, const wxString &aCompFootprintFileName=wxEmptyString)
Attempt to determine the net list file type of aNetlistFileName and return the appropriate NETLIST_RE...
static NETLIST_FILE_T GuessNetlistFileType(LINE_READER *aLineReader)
Look at aFileHeaderLine to see if it matches any of the netlist file types it knows about.
NETLIST * m_netlist
The net list to read the file(s) into.
LINE_READER * m_lineReader
The line reader of the netlist.
bool m_loadFootprintFilters
Load the component footprint filters section if true.
virtual void LoadNetlist()=0
Load the contents of the netlist file into aNetlist.
CMP_READER * m_footprintReader
The reader used to load the footprint links. If NULL, footprint links are not read.
NETLIST_READER(LINE_READER *aLineReader, NETLIST *aNetlist, CMP_READER *aFootprintLinkReader=nullptr)
virtual ~NETLIST_READER()
bool m_loadNets
Load the nets section of the netlist file if true.
Store information read from a netlist along with the flags used to update the NETLIST in the BOARD.
Definition: pcb_netlist.h:213
This file contains miscellaneous commonly used macros and functions.