Make split_commands faster

merge-requests/1/head
jaseg 2022-02-06 14:20:13 +01:00
rodzic d5dcb60b5f
commit 1872df4a33
4 zmienionych plików z 94 dodań i 8 usunięć

60
examples/bench.py 100644
Wyświetl plik

@ -0,0 +1,60 @@
#!/usr/bin/env python3
import time
from pathlib import Path
import tqdm
import gerbonara
if __name__ == '__main__':
resources = Path(__file__).parent.parent / 'gerbonara' / 'tests' / 'resources'
TEST_FILES = [
'easyeda/Gerber_TopSilkLayer.GTO',
'allegro-2/MinnowMax_RevA1_GAF_Gerber/MinnowMax_lyr3.art',
'allegro-2/MinnowMax_RevA1_GAF_Gerber/MinnowMax_fab.art',
'eagle-newer/soldermask_bottom.gbr',
'eagle-newer/copper_bottom.gbr',
# FIXME remove redundant warnings in these files
# 'siemens/80101_0125_F200_SilkscreenBottom.gdo',
# 'siemens/80101_0125_F200_SoldermaskBottom.gdo',
# 'siemens/80101_0125_F200_SolderPasteBottom.gdo',
# 'siemens/80101_0125_F200_L03.gdo',
# 'siemens/80101_0125_F200_L01_Top.gdo',
# 'zuken-emulated/Gerber/Symbol-A.fph',
'Target3001/IRNASIoTbank1.2.StopTop',
'Target3001/IRNASIoTbank1.2.PasteTop',
'Target3001/IRNASIoTbank1.2.PasteBot',
'Target3001/IRNASIoTbank1.2.StopBot',
'Target3001/IRNASIoTbank1.2.Top',
'pcb-rnd/power-art.gtl',
'pcb-rnd/power-art.gto',
'pcb-rnd/power-art.gtp',
'altium-composite-drill/Gerber/LimeSDR-QPCIe_1v2.G1',
'altium-composite-drill/Gerber/LimeSDR-QPCIe_1v2.G2',
'altium-composite-drill/Gerber/LimeSDR-QPCIe_1v2.G3',
'altium-composite-drill/Gerber/LimeSDR-QPCIe_1v2.G4',
'altium-composite-drill/Gerber/LimeSDR-QPCIe_1v2.G5',
'altium-composite-drill/Gerber/LimeSDR-QPCIe_1v2.G6',
'altium-composite-drill/Gerber/LimeSDR-QPCIe_1v2.G7',
'altium-composite-drill/Gerber/LimeSDR-QPCIe_1v2.G8',
'altium-composite-drill/Gerber/LimeSDR-QPCIe_1v2.G9',
'altium-composite-drill/Gerber/LimeSDR-QPCIe_1v2.G10',
'altium-composite-drill/Gerber/LimeSDR-QPCIe_1v2.G11',
'altium-composite-drill/Gerber/LimeSDR-QPCIe_1v2.G12',
'altium-composite-drill/Gerber/LimeSDR-QPCIe_1v2.GBS',
'eagle_files/copper_top_l1.gbr',
'eagle_files/soldermask_top.gbr',
'diptrace/mainboard_Bottom.gbr',
'upverter/design_export.gtp',
'upverter/design_export.gbl',
]
start = time.perf_counter()
for file in TEST_FILES: #tqdm.tqdm(TEST_FILES):
gerbonara.GerberFile.open(resources / file)
end = time.perf_counter()
print(f'Duration: {(end - start)*1000:.3f} ms')

Wyświetl plik

@ -0,0 +1,11 @@
#!/usr/bin/env python3
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('input', help='Input Gerber directory')
args = parser.parse_args()
import gerbonara
print(gerbonara.LayerStack.from_directory(args.input))

Wyświetl plik

@ -535,6 +535,7 @@ class ExcellonParser(object):
self.lineno = None
self.filename = None
self.external_tools = external_tools or {}
self.found_kicad_format_comment = False
def warn(self, msg):
warnings.warn(f'{self.filename}:{self.lineno} "{self.line}": {msg}', SyntaxWarning)
@ -844,7 +845,7 @@ class ExcellonParser(object):
integer, _, fractional = match[3][1:].partition('.')
self.settings.number_format = len(integer), len(fractional)
elif self.settings.number_format == (None, None) and not metric:
elif self.settings.number_format == (None, None) and not metric and not self.found_kicad_format_comment:
self.warn('Using implicit number format from bare "INCH" statement. This is normal for Fritzing, Diptrace, Geda and pcb-rnd.')
self.settings.number_format = (2,4)
@ -981,6 +982,7 @@ class ExcellonParser(object):
x = None if x == '-' else int(x)
y = None if y == '-' else int(y)
self.settings.number_format = x, y
self.found_kicad_format_comment = True
self.settings.notation = match[2]
self.settings.unit = Inch if match[3] == 'inch' else MM

Wyświetl plik

@ -520,11 +520,11 @@ class GerberParser:
NAME = r"[a-zA-Z_$\.][a-zA-Z_$\.0-9+\-]+"
STATEMENT_REGEXES = {
'region_start': r'G36$',
'region_end': r'G37$',
'coord': fr"(?P<interpolation>G0?[123]|G74|G75|G54|G55)?(X(?P<x>{NUMBER}))?(Y(?P<y>{NUMBER}))?" \
fr"(I(?P<i>{NUMBER}))?(J(?P<j>{NUMBER}))?" \
fr"(?P<operation>D0?[123])?$",
'region_start': r'G36$',
'region_end': r'G37$',
'aperture': r"(G54|G55)?D(?P<number>\d+)",
# Allegro combines format spec and unit into one long illegal extended command.
'allegro_format_spec': r"FS(?P<zero>(L|T|D))?(?P<notation>(A|I))[NG0-9]*X(?P<x>[0-7][0-7])Y(?P<y>[0-7][0-7])[DM0-9]*\*MO(?P<unit>IN|MM)",
@ -581,12 +581,25 @@ class GerberParser:
self.lineno = None
self.line = None
def _shorten_line(self):
line_joined = self.line.replace('\r', '').replace('\n', '\\n')
if len(line_joined) > 80:
return f'{line_joined[:20]}[...]{line_joined[-20:]}'
else:
return line_joined
def warn(self, msg, kls=SyntaxWarning):
line_joined = self.line.replace('\n', '\\n')
warnings.warn(f'{self.filename}:{self.lineno} "{line_joined}": {msg}', kls)
warnings.warn(f'{self.filename}:{self.lineno} "{self._shorten_line()}": {msg}', kls)
@classmethod
def _split_commands(kls, data):
for match in re.finditer(r'G04.*?\*|%.*?%|[^*%]*\*', data, re.DOTALL):
cmd = match[0].strip().strip('%').rstrip('*').replace('\r', '').replace('\n', '')
if cmd:
yield 1, cmd
return
#######
start = 0
extended_command = False
lineno = 1
@ -637,13 +650,13 @@ class GerberParser:
try:
getattr(self, f'_parse_{name}')(match)
except Exception as e:
raise SyntaxError(f'{filename}:{lineno} "{line}": {e}') from e
raise SyntaxError(f'{filename}:{lineno} "{self._shorten_line()}": {e}') from e
line = line[match.end(0):]
break
else:
self.warn(f'Unknown statement found: "{line}", ignoring.', UnknownStatementWarning)
self.target.comments.append(f'Unknown statement found: "{line}", ignoring.')
self.warn(f'Unknown statement found: "{self._shorten_line()}", ignoring.', UnknownStatementWarning)
self.target.comments.append(f'Unknown statement found: "{self._shorten_line()}", ignoring.')
self.target.apertures = list(self.aperture_map.values())
self.target.import_settings = self.file_settings