migen/genlib: add io.py to define generic I/O specials to be lowered by mibuild

This commit is contained in:
Florent Kermarrec 2015-03-12 18:32:49 +01:00
parent 00e8616de2
commit c8ba8cde8e
2 changed files with 31 additions and 1 deletions

View File

@ -5,6 +5,7 @@ from migen.fhdl.std import *
from migen.fhdl.specials import SynthesisDirective from migen.fhdl.specials import SynthesisDirective
from migen.genlib.cdc import * from migen.genlib.cdc import *
from migen.genlib.resetsync import AsyncResetSynchronizer from migen.genlib.resetsync import AsyncResetSynchronizer
from migen.genlib.io import *
from mibuild.generic_platform import GenericPlatform from mibuild.generic_platform import GenericPlatform
from mibuild import tools from mibuild import tools
@ -82,6 +83,15 @@ class XilinxAsyncResetSynchronizer:
def lower(dr): def lower(dr):
return XilinxAsyncResetSynchronizerImpl(dr.cd, dr.async_reset) return XilinxAsyncResetSynchronizerImpl(dr.cd, dr.async_reset)
class XilinxDifferentialInputImpl(Module):
def __init__(self, i_p, i_n, o):
self.specials += Instance("IBUFDS", i_I=i_p, i_IB=i_n, o_O=o)
class XilinxDifferentialInput:
@staticmethod
def lower(dr):
return XilinxDifferentialInputImpl(dr.i_p, dr.i_n, dr.o)
class XilinxGenericPlatform(GenericPlatform): class XilinxGenericPlatform(GenericPlatform):
bitstream_ext = ".bit" bitstream_ext = ".bit"
@ -89,7 +99,8 @@ class XilinxGenericPlatform(GenericPlatform):
so = { so = {
NoRetiming: XilinxNoRetiming, NoRetiming: XilinxNoRetiming,
MultiReg: XilinxMultiReg, MultiReg: XilinxMultiReg,
AsyncResetSynchronizer: XilinxAsyncResetSynchronizer AsyncResetSynchronizer: XilinxAsyncResetSynchronizer,
DifferentialInput: XilinxDifferentialInput,
} }
so.update(special_overrides) so.update(special_overrides)
return GenericPlatform.get_verilog(self, *args, special_overrides=so, **kwargs) return GenericPlatform.get_verilog(self, *args, special_overrides=so, **kwargs)

19
migen/genlib/io.py Normal file
View File

@ -0,0 +1,19 @@
from migen.fhdl.std import *
from migen.fhdl.specials import Special
from migen.fhdl.tools import list_signals
class DifferentialInput(Special):
def __init__(self, i_p, i_n, o):
Special.__init__(self)
self.i_p = i_p
self.i_n = i_n
self.o = o
def iter_expressions(self):
yield self, "i_p", SPECIAL_INPUT
yield self, "i_n", SPECIAL_INPUT
yield self, "o", SPECIAL_OUTPUT
@staticmethod
def lower(dr):
raise NotImplementedError("Attempted to use a reset synchronizer, but platform does not support them")