--- /dev/null
+import subprocess
+
+from migen.fhdl.std import *
+from migen.fhdl.specials import Instance
+from migen.fhdl.verilog import convert
+
+
+# Create a parent module with two instances of a child module.
+# Bind input ports to first module and output ports to second,
+# and create internal signals to connect the first module to the
+# second.
+class ParentModule(Module):
+ def __init__(self):
+ self.inputs = [Signal(x+1, name="input{}".format(x)) for x in range(4)]
+ self.trans = [Signal(x+1) for x in range(4)]
+ self.outputs = [Signal(x+1, name="output{}".format(x)) for x in range(4)]
+ self.io = set(self.inputs) | set(self.outputs)
+ i = Instance("ChildModule",
+ i_master_clk=ClockSignal(),
+ i_master_rst=ResetSignal(),
+ i_input0=self.inputs[0],
+ i_input1=self.inputs[1],
+ i_input2=self.inputs[2],
+ i_input3=self.inputs[3],
+ o_output0=self.trans[0],
+ o_output1=self.trans[1],
+ o_output2=self.trans[2],
+ o_output3=self.trans[3]
+ )
+ j = Instance("ChildModule",
+ i_master_clk=ClockSignal(),
+ i_master_rst=ResetSignal(),
+ i_input0=self.trans[0],
+ i_input1=self.trans[1],
+ i_input2=self.trans[2],
+ i_input3=self.trans[3],
+ o_output0=self.outputs[0],
+ o_output1=self.outputs[1],
+ o_output2=self.outputs[2],
+ o_output3=self.outputs[3]
+ )
+ self.specials += i, j
+
+
+class ChildModule(Module):
+ def __init__(self):
+ self.inputs = [Signal(x+1, name_override="input{}".format(x)) for x in range(4)]
+ self.outputs = [Signal(x+1, name_override="output{}".format(x)) for x in range(4)]
+ self.io = set()
+ for x in range(4):
+ self.sync.master += self.outputs[x].eq(self.inputs[x])
+ self.io = self.io.union(self.inputs)
+ self.io = self.io.union(self.outputs)
+
+
+# Generate RTL for the parent module and the submodule, run through
+# icarus for a syntax check
+def test_instance_module():
+ sub = ChildModule()
+ convert(sub, sub.io, name="ChildModule").write("ChildModule.v")
+
+ im = ParentModule()
+ convert(im, im.io, name="ParentModule").write("ParentModule.v")
+
+ subprocess.check_call(["iverilog", "-W", "all",
+ "ParentModule.v", "ChildModule.v"])
+
+if __name__ == "__main__":
+ test_instance_module()