Skip to content

Commit

Permalink
Merge 14f8d92 into e8faab6
Browse files Browse the repository at this point in the history
  • Loading branch information
leonardt committed Oct 23, 2019
2 parents e8faab6 + 14f8d92 commit 2355a59
Show file tree
Hide file tree
Showing 16 changed files with 210 additions and 128 deletions.
52 changes: 46 additions & 6 deletions magma/circuit.py
@@ -1,3 +1,5 @@
import ast
import textwrap
import sys
import six
import inspect
Expand Down Expand Up @@ -95,10 +97,10 @@ def __new__(metacls, name, bases, dct):

def __call__(cls, *largs, **kwargs):
#print('CircuitKind call:', largs, kwargs)
self = super(CircuitKind, cls).__call__(*largs, **kwargs)
if get_debug_mode():
debug_info = get_callee_frame_info()
self.set_debug_info(debug_info)
kwargs["debug_info"] = debug_info
self = super(CircuitKind, cls).__call__(*largs, **kwargs)

# instance interface for this instance
if hasattr(cls, 'IO'):
Expand Down Expand Up @@ -187,7 +189,10 @@ class AnonymousCircuitType(object):

def __init__(self, *largs, **kwargs):

self.kwargs = kwargs
self.kwargs = dict(**kwargs)
if "debug_info" in self.kwargs:
# Not an instance parameter, internal debug argument
del self.kwargs["debug_info"]
if hasattr(self, 'default_kwargs'):
for key in self.default_kwargs:
if key not in kwargs:
Expand All @@ -204,7 +209,7 @@ def __init__(self, *largs, **kwargs):
self.used = False
self.is_instance = True

self.debug_info = None
self.debug_info = kwargs.get("debug_info", None)

def set_debug_info(self, debug_info):
self.debug_info = debug_info
Expand Down Expand Up @@ -460,6 +465,8 @@ def __new__(metacls, name, bases, dct):

self._instances = []
self.instanced_circuits_counter = Counter()
self.instance_name_counter = Counter()
self.instance_name_map = {}
self._is_definition = dct.get('is_definition', False)
self.is_instance = False

Expand All @@ -482,13 +489,46 @@ def is_definition(self):
def instances(self):
return self._instances

def inspect_name(cls, inst):
# Try to fetch instance name
with open(inst.debug_info.filename, "r") as f:
line = f.read().splitlines()[inst.debug_info.lineno - 1]
tree = ast.parse(textwrap.dedent(line)).body[0]
# Simple case when <Name> = <Instance>()
if isinstance(tree, ast.Assign) and len(tree.targets) == 1 \
and isinstance(tree.targets[0], ast.Name):
name = tree.targets[0].id
# Handle case when we've seen a name multiple times
# (e.g. reused inside a loop)
if cls.instance_name_counter[name] == 0:
inst.name = name
cls.instance_name_counter[name] += 1
else:
if cls.instance_name_counter[name] == 1:
# Append `_0` to the first instance with this
# name
orig = cls.instance_name_map[name]
orig.name += "_0"
del cls.instance_name_map[name]
cls.instance_name_map[orig.name] = orig
inst.name = f"{name}_{cls.instance_name_counter[name]}"
cls.instance_name_counter[name] += 1

#
# place a circuit instance in this definition
#
def place(cls, inst):
if not inst.name:
inst.name = f"{type(inst).name}_inst{str(cls.instanced_circuits_counter[type(inst).name])}"
cls.instanced_circuits_counter[type(inst).name] += 1
if get_debug_mode():
cls.inspect_name(inst)
if not inst.name:
# Default name if we could not find one or debug mode is off
inst.name = f"{type(inst).name}_inst{str(cls.instanced_circuits_counter[type(inst).name])}"
cls.instanced_circuits_counter[type(inst).name] += 1
cls.instance_name_counter[inst.name] += 1
else:
cls.instance_name_counter[inst.name] += 1
cls.instance_name_map[inst.name] = inst
inst.defn = cls
if get_debug_mode():
inst.stack = inspect.stack()
Expand Down
38 changes: 19 additions & 19 deletions tests/test_circuit/gold/test_for_loop_def.json
Expand Up @@ -8,43 +8,43 @@
["I1","BitIn"],
["O","Bit"]
]],
"metadata":{"filename":"tests/test_circuit/test_define.py","lineno":"53"}
"metadata":{"filename":"tests/test_circuit/test_define.py","lineno":"55"}
},
"main":{
"type":["Record",[
["I",["Array",2,"BitIn"]],
["O","Bit"]
]],
"instances":{
"And2_inst0":{
"and2_0":{
"modref":"global.And2",
"metadata":{"filename":"tests/test_circuit/test_define.py","lineno":"59"}
"metadata":{"filename":"tests/test_circuit/test_define.py","lineno":"61"}
},
"And2_inst1":{
"and2_1":{
"modref":"global.And2",
"metadata":{"filename":"tests/test_circuit/test_define.py","lineno":"59"}
"metadata":{"filename":"tests/test_circuit/test_define.py","lineno":"61"}
},
"And2_inst2":{
"and2_2":{
"modref":"global.And2",
"metadata":{"filename":"tests/test_circuit/test_define.py","lineno":"59"}
"metadata":{"filename":"tests/test_circuit/test_define.py","lineno":"61"}
},
"And2_inst3":{
"and2_3":{
"modref":"global.And2",
"metadata":{"filename":"tests/test_circuit/test_define.py","lineno":"59"}
"metadata":{"filename":"tests/test_circuit/test_define.py","lineno":"61"}
}
},
"connections":[
["self.I.0","And2_inst0.I0",{"filename":"tests/test_circuit/test_define.py","lineno":"61"}],
["self.I.1","And2_inst0.I1",{"filename":"tests/test_circuit/test_define.py","lineno":"62"}],
["And2_inst1.I0","And2_inst0.O",{"filename":"tests/test_circuit/test_define.py","lineno":"64"}],
["self.I.1","And2_inst1.I1",{"filename":"tests/test_circuit/test_define.py","lineno":"65"}],
["And2_inst2.I0","And2_inst1.O",{"filename":"tests/test_circuit/test_define.py","lineno":"64"}],
["self.I.1","And2_inst2.I1",{"filename":"tests/test_circuit/test_define.py","lineno":"65"}],
["And2_inst3.I0","And2_inst2.O",{"filename":"tests/test_circuit/test_define.py","lineno":"64"}],
["self.I.1","And2_inst3.I1",{"filename":"tests/test_circuit/test_define.py","lineno":"65"}],
["self.O","And2_inst3.O",{"filename":"tests/test_circuit/test_define.py","lineno":"68"}]
["self.I.0","and2_0.I0",{"filename":"tests/test_circuit/test_define.py","lineno":"63"}],
["self.I.1","and2_0.I1",{"filename":"tests/test_circuit/test_define.py","lineno":"64"}],
["and2_1.I0","and2_0.O",{"filename":"tests/test_circuit/test_define.py","lineno":"66"}],
["self.I.1","and2_1.I1",{"filename":"tests/test_circuit/test_define.py","lineno":"67"}],
["and2_2.I0","and2_1.O",{"filename":"tests/test_circuit/test_define.py","lineno":"66"}],
["self.I.1","and2_2.I1",{"filename":"tests/test_circuit/test_define.py","lineno":"67"}],
["and2_3.I0","and2_2.O",{"filename":"tests/test_circuit/test_define.py","lineno":"66"}],
["self.I.1","and2_3.I1",{"filename":"tests/test_circuit/test_define.py","lineno":"67"}],
["self.O","and2_3.O",{"filename":"tests/test_circuit/test_define.py","lineno":"70"}]
],
"metadata":{"filename":"tests/test_circuit/test_define.py","lineno":"55"}
"metadata":{"filename":"tests/test_circuit/test_define.py","lineno":"57"}
}
}
}
Expand Down
54 changes: 27 additions & 27 deletions tests/test_circuit/gold/test_for_loop_def.v
@@ -1,30 +1,30 @@
// Defined at tests/test_circuit/test_define.py:55
// Defined at tests/test_circuit/test_define.py:57
module main (input [1:0] I, output O);
wire And2_inst0_O;
wire And2_inst1_O;
wire And2_inst2_O;
wire And2_inst3_O;
// Instanced at tests/test_circuit/test_define.py:59
// Argument I0(I[0]) wired at tests/test_circuit/test_define.py:61
// Argument I1(I[1]) wired at tests/test_circuit/test_define.py:62
// Argument O(And2_inst0_O) wired at tests/test_circuit/test_define.py:64
And2 And2_inst0 (.I0(I[0]), .I1(I[1]), .O(And2_inst0_O));
// Instanced at tests/test_circuit/test_define.py:59
// Argument I0(And2_inst0_O) wired at tests/test_circuit/test_define.py:64
// Argument I1(I[1]) wired at tests/test_circuit/test_define.py:65
// Argument O(And2_inst1_O) wired at tests/test_circuit/test_define.py:64
And2 And2_inst1 (.I0(And2_inst0_O), .I1(I[1]), .O(And2_inst1_O));
// Instanced at tests/test_circuit/test_define.py:59
// Argument I0(And2_inst1_O) wired at tests/test_circuit/test_define.py:64
// Argument I1(I[1]) wired at tests/test_circuit/test_define.py:65
// Argument O(And2_inst2_O) wired at tests/test_circuit/test_define.py:64
And2 And2_inst2 (.I0(And2_inst1_O), .I1(I[1]), .O(And2_inst2_O));
// Instanced at tests/test_circuit/test_define.py:59
// Argument I0(And2_inst2_O) wired at tests/test_circuit/test_define.py:64
// Argument I1(I[1]) wired at tests/test_circuit/test_define.py:65
// Argument O(And2_inst3_O) wired at tests/test_circuit/test_define.py:68
And2 And2_inst3 (.I0(And2_inst2_O), .I1(I[1]), .O(And2_inst3_O));
// Wired at tests/test_circuit/test_define.py:68
assign O = And2_inst3_O;
wire and2_0_O;
wire and2_1_O;
wire and2_2_O;
wire and2_3_O;
// Instanced at tests/test_circuit/test_define.py:61
// Argument I0(I[0]) wired at tests/test_circuit/test_define.py:63
// Argument I1(I[1]) wired at tests/test_circuit/test_define.py:64
// Argument O(and2_0_O) wired at tests/test_circuit/test_define.py:66
And2 and2_0 (.I0(I[0]), .I1(I[1]), .O(and2_0_O));
// Instanced at tests/test_circuit/test_define.py:61
// Argument I0(and2_0_O) wired at tests/test_circuit/test_define.py:66
// Argument I1(I[1]) wired at tests/test_circuit/test_define.py:67
// Argument O(and2_1_O) wired at tests/test_circuit/test_define.py:66
And2 and2_1 (.I0(and2_0_O), .I1(I[1]), .O(and2_1_O));
// Instanced at tests/test_circuit/test_define.py:61
// Argument I0(and2_1_O) wired at tests/test_circuit/test_define.py:66
// Argument I1(I[1]) wired at tests/test_circuit/test_define.py:67
// Argument O(and2_2_O) wired at tests/test_circuit/test_define.py:66
And2 and2_2 (.I0(and2_1_O), .I1(I[1]), .O(and2_2_O));
// Instanced at tests/test_circuit/test_define.py:61
// Argument I0(and2_2_O) wired at tests/test_circuit/test_define.py:66
// Argument I1(I[1]) wired at tests/test_circuit/test_define.py:67
// Argument O(and2_3_O) wired at tests/test_circuit/test_define.py:70
And2 and2_3 (.I0(and2_2_O), .I1(I[1]), .O(and2_3_O));
// Wired at tests/test_circuit/test_define.py:70
assign O = and2_3_O;
endmodule

30 changes: 15 additions & 15 deletions tests/test_circuit/gold/test_interleaved_instance_wiring.json
Expand Up @@ -8,37 +8,37 @@
["I1","BitIn"],
["O","Bit"]
]],
"metadata":{"filename":"tests/test_circuit/test_define.py","lineno":"83"}
"metadata":{"filename":"tests/test_circuit/test_define.py","lineno":"87"}
},
"main":{
"type":["Record",[
["I",["Array",2,"BitIn"]],
["O","Bit"]
]],
"instances":{
"And2_inst0":{
"and2_0":{
"modref":"global.And2",
"metadata":{"filename":"tests/test_circuit/test_define.py","lineno":"87"}
"metadata":{"filename":"tests/test_circuit/test_define.py","lineno":"91"}
},
"And2_inst1":{
"and2_1":{
"modref":"global.And2",
"metadata":{"filename":"tests/test_circuit/test_define.py","lineno":"88"}
"metadata":{"filename":"tests/test_circuit/test_define.py","lineno":"92"}
},
"And2_inst2":{
"and2_2":{
"modref":"global.And2",
"metadata":{"filename":"tests/test_circuit/test_define.py","lineno":"94"}
"metadata":{"filename":"tests/test_circuit/test_define.py","lineno":"98"}
}
},
"connections":[
["self.I.0","And2_inst0.I0",{"filename":"tests/test_circuit/test_define.py","lineno":"90"}],
["self.I.1","And2_inst0.I1",{"filename":"tests/test_circuit/test_define.py","lineno":"91"}],
["And2_inst1.I0","And2_inst0.O",{"filename":"tests/test_circuit/test_define.py","lineno":"92"}],
["self.I.1","And2_inst1.I1",{"filename":"tests/test_circuit/test_define.py","lineno":"93"}],
["And2_inst2.I0","And2_inst1.O",{"filename":"tests/test_circuit/test_define.py","lineno":"95"}],
["self.I.0","And2_inst2.I1",{"filename":"tests/test_circuit/test_define.py","lineno":"96"}],
["self.O","And2_inst2.O",{"filename":"tests/test_circuit/test_define.py","lineno":"98"}]
["self.I.0","and2_0.I0",{"filename":"tests/test_circuit/test_define.py","lineno":"94"}],
["self.I.1","and2_0.I1",{"filename":"tests/test_circuit/test_define.py","lineno":"95"}],
["and2_1.I0","and2_0.O",{"filename":"tests/test_circuit/test_define.py","lineno":"96"}],
["self.I.1","and2_1.I1",{"filename":"tests/test_circuit/test_define.py","lineno":"97"}],
["and2_2.I0","and2_1.O",{"filename":"tests/test_circuit/test_define.py","lineno":"99"}],
["self.I.0","and2_2.I1",{"filename":"tests/test_circuit/test_define.py","lineno":"100"}],
["self.O","and2_2.O",{"filename":"tests/test_circuit/test_define.py","lineno":"102"}]
],
"metadata":{"filename":"tests/test_circuit/test_define.py","lineno":"85"}
"metadata":{"filename":"tests/test_circuit/test_define.py","lineno":"89"}
}
}
}
Expand Down
42 changes: 21 additions & 21 deletions tests/test_circuit/gold/test_interleaved_instance_wiring.v
@@ -1,24 +1,24 @@
// Defined at tests/test_circuit/test_define.py:85
// Defined at tests/test_circuit/test_define.py:89
module main (input [1:0] I, output O);
wire And2_inst0_O;
wire And2_inst1_O;
wire And2_inst2_O;
// Instanced at tests/test_circuit/test_define.py:87
// Argument I0(I[0]) wired at tests/test_circuit/test_define.py:90
// Argument I1(I[1]) wired at tests/test_circuit/test_define.py:91
// Argument O(And2_inst0_O) wired at tests/test_circuit/test_define.py:92
And2 And2_inst0 (.I0(I[0]), .I1(I[1]), .O(And2_inst0_O));
// Instanced at tests/test_circuit/test_define.py:88
// Argument I0(And2_inst0_O) wired at tests/test_circuit/test_define.py:92
// Argument I1(I[1]) wired at tests/test_circuit/test_define.py:93
// Argument O(And2_inst1_O) wired at tests/test_circuit/test_define.py:95
And2 And2_inst1 (.I0(And2_inst0_O), .I1(I[1]), .O(And2_inst1_O));
// Instanced at tests/test_circuit/test_define.py:94
// Argument I0(And2_inst1_O) wired at tests/test_circuit/test_define.py:95
// Argument I1(I[0]) wired at tests/test_circuit/test_define.py:96
// Argument O(And2_inst2_O) wired at tests/test_circuit/test_define.py:98
And2 And2_inst2 (.I0(And2_inst1_O), .I1(I[0]), .O(And2_inst2_O));
// Wired at tests/test_circuit/test_define.py:98
assign O = And2_inst2_O;
wire and2_0_O;
wire and2_1_O;
wire and2_2_O;
// Instanced at tests/test_circuit/test_define.py:91
// Argument I0(I[0]) wired at tests/test_circuit/test_define.py:94
// Argument I1(I[1]) wired at tests/test_circuit/test_define.py:95
// Argument O(and2_0_O) wired at tests/test_circuit/test_define.py:96
And2 and2_0 (.I0(I[0]), .I1(I[1]), .O(and2_0_O));
// Instanced at tests/test_circuit/test_define.py:92
// Argument I0(and2_0_O) wired at tests/test_circuit/test_define.py:96
// Argument I1(I[1]) wired at tests/test_circuit/test_define.py:97
// Argument O(and2_1_O) wired at tests/test_circuit/test_define.py:99
And2 and2_1 (.I0(and2_0_O), .I1(I[1]), .O(and2_1_O));
// Instanced at tests/test_circuit/test_define.py:98
// Argument I0(and2_1_O) wired at tests/test_circuit/test_define.py:99
// Argument I1(I[0]) wired at tests/test_circuit/test_define.py:100
// Argument O(and2_2_O) wired at tests/test_circuit/test_define.py:102
And2 and2_2 (.I0(and2_1_O), .I1(I[0]), .O(and2_2_O));
// Wired at tests/test_circuit/test_define.py:102
assign O = and2_2_O;
endmodule

8 changes: 4 additions & 4 deletions tests/test_circuit/gold/test_simple_def.json
Expand Up @@ -16,15 +16,15 @@
["O","Bit"]
]],
"instances":{
"And2_inst0":{
"and2":{
"modref":"global.And2",
"metadata":{"filename":"tests/test_circuit/test_define.py","lineno":"18"}
}
},
"connections":[
["self.I.0","And2_inst0.I0",{"filename":"tests/test_circuit/test_define.py","lineno":"20"}],
["self.I.1","And2_inst0.I1",{"filename":"tests/test_circuit/test_define.py","lineno":"21"}],
["self.O","And2_inst0.O",{"filename":"tests/test_circuit/test_define.py","lineno":"22"}]
["self.I.0","and2.I0",{"filename":"tests/test_circuit/test_define.py","lineno":"20"}],
["self.I.1","and2.I1",{"filename":"tests/test_circuit/test_define.py","lineno":"21"}],
["self.O","and2.O",{"filename":"tests/test_circuit/test_define.py","lineno":"22"}]
],
"metadata":{"filename":"tests/test_circuit/test_define.py","lineno":"16"}
}
Expand Down
8 changes: 4 additions & 4 deletions tests/test_circuit/gold/test_simple_def.v
@@ -1,12 +1,12 @@
// Defined at tests/test_circuit/test_define.py:16
module main (input [1:0] I, output O);
wire And2_inst0_O;
wire and2_O;
// Instanced at tests/test_circuit/test_define.py:18
// Argument I0(I[0]) wired at tests/test_circuit/test_define.py:20
// Argument I1(I[1]) wired at tests/test_circuit/test_define.py:21
// Argument O(And2_inst0_O) wired at tests/test_circuit/test_define.py:22
And2 And2_inst0 (.I0(I[0]), .I1(I[1]), .O(And2_inst0_O));
// Argument O(and2_O) wired at tests/test_circuit/test_define.py:22
And2 and2 (.I0(I[0]), .I1(I[1]), .O(and2_O));
// Wired at tests/test_circuit/test_define.py:22
assign O = And2_inst0_O;
assign O = and2_O;
endmodule

16 changes: 8 additions & 8 deletions tests/test_circuit/gold/test_simple_def_class.json
Expand Up @@ -16,15 +16,15 @@
["O","Bit"]
]],
"instances":{
"And2_inst0":{
"and2":{
"modref":"global.And2",
"metadata":{"filename":"tests/test_circuit/test_define.py","lineno":"36"}
}
},
"connections":[
["self.I.0","And2_inst0.I0",{"filename":"tests/test_circuit/test_define.py","lineno":"37"}],
["self.I.1","And2_inst0.I1",{"filename":"tests/test_circuit/test_define.py","lineno":"38"}],
["self.O","And2_inst0.O",{"filename":"tests/test_circuit/test_define.py","lineno":"39"}]
["self.I.0","and2.I0",{"filename":"tests/test_circuit/test_define.py","lineno":"37"}],
["self.I.1","and2.I1",{"filename":"tests/test_circuit/test_define.py","lineno":"38"}],
["self.O","and2.O",{"filename":"tests/test_circuit/test_define.py","lineno":"39"}]
],
"metadata":{"filename":"tests/test_circuit/test_define.py","lineno":"31"}
},
Expand All @@ -34,15 +34,15 @@
["O","Bit"]
]],
"instances":{
"And2_inst0":{
"and2":{
"modref":"global.And2",
"metadata":{"filename":"tests/test_circuit/test_define.py","lineno":"18"}
}
},
"connections":[
["self.I.0","And2_inst0.I0",{"filename":"tests/test_circuit/test_define.py","lineno":"20"}],
["self.I.1","And2_inst0.I1",{"filename":"tests/test_circuit/test_define.py","lineno":"21"}],
["self.O","And2_inst0.O",{"filename":"tests/test_circuit/test_define.py","lineno":"22"}]
["self.I.0","and2.I0",{"filename":"tests/test_circuit/test_define.py","lineno":"20"}],
["self.I.1","and2.I1",{"filename":"tests/test_circuit/test_define.py","lineno":"21"}],
["self.O","and2.O",{"filename":"tests/test_circuit/test_define.py","lineno":"22"}]
],
"metadata":{"filename":"tests/test_circuit/test_define.py","lineno":"16"}
}
Expand Down

0 comments on commit 2355a59

Please sign in to comment.