litex/milkymist/identifier/__init__.py

37 lines
1.2 KiB
Python
Raw Normal View History

2012-05-16 19:41:41 -04:00
from migen.fhdl.structure import *
from migen.bank.description import *
from migen.bank import csrgen
import re
def encode_version(version):
match = re.match("(\d+)\.(\d+)(\.(\d+))?(rc(\d+))?", version, re.IGNORECASE)
r = (int(match.group(1)) << 12) | (int(match.group(2)) << 8)
subminor = match.group(4)
rc = match.group(6)
if subminor:
r |= int(subminor) << 4
if rc:
r |= int(rc)
return r
class Identifier:
2012-05-22 07:23:44 -04:00
def __init__(self, address, sysid, version, frequency):
2012-05-16 19:41:41 -04:00
self.sysid = sysid
self.version = encode_version(version)
2012-05-22 07:23:44 -04:00
self.frequency = frequency
2012-05-16 19:41:41 -04:00
self._r_sysid = RegisterField("sysid", 16, access_bus=READ_ONLY, access_dev=WRITE_ONLY)
self._r_version = RegisterField("version", 16, access_bus=READ_ONLY, access_dev=WRITE_ONLY)
2012-05-22 07:23:44 -04:00
self._r_frequency = RegisterField("frequency", 32, access_bus=READ_ONLY, access_dev=WRITE_ONLY)
regs = [self._r_sysid, self._r_version, self._r_frequency]
self.bank = csrgen.Bank(regs, address=address)
2012-05-16 19:41:41 -04:00
def get_fragment(self):
comb = [
self._r_sysid.field.w.eq(self.sysid),
2012-05-22 07:23:44 -04:00
self._r_version.field.w.eq(self.version),
self._r_frequency.field.w.eq(self.frequency)
2012-05-16 19:41:41 -04:00
]
return self.bank.get_fragment() + Fragment(comb)