Advertisement
Guest User

Untitled

a guest
May 29th, 2015
209
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.54 KB | None | 0 0
  1.  
  2. from myhdl import *
  3.  
  4.  
  5. class SignalMatrix(object):
  6.  
  7. def __init__(self, size=(4,4,), stype=intbv(0)[9:]):
  8. # the size of the matrix
  9. self.size = size
  10. nrows,ncols = size
  11.  
  12. # the size (number of bits) for each item in the matrix
  13. if isinstance(stype, intbv):
  14. self.nbits = len(stype)
  15. else:
  16. self.nbits = 1
  17.  
  18. # the signal matrix
  19. self.M = [[Signal(stype) for col in range(ncols)]
  20. for row in range(nrows)]
  21.  
  22.  
  23. def __getitem__(self, idx):
  24. print(type(idx), idx)
  25. item = None
  26. if isinstance(idx, tuple):
  27. item = self.M[idx[0]][idx[1]]
  28.  
  29. return item
  30.  
  31.  
  32. def get_flat_signal(self):
  33. nbits = self.size[0] * self.size[1] * self.nbits
  34. sig = Signal(intbv(0)[nbits:])
  35. return sig
  36.  
  37.  
  38. def m_stack(self, flat):
  39. ''' convert flat bit-vector to a signal matrix '''
  40. nitems = self.size[0]*self.size[1]
  41. nbits = self.nbits
  42. assert len(flat) == nitems*nbits
  43. # create a flat list of signals (references)
  44. flats = [col for row in self.M for col in row]
  45.  
  46. # avoid Verilog indexing limitation ...
  47. def _assign(y, x):
  48. @always_comb
  49. def assign():
  50. y.next = x
  51. return assign
  52.  
  53. g = [None for _ in range(nitems)]
  54. for ii in range(nitems):
  55. g[ii] = _assign(flats[ii], flat(ii*nbits+nbits, ii*nbits))
  56.  
  57. return g
  58.  
  59.  
  60. def m_flatten(self, flat):
  61. ''' convert this matrix to flat bit-vector '''
  62. nbits = self.nbits
  63. flats = ConcatSignal(*[col(nbits, 0) for row in self.M for col in row])
  64. @always_comb
  65. def rtl():
  66. flat.next = flats
  67. return rtl
  68.  
  69.  
  70. def m_flat_top(clock, reset, sdi, sdo):
  71. ''' example convertible top-level '''
  72. matrix = SignalMatrix()
  73. flati = matrix.get_flat_signal()
  74. flato = matrix.get_flat_signal()
  75. nbits = len(flati)
  76.  
  77. @always_seq(clock.posedge, reset=reset)
  78. def rtli():
  79. flati.next = concat(flati[nbits-1:0], sdi)
  80.  
  81. gstk = matrix.m_stack(flati)
  82. gflt = matrix.m_flatten(flato)
  83.  
  84. @always_seq(clock.posedge, reset=reset)
  85. def rtlo():
  86. sdo.next = concat(flato[nbits-1:0], bool(0))
  87.  
  88. return rtli, gstk, gflt, rtlo
  89.  
  90.  
  91. def convert():
  92. clock = Signal(bool(0))
  93. reset = ResetSignal(0, active=1, async=False)
  94. sdi = Signal(bool(0))
  95. sdo = Signal(bool(0))
  96. toVerilog(m_flat_top, clock, reset, sdi, sdo)
  97. toVHDL(m_flat_top, clock, reset, sdi, sdo)
  98.  
  99.  
  100. if __name__ == '__main__':
  101. convert()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement