Rename PTP clock timestamp signals to tod and rel
Signed-off-by: Alex Forencich <alex@alexforencich.com>
This commit is contained in:
@@ -38,8 +38,8 @@ class PtpClock(Reset):
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
ts_96=None,
|
||||
ts_64=None,
|
||||
ts_tod=None,
|
||||
ts_rel=None,
|
||||
ts_step=None,
|
||||
pps=None,
|
||||
clock=None,
|
||||
@@ -49,8 +49,8 @@ class PtpClock(Reset):
|
||||
*args, **kwargs):
|
||||
|
||||
self.log = logging.getLogger(f"cocotb.eth.{type(self).__name__}")
|
||||
self.ts_96 = ts_96
|
||||
self.ts_64 = ts_64
|
||||
self.ts_tod = ts_tod
|
||||
self.ts_rel = ts_rel
|
||||
self.ts_step = ts_step
|
||||
self.pps = pps
|
||||
self.clock = clock
|
||||
@@ -70,19 +70,19 @@ class PtpClock(Reset):
|
||||
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
self.ts_96_s = 0
|
||||
self.ts_96_ns = 0
|
||||
self.ts_96_fns = 0
|
||||
self.ts_tod_s = 0
|
||||
self.ts_tod_ns = 0
|
||||
self.ts_tod_fns = 0
|
||||
|
||||
self.ts_64_ns = 0
|
||||
self.ts_64_fns = 0
|
||||
self.ts_rel_ns = 0
|
||||
self.ts_rel_fns = 0
|
||||
|
||||
self.ts_updated = False
|
||||
|
||||
if self.ts_96 is not None:
|
||||
self.ts_96.setimmediatevalue(0)
|
||||
if self.ts_64 is not None:
|
||||
self.ts_64.setimmediatevalue(0)
|
||||
if self.ts_tod is not None:
|
||||
self.ts_tod.setimmediatevalue(0)
|
||||
if self.ts_rel is not None:
|
||||
self.ts_rel.setimmediatevalue(0)
|
||||
if self.ts_step is not None:
|
||||
self.ts_step.setimmediatevalue(0)
|
||||
if self.pps is not None:
|
||||
@@ -115,65 +115,70 @@ class PtpClock(Reset):
|
||||
return p + self.drift_num / self.drift_rate / 2**16
|
||||
return p
|
||||
|
||||
def set_ts_96(self, ts_s, ts_ns=None, ts_fns=None):
|
||||
ts_s = int(ts_s)
|
||||
if ts_fns is not None:
|
||||
# got separate fields
|
||||
self.ts_96_s = ts_s
|
||||
self.ts_96_ns = int(ts_ns)
|
||||
self.ts_96_fns = int(ts_fns)
|
||||
else:
|
||||
# got timestamp as integer
|
||||
self.ts_96_s = ts_s >> 48
|
||||
self.ts_96_ns = (ts_s >> 16) & 0x3fffffff
|
||||
self.ts_96_fns = ts_s & 0xffff
|
||||
def set_ts_tod(self, ts_s, ts_ns, ts_fns):
|
||||
self.ts_tod_s = int(ts_s)
|
||||
self.ts_tod_ns = int(ts_ns)
|
||||
self.ts_tod_fns = int(ts_fns)
|
||||
self.ts_updated = True
|
||||
|
||||
def set_ts_96_ns(self, t):
|
||||
self.set_ts_96_s(t*1e-9)
|
||||
def set_ts_tod_96(self, ts):
|
||||
ts = int(ts)
|
||||
self.set_ts_tod(ts >> 48, (ts >> 32) & 0x3fffffff, ts & 0xffff)
|
||||
|
||||
def set_ts_96_s(self, t):
|
||||
def set_ts_tod_ns(self, t):
|
||||
self.set_ts_tod_s(t*1e-9)
|
||||
|
||||
def set_ts_tod_s(self, t):
|
||||
ts_ns, ts_s = math.modf(t)
|
||||
ts_ns *= 1e9
|
||||
ts_fns, ts_ns = math.modf(ts_ns)
|
||||
ts_fns *= 2**16
|
||||
self.set_ts_96(ts_s, ts_ns, ts_fns)
|
||||
self.set_ts_tod(ts_s, ts_ns, ts_fns)
|
||||
|
||||
def get_ts_96(self):
|
||||
return (self.ts_96_s << 48) | (self.ts_96_ns << 16) | self.ts_96_fns
|
||||
def get_ts_tod(self):
|
||||
return (self.ts_tod_s, self.ts_tod_ns, self.ts_tod_fns)
|
||||
|
||||
def get_ts_96_ns(self):
|
||||
return self.ts_96_s*1e9+self.ts_96_ns+self.ts_96_fns/2**16
|
||||
def get_ts_tod_96(self):
|
||||
ts_s, ts_ns, ts_fns = self.get_ts_tod()
|
||||
return (ts_s << 48) | (ts_ns << 16) | ts_fns
|
||||
|
||||
def get_ts_96_s(self):
|
||||
return self.get_ts_96_ns()*1e-9
|
||||
def get_ts_tod_ns(self):
|
||||
ts_s, ts_ns, ts_fns = self.get_ts_tod()
|
||||
return ts_s*1e9+ts_ns+ts_fns/2**16
|
||||
|
||||
def set_ts_64(self, ts_ns, ts_fns=None):
|
||||
ts_ns = int(ts_ns)
|
||||
if ts_fns is not None:
|
||||
# got separate fields
|
||||
self.ts_64_ns = ts_ns
|
||||
self.ts_64_fns = int(ts_fns)
|
||||
else:
|
||||
# got timestamp as integer
|
||||
self.ts_64_ns = ts_ns >> 16
|
||||
self.ts_64_fns = ts_ns & 0xffff
|
||||
def get_ts_tod_s(self):
|
||||
return self.get_ts_tod_ns()*1e-9
|
||||
|
||||
def set_ts_rel(self, ts_ns, ts_fns):
|
||||
self.ts_rel_ns = int(ts_ns)
|
||||
self.ts_rel_fns = int(ts_fns)
|
||||
self.ts_updated = True
|
||||
|
||||
def set_ts_64_ns(self, t):
|
||||
self.set_ts_64(t*2**16)
|
||||
def set_ts_rel_64(self, ts):
|
||||
ts = int(ts)
|
||||
self.set_ts_rel(ts >> 16, (ts & 0xffff) << 16)
|
||||
|
||||
def set_ts_64_s(self, t):
|
||||
self.set_ts_64_ns(t*1e9)
|
||||
def set_ts_rel_ns(self, t):
|
||||
ts_fns, ts_ns = math.modf(t)
|
||||
ts_fns *= 2**16
|
||||
self.set_ts_rel(ts_ns, ts_fns)
|
||||
|
||||
def get_ts_64(self):
|
||||
return (self.ts_64_ns << 16) | self.ts_64_fns
|
||||
def set_ts_rel_s(self, t):
|
||||
self.set_ts_rel_ns(t*1e9)
|
||||
|
||||
def get_ts_64_ns(self):
|
||||
return self.get_ts_64()/2**16
|
||||
def get_ts_rel(self):
|
||||
return (self.ts_rel_ns, self.ts_rel_fns)
|
||||
|
||||
def get_ts_64_s(self):
|
||||
return self.get_ts_64()*1e-9
|
||||
def get_ts_rel_64(self):
|
||||
ts_ns, ts_fns = self.get_ts_rel()
|
||||
return (ts_ns << 16) | (ts_fns >> 16)
|
||||
|
||||
def get_ts_rel_ns(self):
|
||||
ts_ns, ts_fns = self.get_ts_rel()
|
||||
return ts_ns + ts_fns/2**16
|
||||
|
||||
def get_ts_rel_s(self):
|
||||
return self.get_ts_rel()*1e-9
|
||||
|
||||
def _handle_reset(self, state):
|
||||
if state:
|
||||
@@ -182,16 +187,16 @@ class PtpClock(Reset):
|
||||
self._run_cr.kill()
|
||||
self._run_cr = None
|
||||
|
||||
self.ts_96_s = 0
|
||||
self.ts_96_ns = 0
|
||||
self.ts_96_fns = 0
|
||||
self.ts_64_ns = 0
|
||||
self.ts_64_fns = 0
|
||||
self.ts_tod_s = 0
|
||||
self.ts_tod_ns = 0
|
||||
self.ts_tod_fns = 0
|
||||
self.ts_rel_ns = 0
|
||||
self.ts_rel_fns = 0
|
||||
self.drift_cnt = 0
|
||||
if self.ts_96 is not None:
|
||||
self.ts_96.value = 0
|
||||
if self.ts_64 is not None:
|
||||
self.ts_64.value = 0
|
||||
if self.ts_tod is not None:
|
||||
self.ts_tod.value = 0
|
||||
if self.ts_rel is not None:
|
||||
self.ts_rel.value = 0
|
||||
if self.ts_step is not None:
|
||||
self.ts_step.value = 0
|
||||
if self.pps is not None:
|
||||
@@ -215,35 +220,35 @@ class PtpClock(Reset):
|
||||
self.pps.value = 0
|
||||
|
||||
# increment 96 bit timestamp
|
||||
if self.ts_96 is not None or self.pps is not None:
|
||||
t = ((self.ts_96_ns << 16) + self.ts_96_fns) + ((self.period_ns << 16) + self.period_fns)
|
||||
if self.ts_tod is not None or self.pps is not None:
|
||||
t = ((self.ts_tod_ns << 16) + self.ts_tod_fns) + ((self.period_ns << 16) + self.period_fns)
|
||||
|
||||
if self.drift_denom and self.drift_cnt == 0:
|
||||
t += self.drift_num
|
||||
|
||||
if t > (1000000000 << 16):
|
||||
self.ts_96_s += 1
|
||||
self.ts_tod_s += 1
|
||||
t -= (1000000000 << 16)
|
||||
if self.pps is not None:
|
||||
self.pps.value = 1
|
||||
|
||||
self.ts_96_fns = t & 0xffff
|
||||
self.ts_96_ns = t >> 16
|
||||
self.ts_tod_fns = t & 0xffff
|
||||
self.ts_tod_ns = t >> 16
|
||||
|
||||
if self.ts_96 is not None:
|
||||
self.ts_96.value = (self.ts_96_s << 48) | (self.ts_96_ns << 16) | (self.ts_96_fns)
|
||||
if self.ts_tod is not None:
|
||||
self.ts_tod.value = (self.ts_tod_s << 48) | (self.ts_tod_ns << 16) | (self.ts_tod_fns)
|
||||
|
||||
# increment 64 bit timestamp
|
||||
if self.ts_64 is not None:
|
||||
t = ((self.ts_64_ns << 16) + self.ts_64_fns) + ((self.period_ns << 16) + self.period_fns)
|
||||
if self.ts_rel is not None:
|
||||
t = ((self.ts_rel_ns << 16) + self.ts_rel_fns) + ((self.period_ns << 16) + self.period_fns)
|
||||
|
||||
if self.drift_denom and self.drift_cnt == 0:
|
||||
t += self.drift_num
|
||||
|
||||
self.ts_64_fns = t & 0xffff
|
||||
self.ts_64_ns = t >> 16
|
||||
self.ts_rel_fns = t & 0xffff
|
||||
self.ts_rel_ns = t >> 16
|
||||
|
||||
self.ts_64.value = (self.ts_64_ns << 16) | self.ts_64_fns
|
||||
self.ts_rel.value = (self.ts_rel_ns << 16) | self.ts_rel_fns
|
||||
|
||||
if self.drift_denom:
|
||||
if self.drift_cnt > 0:
|
||||
@@ -254,10 +259,10 @@ class PtpClock(Reset):
|
||||
|
||||
class PtpClockSimTime:
|
||||
|
||||
def __init__(self, ts_96=None, ts_64=None, pps=None, clock=None, *args, **kwargs):
|
||||
def __init__(self, ts_tod=None, ts_rel=None, pps=None, clock=None, *args, **kwargs):
|
||||
self.log = logging.getLogger(f"cocotb.eth.{type(self).__name__}")
|
||||
self.ts_96 = ts_96
|
||||
self.ts_64 = ts_64
|
||||
self.ts_tod = ts_tod
|
||||
self.ts_rel = ts_rel
|
||||
self.pps = pps
|
||||
self.clock = clock
|
||||
|
||||
@@ -268,41 +273,48 @@ class PtpClockSimTime:
|
||||
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
self.ts_96_s = 0
|
||||
self.ts_96_ns = 0
|
||||
self.ts_96_fns = 0
|
||||
self.ts_tod_s = 0
|
||||
self.ts_tod_ns = 0
|
||||
self.ts_tod_fns = 0
|
||||
|
||||
self.ts_64_ns = 0
|
||||
self.ts_64_fns = 0
|
||||
self.ts_rel_ns = 0
|
||||
self.ts_rel_fns = 0
|
||||
|
||||
self.last_ts_96_s = 0
|
||||
self.last_ts_tod_s = 0
|
||||
|
||||
if self.ts_96 is not None:
|
||||
self.ts_96.setimmediatevalue(0)
|
||||
if self.ts_64 is not None:
|
||||
self.ts_64.setimmediatevalue(0)
|
||||
if self.ts_tod is not None:
|
||||
self.ts_tod.setimmediatevalue(0)
|
||||
if self.ts_rel is not None:
|
||||
self.ts_rel.setimmediatevalue(0)
|
||||
if self.pps is not None:
|
||||
self.pps.value = 0
|
||||
|
||||
self._run_cr = cocotb.start_soon(self._run())
|
||||
|
||||
def get_ts_96(self):
|
||||
return (self.ts_96_s << 48) | (self.ts_96_ns << 16) | self.ts_96_fns
|
||||
def get_ts_tod(self):
|
||||
return (self.ts_tod_s, self.ts_tod_ns, self.ts_tod_fns)
|
||||
|
||||
def get_ts_96_ns(self):
|
||||
return self.ts_96_s*1e9+self.ts_96_ns+self.ts_96_fns/2**16
|
||||
def get_ts_tod_96(self):
|
||||
ts_s, ts_ns, ts_fns = self.get_ts_tod()
|
||||
return (ts_s << 48) | (ts_ns << 16) | ts_fns
|
||||
|
||||
def get_ts_96_s(self):
|
||||
return self.get_ts_96_ns()*1e-9
|
||||
def get_ts_tod_ns(self):
|
||||
ts_s, ts_ns, ts_fns = self.get_ts_tod()
|
||||
return ts_s*1e9+ts_ns+ts_fns/2**16
|
||||
|
||||
def get_ts_64(self):
|
||||
return (self.ts_64_ns << 16) | self.ts_64_fns
|
||||
def get_ts_rel(self):
|
||||
return (self.ts_rel_ns, self.ts_rel_fns)
|
||||
|
||||
def get_ts_64_ns(self):
|
||||
return self.get_ts_64()/2**16
|
||||
def get_ts_rel_64(self):
|
||||
ts_ns, ts_fns = self.get_ts_rel()
|
||||
return (ts_ns << 16) | (ts_fns >> 16)
|
||||
|
||||
def get_ts_64_s(self):
|
||||
return self.get_ts_64()*1e-9
|
||||
def get_ts_rel_ns(self):
|
||||
ts_ns, ts_fns = self.get_ts_rel()
|
||||
return ts_ns + ts_fns/2**16
|
||||
|
||||
def get_ts_rel_s(self):
|
||||
return self.get_ts_rel()*1e-9
|
||||
|
||||
async def _run(self):
|
||||
clock_edge_event = RisingEdge(self.clock)
|
||||
@@ -310,21 +322,21 @@ class PtpClockSimTime:
|
||||
while True:
|
||||
await clock_edge_event
|
||||
|
||||
self.ts_64_fns, self.ts_64_ns = math.modf(get_sim_time('ns'))
|
||||
self.ts_rel_fns, self.ts_rel_ns = math.modf(get_sim_time('ns'))
|
||||
|
||||
self.ts_64_ns = int(self.ts_64_ns)
|
||||
self.ts_64_fns = int(self.ts_64_fns*0x10000)
|
||||
self.ts_rel_ns = int(self.ts_rel_ns)
|
||||
self.ts_rel_fns = int(self.ts_rel_fns*0x10000)
|
||||
|
||||
self.ts_96_s, self.ts_96_ns = divmod(self.ts_64_ns, 1000000000)
|
||||
self.ts_96_fns = self.ts_64_fns
|
||||
self.ts_tod_s, self.ts_tod_ns = divmod(self.ts_rel_ns, 1000000000)
|
||||
self.ts_tod_fns = self.ts_rel_fns
|
||||
|
||||
if self.ts_96 is not None:
|
||||
self.ts_96.value = (self.ts_96_s << 48) | (self.ts_96_ns << 16) | self.ts_96_fns
|
||||
if self.ts_tod is not None:
|
||||
self.ts_tod.value = (self.ts_tod_s << 48) | (self.ts_tod_ns << 16) | self.ts_tod_fns
|
||||
|
||||
if self.ts_64 is not None:
|
||||
self.ts_64.value = (self.ts_64_ns << 16) | self.ts_64_fns
|
||||
if self.ts_rel is not None:
|
||||
self.ts_rel.value = (self.ts_rel_ns << 16) | self.ts_rel_fns
|
||||
|
||||
if self.pps is not None:
|
||||
self.pps.value = int(self.last_ts_96_s != self.ts_96_s)
|
||||
self.pps.value = int(self.last_ts_tod_s != self.ts_tod_s)
|
||||
|
||||
self.last_ts_96_s = self.ts_96_s
|
||||
self.last_ts_tod_s = self.ts_tod_s
|
||||
|
||||
Reference in New Issue
Block a user