-
-
Notifications
You must be signed in to change notification settings - Fork 695
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
testing/py3-migen: fix get_var_name() in tracer.py
This fixes unit test failures in py3-litedram, which builds upon py3-migen. See m-labs/migen#283 for an effort to upstream the patch and the log of the error this fixes.
- Loading branch information
Showing
4 changed files
with
148 additions
and
69 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
Take get_var_name() from amaranth with minor impedance matching. This | ||
fixes: | ||
|
||
test/test_phy_utils.py:54: in serializer_test | ||
dut = Serializer(clk=clk, clkdiv=clkdiv, i_dw=data_width, o_dw=1) | ||
litedram/phy/utils.py:240: in __init__ | ||
if i is None: i = Signal(i_dw) | ||
/usr/lib/python3.11/site-packages/migen/fhdl/structure.py:395: in __init__ | ||
self.backtrace = _tracer.trace_back(name) | ||
/usr/lib/python3.11/site-packages/migen/fhdl/tracer.py:111: in trace_back | ||
varname = get_var_name(frame) | ||
|
||
See https://github.com/amaranth-lang/amaranth/blob/main/amaranth/tracer.py for | ||
original source. | ||
|
||
See https://github.com/m-labs/migen/pull/283 for an effort to upstream the fix. | ||
--- a/migen/fhdl/tracer.py 2024-01-11 10:35:38.211748883 +0100 | ||
+++ b/migen/fhdl/tracer.py 2024-01-11 10:36:04.864735268 +0100 | ||
@@ -1,56 +1,55 @@ | ||
import inspect | ||
+import sys | ||
from sys import version_info | ||
from opcode import opname | ||
from collections import defaultdict | ||
|
||
-# All opcodes are 2 bytes in length in Python 3.6 | ||
-def _bytecode_length_version_guard(old_len): | ||
- return old_len if version_info[1] < 6 else 2 | ||
- | ||
-_call_opcodes = { | ||
- "CALL_FUNCTION" : _bytecode_length_version_guard(3), | ||
- "CALL_FUNCTION_KW" : _bytecode_length_version_guard(3), | ||
-} | ||
- | ||
-if version_info[1] < 6: | ||
- _call_opcodes["CALL_FUNCTION_VAR"] = 3 | ||
- _call_opcodes["CALL_FUNCTION_VAR_KW"] = 3 | ||
-elif version_info[1] < 7: | ||
- _call_opcodes["CALL_FUNCTION_EX"] = 2 | ||
-else: | ||
- _call_opcodes["CALL_FUNCTION_EX"] = 2 | ||
- _call_opcodes["CALL_METHOD"] = 2 | ||
- | ||
-_load_build_opcodes = { | ||
- "LOAD_GLOBAL" : _bytecode_length_version_guard(3), | ||
- "LOAD_ATTR" : _bytecode_length_version_guard(3), | ||
- "LOAD_FAST" : _bytecode_length_version_guard(3), | ||
- "LOAD_DEREF" : _bytecode_length_version_guard(3), | ||
- "DUP_TOP" : _bytecode_length_version_guard(1), | ||
- "BUILD_LIST" : _bytecode_length_version_guard(3), | ||
-} | ||
- | ||
|
||
def get_var_name(frame): | ||
code = frame.f_code | ||
call_index = frame.f_lasti | ||
- call_opc = opname[code.co_code[call_index]] | ||
- if call_opc not in _call_opcodes: | ||
+ while call_index > 0 and opname[code.co_code[call_index]] == "CACHE": | ||
+ call_index -= 2 | ||
+ while True: | ||
+ call_opc = opname[code.co_code[call_index]] | ||
+ if call_opc in ("EXTENDED_ARG",): | ||
+ call_index += 2 | ||
+ else: | ||
+ break | ||
+ if call_opc not in ("CALL_FUNCTION", "CALL_FUNCTION_KW", "CALL_FUNCTION_EX", | ||
+ "CALL_METHOD", "CALL", "CALL_KW"): | ||
return None | ||
- index = call_index+_call_opcodes[call_opc] | ||
+ | ||
+ index = call_index + 2 | ||
+ imm = 0 | ||
while True: | ||
opc = opname[code.co_code[index]] | ||
- if opc == "STORE_NAME" or opc == "STORE_ATTR": | ||
- name_index = int(code.co_code[index+1]) | ||
- return code.co_names[name_index] | ||
+ if opc == 'EXTENDED_ARG': | ||
+ imm |= int(code.co_code[index + 1]) | ||
+ imm <<= 8 | ||
+ index += 2 | ||
+ elif opc in ("STORE_NAME", "STORE_ATTR"): | ||
+ imm |= int(code.co_code[index + 1]) | ||
+ return code.co_names[imm] | ||
elif opc == "STORE_FAST": | ||
- name_index = int(code.co_code[index+1]) | ||
- return code.co_varnames[name_index] | ||
+ imm |= int(code.co_code[index + 1]) | ||
+ if sys.version_info >= (3, 11): | ||
+ return code._varname_from_oparg(imm) | ||
+ else: | ||
+ return code.co_varnames[imm] | ||
elif opc == "STORE_DEREF": | ||
- name_index = int(code.co_code[index+1]) | ||
- return code.co_cellvars[name_index] | ||
- elif opc in _load_build_opcodes: | ||
- index += _load_build_opcodes[opc] | ||
+ imm |= int(code.co_code[index + 1]) | ||
+ if sys.version_info >= (3, 11): | ||
+ return code._varname_from_oparg(imm) | ||
+ else: | ||
+ if imm < len(code.co_cellvars): | ||
+ return code.co_cellvars[imm] | ||
+ else: | ||
+ return code.co_freevars[imm - len(code.co_cellvars)] | ||
+ elif opc in ("LOAD_GLOBAL", "LOAD_NAME", "LOAD_ATTR", "LOAD_FAST", "LOAD_DEREF", | ||
+ "DUP_TOP", "BUILD_LIST", "CACHE", "COPY"): | ||
+ imm = 0 | ||
+ index += 2 | ||
else: | ||
return None | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
Fix: | ||
|
||
migen/fhdl/visit.py:86 | ||
/builds/maribu/aports/testing/py3-migen/src/migen-0.9.2/migen/fhdl/visit.py:86: SyntaxWarning: "is" with a literal. Did you mean "=="? | ||
key=lambda x: -1 if x[0] is "default" else x[0].duid): | ||
migen/fhdl/visit.py:191 | ||
/builds/maribu/aports/testing/py3-migen/src/migen-0.9.2/migen/fhdl/visit.py:191: SyntaxWarning: "is" with a literal. Did you mean "=="? | ||
key=lambda x: -1 if x[0] is "default" else x[0].duid)} | ||
migen/test/test_platform.py:47 | ||
--- a/migen/fhdl/visit.py 2024-01-11 16:52:08.195971473 +0100 | ||
+++ b/migen/fhdl/visit.py 2024-01-11 16:52:44.862281145 +0100 | ||
@@ -83,7 +83,7 @@ class NodeVisitor: | ||
def visit_Case(self, node): | ||
self.visit(node.test) | ||
for v, statements in sorted(node.cases.items(), | ||
- key=lambda x: -1 if x[0] is "default" else x[0].duid): | ||
+ key=lambda x: -1 if isinstance(x[0], str) and x[0] == "default" else x[0].duid): | ||
self.visit(statements) | ||
|
||
def visit_Fragment(self, node): | ||
@@ -188,7 +188,7 @@ class NodeTransformer: | ||
def visit_Case(self, node): | ||
cases = {v: self.visit(statements) | ||
for v, statements in sorted(node.cases.items(), | ||
- key=lambda x: -1 if x[0] is "default" else x[0].duid)} | ||
+ key=lambda x: -1 if isinstance(x[0], str) and x[0] == "default" else x[0].duid)} | ||
r = Case(self.visit(node.test), cases) | ||
return r | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
64 changes: 0 additions & 64 deletions
64
testing/py3-migen/d404437655107e99ee93101622cadf08fa103be1.patch
This file was deleted.
Oops, something went wrong.