Skip to content

Commit

Permalink
Move interface logic to interface.py
Browse files Browse the repository at this point in the history
  • Loading branch information
rsetaluri committed Feb 8, 2019
1 parent 9d1fcc2 commit 2edcd4b
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 22 deletions.
8 changes: 2 additions & 6 deletions magma/circuit.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,12 +56,8 @@ def _add_port(defn, name, typ):
if name in defn.IO.ports or name in defn.interface.ports:
raise ValueError(f"{name} already is a port of {defn.name}")
defn.IO.ports.update({name: typ})
ifc = DeclareInterface(name, typ)
ifc_inst = ifc(defn=defn, renamed_ports={})
defn.interface.ports.update(ifc_inst.ports)
type(defn.interface).Decl += (name, typ)
for name, port in ifc_inst.ports.items():
setattr(defn, name, port)
defn.interface.add_port(name, typ, defn=defn)
setattr(defn, name, defn.interface.ports[name])


#
Expand Down
41 changes: 25 additions & 16 deletions magma/interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -193,31 +193,40 @@ def __str__(self):
#
# interface = Interface()
#
class _DeclareInterface(_Interface):
def __init__(self, renamed_ports={}, inst=None, defn=None):

# parse the class Interface declaration
names, ports = parse(self.Decl)

args = OrderedDict()
def _get_port(name, port, renamed_ports, inst, defn):
if inst: ref = InstRef(inst, name)
elif defn: ref = DefnRef(defn, name)
else: ref = AnonRef(name)

for name, port in zip(names, ports):
if inst: ref = InstRef(inst, name)
elif defn: ref = DefnRef(defn, name)
else: ref = AnonRef(name)
if hasattr(port, "origPortName"):
ref.name = port.origPortName
if name in renamed_ports:
ref.name = renamed_ports[name]

if hasattr(port, "origPortName"):
ref.name = port.origPortName
if name in renamed_ports:
ref.name = renamed_ports[name]
if defn:
port = port.flip()

if defn:
port = port.flip()
return port(name=ref)

args[name] = port(name=ref)

class _DeclareInterface(_Interface):
def __init__(self, renamed_ports={}, inst=None, defn=None):
# Parse the class Interface declaration.
names, ports = parse(self.Decl)
args = OrderedDict()
for name, port in zip(names, ports):
args[name] = _get_port(name, port, renamed_ports, inst, defn)
self.ports = args

def add_port(self, name, typ, renamed_ports={}, inst=None, defn=None):
assert name not in self.Decl and name not in self.ports
port = _get_port(name, typ, renamed_ports, inst, defn)
self.ports.update({name: port})
type(self).Decl += (name, typ)


class InterfaceKind(Kind):
def __init__(cls, *args, **kwargs):
super().__init__(*args, **kwargs)
Expand Down

0 comments on commit 2edcd4b

Please sign in to comment.