Source code for hwtLib.i2c.intf

from collections import deque

from hwt.interfaces.agents.tristate import TristateAgent, \
    TristateClkAgent, toGenerator
from hwt.interfaces.tristate import TristateClk, TristateSig
from hwt.serializer.ip_packager.interfaces.intfConfig import IntfConfig
from hwt.simulator.agentBase import AgentWitReset
from hwt.synthesizer.interface import Interface


[docs]class I2c(Interface):
[docs] def _declr(self): self.scl = TristateClk() # serial clk self.sda = TristateSig() # serial data
[docs] def _getIpCoreIntfClass(self): return IP_IIC
[docs] def _initSimAgent(self): self._ag = I2cAgent(self)
[docs]class I2cAgent(AgentWitReset): START = "start"
[docs] def __init__(self, intf, allowNoReset=True): AgentWitReset.__init__(self, intf, allowNoReset=allowNoReset) self.bits = deque() self.start = True self.sda = TristateAgent(intf.sda) self.sda.collectData = False self.sda.selfSynchronization = False
[docs] def startListener(self, sim): if self.start: self.bits.append(self.START) self.start = False return yield
[docs] def startSender(self, sim): if self.start: self.sda._write(0, sim) self.start = False return yield
[docs] def getMonitors(self): self.scl = TristateClkAgent(self.intf.scl, onRisingCallback=self.monitor, onFallingCallback=self.startListener) return (self.sda.getMonitors() + self.scl.getMonitors() )
[docs] def getDrivers(self): self.scl = TristateClkAgent(self.intf.scl, onRisingCallback=self.driver, onFallingCallback=self.startSender) return ([toGenerator(self.driver)] + # initial initialization self.sda.getDrivers() + self.scl.getDrivers() )
[docs] def monitor(self, sim): # now intf.sdc is rising yield sim.waitOnCombUpdate() # wait on all agents to update values and on # simulator to appply them if sim.now > 0 and self.notReset(sim): v = sim.read(self.intf.sda.i) self.bits.append(v)
[docs] def driver(self, sim): # now intf.sdc is rising # yield sim.wait(1) # yield sim.waitOnCombUpdate() yield from self.sda.driver(sim) # now we are after clk # prepare data for next clk if self.bits: b = self.bits.popleft() if b == self.START: return self.sda._write(b, sim)
[docs]class IP_IIC(IntfConfig):
[docs] def __init__(self): super().__init__() self.name = "iic" self.version = "1.0" self.vendor = "xilinx.com" self.library = "interface" self.map = {"scl": {"t": "SCL_T", "i": "SCL_I", "o": "SCL_O"}, "sda": {"t": "SDA_T", "i": "SDA_I", "o": "SDA_O"} }