Add set_period, set_drift, set_period_ns, and get_period_ns methods to PtpClock
This commit is contained in:
@@ -24,6 +24,7 @@ THE SOFTWARE.
|
|||||||
|
|
||||||
import logging
|
import logging
|
||||||
import math
|
import math
|
||||||
|
from fractions import Fraction
|
||||||
|
|
||||||
import cocotb
|
import cocotb
|
||||||
from cocotb.triggers import RisingEdge, ReadOnly
|
from cocotb.triggers import RisingEdge, ReadOnly
|
||||||
@@ -91,6 +92,33 @@ class PtpClock(object):
|
|||||||
|
|
||||||
cocotb.fork(self._run())
|
cocotb.fork(self._run())
|
||||||
|
|
||||||
|
def set_period(self, ns, fns):
|
||||||
|
self.period_ns = int(ns)
|
||||||
|
self.period_fns = int(fns) & 0xffff
|
||||||
|
|
||||||
|
def set_drift(self, ns, fns, rate):
|
||||||
|
self.drift_ns = int(ns)
|
||||||
|
self.drift_fns = int(fns) & 0xffff
|
||||||
|
self.drift_rate = int(rate)
|
||||||
|
|
||||||
|
def set_period_ns(self, t):
|
||||||
|
drift, period = math.modf(t*2**16)
|
||||||
|
period = int(period)
|
||||||
|
frac = Fraction(drift).limit_denominator(2**16)
|
||||||
|
drift = frac.numerator
|
||||||
|
rate = frac.denominator
|
||||||
|
self.period_ns = period >> 16
|
||||||
|
self.period_fns = period & 0xffff
|
||||||
|
self.drift_ns = drift >> 16
|
||||||
|
self.drift_fns = drift & 0xffff
|
||||||
|
self.drift_rate = rate
|
||||||
|
|
||||||
|
def get_period_ns(self):
|
||||||
|
p = ((self.period_ns << 16) | self.period_fns) / 2**16
|
||||||
|
if self.drift_rate:
|
||||||
|
return p + ((self.drift_ns << 16) | self.drift_fns) / self.drift_rate / 2**16
|
||||||
|
return p
|
||||||
|
|
||||||
def set_ts_96(self, ts_s, ts_ns=None, ts_fns=None):
|
def set_ts_96(self, ts_s, ts_ns=None, ts_fns=None):
|
||||||
ts_s = int(ts_s)
|
ts_s = int(ts_s)
|
||||||
if ts_fns is not None:
|
if ts_fns is not None:
|
||||||
|
|||||||
Reference in New Issue
Block a user