Skip to content

Commit a221924

Browse files
authored
Merge pull request #385 from boriel/feature/architectures
Dynamically import architecture
2 parents c582ef4 + 9c0cd4c commit a221924

5 files changed

Lines changed: 26 additions & 19 deletions

File tree

arch/__init__.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
# -*- coding: utf-8 -*-
33
# vim:ts=4:et:sw=4:
44

5+
import importlib
6+
57
from . import zx48k
68

79

@@ -10,3 +12,13 @@
1012
]
1113

1214
AVAILABLE_ARCHITECTURES = __all__
15+
target = None
16+
17+
18+
def set_target_arch(target_arch: str):
19+
global target
20+
assert target_arch in AVAILABLE_ARCHITECTURES
21+
target = importlib.import_module(f'.{target_arch}', 'arch')
22+
23+
24+
set_target_arch(AVAILABLE_ARCHITECTURES[0])

libzxbc/zxb.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,16 @@
1919
from . import zxbparser, zxblex
2020
from libzxbpp import zxbpp
2121
from libzxbasm import asmparse
22-
import arch.zx48k.backend as backend
2322

2423
from api import global_ as gl
2524
from api.config import OPTIONS
2625
from api import debug
27-
from arch.zx48k.optimizer import optimize
2826

2927
import arch
3028

3129

3230
def get_inits(memory):
33-
backend.INITS.union(zxbparser.INITS)
31+
arch.target.backend.INITS.union(zxbparser.INITS)
3432

3533
reinit = re.compile(r'^#[ \t]*init[ \t]+([_a-zA-Z][_a-zA-Z0-9]*)[ \t]*$',
3634
re.IGNORECASE)
@@ -39,7 +37,7 @@ def get_inits(memory):
3937
for m in memory:
4038
init = reinit.match(m)
4139
if init is not None:
42-
backend.INITS.add(init.groups()[0])
40+
arch.target.backend.INITS.add(init.groups()[0])
4341
memory[i] = ''
4442
i += 1
4543

@@ -78,8 +76,8 @@ def main(args=None, emitter=None):
7876
api.config.init()
7977
zxbpp.init()
8078
zxbparser.init()
81-
arch.zx48k.backend.init()
82-
arch.zx48k.Translator.reset()
79+
arch.target.backend.init()
80+
arch.target.Translator.reset()
8381
asmparse.init()
8482

8583
# ------------------------------------------------------------
@@ -184,6 +182,8 @@ def main(args=None, emitter=None):
184182
parser.error(f"Invalid architecture '{options.arch}'")
185183
return 2
186184
OPTIONS.architecture.value = options.arch
185+
arch.set_target_arch(options.arch)
186+
backend = arch.target.backend
187187

188188
OPTIONS.org.value = api.utils.parse_int(options.org)
189189
if OPTIONS.org.value is None:
@@ -285,14 +285,14 @@ def main(args=None, emitter=None):
285285
optimizer.visit(zxbparser.ast)
286286

287287
# Emits intermediate code
288-
translator = arch.zx48k.Translator()
288+
translator = arch.target.Translator()
289289
translator.visit(zxbparser.ast)
290290

291291
if gl.DATA_IS_USED:
292292
gl.FUNCTIONS.extend(gl.DATA_FUNCTIONS)
293293

294294
# This will fill MEMORY with pending functions
295-
func_visitor = arch.zx48k.FunctionTranslator(gl.FUNCTIONS)
295+
func_visitor = arch.target.FunctionTranslator(gl.FUNCTIONS)
296296
func_visitor.start()
297297

298298
# Emits data lines
@@ -309,7 +309,7 @@ def main(args=None, emitter=None):
309309

310310
backend.MEMORY[:] = [] # Empties memory
311311
# This will fill MEMORY with global declared variables
312-
translator = arch.zx48k.VarTranslator()
312+
translator = arch.target.VarTranslator()
313313
translator.visit(zxbparser.data_ast)
314314

315315
for quad in translator.dumpMemory(backend.MEMORY):
@@ -318,7 +318,7 @@ def main(args=None, emitter=None):
318318

319319
# Join all lines into a single string and ensures an INTRO at end of file
320320
asm_output = backend.emit(backend.MEMORY, optimize=OPTIONS.optimization.value > 0)
321-
asm_output = optimize(asm_output) + '\n' # invoke the -O3
321+
asm_output = arch.target.optimizer.optimize(asm_output) + '\n' # invoke the -O3
322322

323323
asm_output = asm_output.split('\n')
324324
for i in range(len(asm_output)):
@@ -341,7 +341,7 @@ def main(args=None, emitter=None):
341341
# This will fill MEMORY with global declared variables
342342
var_checker = api.optimize.VariableVisitor()
343343
var_checker.visit(zxbparser.data_ast)
344-
translator = arch.zx48k.VarTranslator()
344+
translator = arch.target.VarTranslator()
345345
translator.visit(zxbparser.data_ast)
346346
if gl.has_errors:
347347
debug.__DEBUG__("exiting due to errors.")

libzxbc/zxbparser.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
import ply.yacc as yacc
6161
from . import zxblex
6262
from libzxbpp import zxbpp
63-
from arch.zx48k.backend import REQUIRES
63+
import arch
6464
from .zxblex import tokens # analysis:ignore -- Needed for PLY. Do not remove. # noqa
6565

6666
# ----------------------------------------------------------------------
@@ -3168,7 +3168,7 @@ def p_preproc_line_init(p):
31683168
def p_preproc_line_require(p):
31693169
""" preproc_line : _REQUIRE STRING
31703170
"""
3171-
REQUIRES.add(p[2])
3171+
arch.target.backend.REQUIRES.add(p[2])
31723172

31733173

31743174
def p_preproc_line_option(p):

pyproject.toml

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,6 @@ packages = [
4444
{ include = "libzxbpp" },
4545
]
4646

47-
include = [
48-
'library/**/*',
49-
'library-asm/**/*'
50-
]
51-
52-
5347
[tool.poetry.scripts]
5448
zxb = 'libzxbc.zxb:main'
5549
zxbc = 'libzxbc.zxb:main'

tests/functional/test_cmdline.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ usage: zxbc.py [-h] [-d] [-O OPTIMIZE] [-o OUTPUT_FILE] [-T] [-t] [-B] [-a]
1111
[-i] [-I INCLUDE_PATH] [--strict] [--headerless] [--version]
1212
[--parse-only] [--append-binary APPEND_BINARY]
1313
[--append-headless-binary APPEND_HEADLESS_BINARY] [-N]
14+
[--arch ARCH]
1415
PROGRAM
1516
zxbc.py: error: Option --asm and --mmap cannot be used together
1617

0 commit comments

Comments
 (0)