class SimPort: def __init__(self, sim, pin, port, attrs, invert): self.pin = pin self.port = port self.attrs = attrs self.invert = invert # TODO: support invert if pin.xdr == 0: if 'i' in pin.dir: sim.add_process(self.in_xdr0) if 'o' in pin.dir: sim.add_process(self.out_xdr0) elif pin.xdr == 1: if 'i' in pin.dir: sim.add_process(self.in_xdr1) if 'o' in pin.dir: sim.add_process(self.out_xdr1) async def in_xdr0(self): await Passive() while True: await self.port.io.changed() value = await self.port.io.get() await self.pin.i.set(value) async def out_xdr0(self): await Passive() while True: await self.pin.o.changed() value = await self.pin.o.get() await self.port.io.set(value) async def in_xdr1(self): await Passive() next = 0 while True: await self.pin.i_clk.changed(1) await Settle() await self.pin.i.set(next) next = await self.port.io.get() async def out_xdr1(self): await Passive() next = 0 while True: await self.pin.o_clk.changed(1) await Settle() await self.port.io.set(next) next = await self.pin.o.get() class SimPlatform(ResourceManager): def prepare(self, sim): for pin, port, attrs, invert in self.iter_single_ended_pins(): SimPort(sim, pin, port, attrs, invert)