Skip to content

Commit

Permalink
First pass at new generator framework
Browse files Browse the repository at this point in the history
  • Loading branch information
rsetaluri committed May 16, 2019
1 parent cb98a3c commit a9e656e
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 0 deletions.
2 changes: 2 additions & 0 deletions magma/__init__.py
Expand Up @@ -70,6 +70,8 @@ def set_mantle_target(t):

from hwtypes.bit_vector_abc import TypeFamily

from .generator import Generator


BitVector = Bits
UIntVector = UInt
Expand Down
17 changes: 17 additions & 0 deletions magma/generator.py
@@ -0,0 +1,17 @@
from .circuit import DefineCircuitKind, Circuit, CircuitType, CircuitKind, IO


class GeneratorKind(type):
def __new__(metacls, name, bases, dct):
return super().__new__(metacls, name, bases, dct)

def __call__(cls, *args, **kwargs):
bases = (Circuit,)
io = cls.new(*args, **kwargs)
name = cls.__name__
return super().__call__(name, bases, {"io": io})


class Generator(DefineCircuitKind, metaclass=GeneratorKind):
def new():
return IO()
30 changes: 30 additions & 0 deletions tests/test_generator.py
@@ -0,0 +1,30 @@
import magma as m


def test_type_relations():
class _MyGen(m.Generator):
pass

MyCircuit = _MyGen()

assert issubclass(MyCircuit, m.Circuit)
assert isinstance(MyCircuit, m.circuit.DefineCircuitKind)
assert issubclass(m.circuit.Circuit, m.circuit.CircuitType)
assert issubclass(m.circuit.DefineCircuitKind, m.circuit.CircuitKind)
assert isinstance(MyCircuit, m.circuit.CircuitKind)

assert isinstance(MyCircuit, _MyGen)
assert issubclass(_MyGen, m.circuit.DefineCircuitKind)


def test_generation():
class _MyGen(m.Generator):
def new(width):
io = m.IO(I=m.In(m.Bits[width]),
O=m.Out(m.Bits[width]))
m.wire(io.O, io.I)
return io

MyCircuit8 = _MyGen(8)
print (repr(MyCircuit8))
m.compile("test", MyCircuit8, output="coreir")

0 comments on commit a9e656e

Please sign in to comment.