From f9f67c5a18bab8fb075f12f9d46a329429739bbe Mon Sep 17 00:00:00 2001 From: qu1ck Date: Mon, 22 Oct 2018 23:57:17 -0700 Subject: [PATCH] Implement netlist parser --- InteractiveHtmlBom/schematic_data/__init__.py | 4 ++- .../schematic_data/netlistparser.py | 36 +++++++++++++++++++ .../schematic_data/sexpressions.py | 32 +++++++++++++++++ 3 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 InteractiveHtmlBom/schematic_data/netlistparser.py create mode 100644 InteractiveHtmlBom/schematic_data/sexpressions.py diff --git a/InteractiveHtmlBom/schematic_data/__init__.py b/InteractiveHtmlBom/schematic_data/__init__.py index 0e4e242d..5601da78 100644 --- a/InteractiveHtmlBom/schematic_data/__init__.py +++ b/InteractiveHtmlBom/schematic_data/__init__.py @@ -1,9 +1,11 @@ import os from xmlparser import XmlParser +from netlistparser import NetlistParser PARSERS = { - '.xml': XmlParser + '.xml': XmlParser, + '.net': NetlistParser } diff --git a/InteractiveHtmlBom/schematic_data/netlistparser.py b/InteractiveHtmlBom/schematic_data/netlistparser.py new file mode 100644 index 00000000..b36805a2 --- /dev/null +++ b/InteractiveHtmlBom/schematic_data/netlistparser.py @@ -0,0 +1,36 @@ +from parser_base import ParserBase +from sexpressions import parse_sexpression + + +class NetlistParser(ParserBase): + def get_extra_field_data(self): + with open(self.file_name, 'r') as f: + sexpression = parse_sexpression(f.read()) + components = None + for s in sexpression: + if s[0] == 'components': + components = s[1:] + if components is None: + return None + field_set = set() + comp_dict = {} + for c in components: + ref = None + fields = None + for f in c[1:]: + if f[0] == 'ref': + ref = f[1] + if f[0] == 'fields': + fields = f[1:] + if ref is None: + return None + if fields is None: + continue + for f in fields: + if len(f) > 1: + field_set.add(f[1][1]) + if len(f) > 2: + ref_fields = comp_dict.setdefault(ref, {}) + ref_fields[f[1][1]] = f[2] + + return list(field_set), comp_dict diff --git a/InteractiveHtmlBom/schematic_data/sexpressions.py b/InteractiveHtmlBom/schematic_data/sexpressions.py new file mode 100644 index 00000000..54bef57d --- /dev/null +++ b/InteractiveHtmlBom/schematic_data/sexpressions.py @@ -0,0 +1,32 @@ +import re + +term_regex = r'''(?mx) + \s*(?: + (?P\()| + (?P\))| + (?P"[^"]*")| + (?P[^(^)\s]+) + )''' +pattern = re.compile(term_regex) + + +def parse_sexpression(sexpression): + stack = [] + out = [] + for terms in pattern.finditer(sexpression): + term, value = [(t, v) for t, v in terms.groupdict().items() if v][0] + if term == 'open': + stack.append(out) + out = [] + elif term == 'close': + assert stack, "Trouble with nesting of brackets" + tmp, out = out, stack.pop(-1) + out.append(tmp) + elif term == 'sq': + out.append(value[1:-1]) + elif term == 's': + out.append(value) + else: + raise NotImplementedError("Error: %s, %s" % (term, value)) + assert not stack, "Trouble with nesting of brackets" + return out[0]