-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathlower_example05_fir.py
More file actions
71 lines (53 loc) · 2.65 KB
/
lower_example05_fir.py
File metadata and controls
71 lines (53 loc) · 2.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#!/usr/bin/env python3
"""Lower Example 05 FIR into its published lowered artifact."""
from __future__ import annotations
import argparse
import json
import sys
from pathlib import Path
try:
from .fir_lowerer import LoweringError, canonical_json_bytes, dump_json, load_json, lower_fir_artifact
except ImportError: # pragma: no cover
from fir_lowerer import LoweringError, canonical_json_bytes, dump_json, load_json, lower_fir_artifact # type: ignore
ROOT = Path(__file__).resolve().parents[3]
DEFAULT_FIR = ROOT / "Examples" / "05_bounded_ui_accumulator" / "main.fir.json"
DEFAULT_EXPECTED_LOWERING = ROOT / "Examples" / "05_bounded_ui_accumulator" / "main.lowering.json"
def repo_relative(path: Path) -> str:
return path.relative_to(ROOT).as_posix() if path.is_absolute() else path.as_posix()
def parse_args(argv: list[str]) -> argparse.Namespace:
parser = argparse.ArgumentParser(description="Lower Example 05 FIR into the published lowered artifact.")
parser.add_argument("--fir", type=Path, default=DEFAULT_FIR)
parser.add_argument("--output", type=Path, default=None)
parser.add_argument("--expected", type=Path, default=DEFAULT_EXPECTED_LOWERING)
parser.add_argument("--check", action="store_true")
parser.add_argument("--print", action="store_true", dest="print_json")
return parser.parse_args(argv)
def main(argv: list[str]) -> int:
args = parse_args(argv)
fir_path = args.fir if args.fir.is_absolute() else ROOT / args.fir
expected_path = args.expected if args.expected.is_absolute() else ROOT / args.expected
try:
fir = load_json(fir_path)
generated = lower_fir_artifact(fir, repo_relative(fir_path))
if args.output:
output_path = args.output if args.output.is_absolute() else ROOT / args.output
dump_json(generated, output_path)
print(f"wrote generated lowering: {output_path}")
if args.print_json:
json.dump(generated, sys.stdout, indent=2)
sys.stdout.write("\n")
if args.check:
expected = load_json(expected_path)
if canonical_json_bytes(generated) != canonical_json_bytes(expected):
print("Lowering check: FAILED", file=sys.stderr)
print(f"expected: {expected_path}", file=sys.stderr)
return 1
print("Lowering check: ok")
print(f"fir: {fir_path.relative_to(ROOT)}")
print(f"expected: {expected_path.relative_to(ROOT)}")
return 0
except LoweringError as exc:
print(f"Lowering error: {exc}", file=sys.stderr)
return 2
if __name__ == "__main__":
raise SystemExit(main(sys.argv[1:]))