Skip to content

Commit

Permalink
Merge d0fe4ed into 7063fd3
Browse files Browse the repository at this point in the history
  • Loading branch information
rsetaluri committed May 23, 2019
2 parents 7063fd3 + d0fe4ed commit cee6255
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 11 deletions.
19 changes: 19 additions & 0 deletions magma/circuit.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,9 @@ def __new__(metacls, name, bases, dct):
else:
dct["debug_info"] = None

# Keep track of instances of this Circuit.
dct["my_instances"] = set()


# create a new circuit class
cls = type.__new__(metacls, name, bases, dct)
Expand Down Expand Up @@ -179,6 +182,18 @@ def find(cls, defn):
defn[name] = cls
return defn

def add_port(cls, name, typ):
if name in cls.IO.ports or name in cls.interface.ports:
raise ValueError(f"{name} already is a port of {cls.name}")
cls.IO.ports.update({name: typ})
cls.interface.add_port(name, typ, defn=cls, add_to_decl=True)
setattr(cls, name, cls.interface.ports[name])
for inst in cls.my_instances:
inst.IO.ports.update({name: typ})
inst.interface.add_port(name, typ, inst=inst, add_to_decl=False)
setattr(inst, name, inst.interface.ports[name])


#
# Abstract base class for circuits
#
Expand Down Expand Up @@ -353,6 +368,10 @@ def __init__(self, *largs, **kwargs):
if currentDefinition:
currentDefinition.place(self)

defn = type(self)
assert self not in defn.my_instances
defn.my_instances.add(self)

def __repr__(self):
args = []
for k, v in self.kwargs.items():
Expand Down
32 changes: 21 additions & 11 deletions magma/interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,17 @@ def __str__(self):
return f'Interface({", ".join(f"{k}: {v}" for k, v in self.ports.items())})'


def _make_port(name, typ, renamed_ports, inst, defn):
if inst: ref = InstRef(inst, name)
elif defn: ref = DefnRef(defn, name)
else: ref = AnonRef(name)
if name in renamed_ports:
ref.name = renamed_ports[name]
if defn:
typ = typ.flip()
return typ(name=ref)


#
# _DeclareInterface class
#
Expand All @@ -202,20 +213,19 @@ def __init__(self, renamed_ports={}, inst=None, defn=None):
args = OrderedDict()

for name, port in zip(names, ports):
if inst: ref = InstRef(inst, name)
elif defn: ref = DefnRef(defn, name)
else: ref = AnonRef(name)

if name in renamed_ports:
ref.name = renamed_ports[name]

if defn:
port = port.flip()

args[name] = port(name=ref)
args[name] = _make_port(name, port, renamed_ports, inst, defn)

self.ports = args

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

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

0 comments on commit cee6255

Please sign in to comment.