Compare commits

..

No commits in common. "ecc33261a2890b460764489e3b4f532138c9dcbe" and "8179bdb629c8709c273a2660edb8e1770eb9cfac" have entirely different histories.

3 changed files with 21 additions and 108 deletions

View file

@ -1,11 +1,10 @@
import math, time, sys import math, time, sys
def _connect(ifc): def _connect(ifc):
global _ifc, acmd, rfifo, menable global _ifc, acmd, rfifo
_ifc = ifc _ifc = ifc
acmd = ifc.acmd acmd = ifc.acmd
rfifo = ifc.rfifo rfifo = ifc.rfifo
menable = ifc.menable
def degCβ(a, R1=10e3, R25=10e3, B25=3940, res=0x1000): def degCβ(a, R1=10e3, R25=10e3, B25=3940, res=0x1000):
if not a: if not a:
@ -68,38 +67,6 @@ def HK4_LEIA_fmt(s, i, n, d):
Tpa0 = {d[5]:6.2f} °C, Tpa1= {d[6]:6.2f} °C, Tpa2 = {d[7]:6.2f} °C. Tpa0 = {d[5]:6.2f} °C, Tpa1= {d[6]:6.2f} °C, Tpa2 = {d[7]:6.2f} °C.
""" """
def HK3_THHOR_fmt(s, i, n, d):
return f"""{i}. {n}
VssP = {d[0]:6.3f} V,
Vcore = {d[1]:6.3f} V,
Vcc = {d[2]:6.3f} V,
Vprim = {d[3]:6.2f} V,
"""
def HK4_THHOR_fmt(s, i, n, d):
return f"""{i}. {n}
VccP = {d[0]:6.3f} V,
VssS = {d[1]:6.3f} V,
VccS = {d[2]:6.3f} V,
Vpll = {d[3]:6.3f} V,
"""
def HK5_THHOR_fmt(s, i, n, d):
return f"""{i}. {n}
Ibias = {d[0]:6.1f} nA,
Vbias = {d[1]:6.1f} V,
Vdig = {d[2]:6.3f} V,
Vss = {d[3]:6.3f} V,
"""
def HK7_THHOR_fmt(s, i, n, d):
return f"""{i}. {n}
Tpa1 = {d[0]:6.2f} °C,
Tpa2 = {d[1]:6.2f} °C,
Tpa3 = {d[2]:6.2f} °C,
Tfpga = {d[3]:6.2f} °C,
"""
class DORN_CONFIG: class DORN_CONFIG:
# stis_ana_core 2×24 ch # stis_ana_core 2×24 ch
dorn_addr = 0x2000 dorn_addr = 0x2000
@ -157,8 +124,7 @@ class DORN_CONFIG:
def m_trigs(self): def m_trigs(self):
return (1 << self.n_trigs()) - 1 return (1 << self.n_trigs()) - 1
NTC = [dict(R1=10e3, R25=10e3, B25=3940, res=0x1000), NTC = [dict(R1=10e3, R25=10e3, B25=3940, res=0x1000)]
dict(R1=22e3, R25=10e3, B25=3940, res=0x1000), ]
HK4_SETH = [ HK4_SETH = [
[ [
@ -268,54 +234,16 @@ class DORN_CONFIG:
self.HK[3] = ("HK_AD", self.HK3_LEIA, HK3_LEIA_fmt) self.HK[3] = ("HK_AD", self.HK3_LEIA, HK3_LEIA_fmt)
self.HK[4] = ("HK_PA", self.HK4_LEIA, HK4_LEIA_fmt) self.HK[4] = ("HK_PA", self.HK4_LEIA, HK4_LEIA_fmt)
NTC_THHOR = (degC, dict(idx=1))
HK_THHOR = [
("V₃",
[[
("VssP", 2.5, ("VccP", -1.5)),
("Vcore", 1),
("Vcc", 2.505),
("Vprim", 11),
]],
HK3_THHOR_fmt),
("V₄",
[[
("VccP", 2),
("VssS", 2.5, ("VccS", -1.5)),
("VccS", 2),
("Vpll", 1.0012),
]],
HK4_THHOR_fmt),
("V₅,Ibias",
[[
("Ibias", 10470/470 * 51/1051 * 100, -7),
("Vbias", -8850/220, ("Vss", -8850/470)),
("Vdig", 2),
("Vss", 2.5034, ("Vcc", -1.505)),
]],
HK5_THHOR_fmt),
("Vref", None, HK_fmt),
("NTC",
[[
("Tpa0", NTC_THHOR),
("Tpa1", NTC_THHOR),
("Tpa2", NTC_THHOR),
("Tfpga", NTC_THHOR),
]],
HK7_THHOR_fmt),
]
def thhor(self): def thhor(self):
self.slices=(0,) self.slices=(0,)
self.n_channels = 12 self.n_channels = 12
self.VREF = [3.359] # ADC supply voltage self.NTC = [dict(R1=22e3, R25=10e3, B25=3940, res=0x1000)]
self.HK[3:] = self.HK_THHOR
CONFIG = DORN_CONFIG() CONFIG = DORN_CONFIG()
def hk(sl=0, what="print", data=None): def hk(sl=0, what="print", data=None):
if not data: if not data:
menable() _ifc.menable()
fifo_enable(en=True, sl=sl, hk=True) fifo_enable(en=True, sl=sl, hk=True)
fifo_reset(sl=sl, hk=True) fifo_reset(sl=sl, hk=True)
strobe(sl=sl, hk=True) strobe(sl=sl, hk=True)
@ -347,7 +275,6 @@ def hk(sl=0, what="print", data=None):
Vref = CONFIG.Vref(sl)/4096 Vref = CONFIG.Vref(sl)/4096
ddata = [] ddata = []
VV = {"Vref": CONFIG.Vref(sl)} VV = {"Vref": CONFIG.Vref(sl)}
deferred = []
for a in range(8): for a in range(8):
V = {} V = {}
ddata.append(V) ddata.append(V)
@ -358,38 +285,26 @@ def hk(sl=0, what="print", data=None):
# (name, factor, (offset_name, factor)) # (name, factor, (offset_name, factor))
# (name, (func, {args})) # (name, (func, {args}))
if not HK: if not HK:
V.update({c:data[a][c] for c in range(ND)}) V.update({c:data[a][c] for c in range(8)})
continue continue
HK = HK[sl % len(HK)] HK = HK[sl % len(HK)]
for c in range(ND): for c in range(8):
H = HK[c] H = HK[c]
if len(H) > 1: if len(H) > 1:
if isinstance(H[1], tuple): if isinstance(H[1], tuple):
data[a][c] = H[1][0](data[a][c], **H[1][1]) data[a][c] = H[1][0](data[a][c], **H[1][1])
else: else:
data[a][c] *= Vref*H[1] data[a][c] *= Vref*H[1]
if len(H) > 2 and not isinstance(H[2], tuple): V[H[0]] = data[a][c]
data[a][c] += H[2]
if len(H) <= 2 or not isinstance(H[2], tuple):
V[H[0]] = data[a][c]
ddata[a][H[0]] = data[a][c]
else:
deferred.append((a,c,H))
VV.update(V) VV.update(V)
while deferred: for c in range(8):
ndef = [] H = HK[c]
nn = len(deferred) if len(H) > 2:
for a,c,H in deferred: if isinstance(H[2], tuple):
if H[2][0] in VV: data[a][c] += VV[H[2][0]] * H[2][1]
data[a][c] += VV[H[2][0]] * H[2][1] else:
VV[H[0]] = data[a][c] data[a][c] += H[2]
ddata[a][H[0]] = data[a][c] V[H[0]] = data[a][c]
else:
ndef.append((a,c,H))
deferred = ndef
if len(deferred) >= nn:
print("Unresolved offsets", repr(deferred), VV, file=sys.stderr)
break
if what=="cooked": if what=="cooked":
return sl, data return sl, data
@ -616,8 +531,8 @@ def print_trigger_config():
ff = [dorn_config(0x084+i) for i in range(4)] ff = [dorn_config(0x084+i) for i in range(4)]
tri.append(ff) tri.append(ff)
e = ff[3] e = ff[3]
df = [acmd(0x11+i) for i in range(3)] df = [_ifc.Areg(0x11+i) for i in range(3)]
df.append(acmd(5)) df.append(_ifc.Areg(5))
tri.append(df) tri.append(df)
ct0 = tri[0][0] | (tri[0][1]<<16) & 0xff0000 ct0 = tri[0][0] | (tri[0][1]<<16) & 0xff0000
ct1 = tri[1][0] | (tri[1][1]<<16) & 0xff0000 ct1 = tri[1][0] | (tri[1][1]<<16) & 0xff0000
@ -645,7 +560,7 @@ fifos enable SA/EV/HK HI {(e>>7)&7:03b} {(e>>10)&7:03b} {(e>>6)&1}
def read_event(sl=None, ev=None): def read_event(sl=None, ev=None):
if ev is None: if ev is None:
fifo_read(sl=sl, ev=True) fifo_read(sl=sl, ev=True)
ev = rfifo(2) ev = _ifc._read_fifo(2)
if (ev[0] & 0xfffc) != 0x5718: if (ev[0] & 0xfffc) != 0x5718:
raise ValueError(f"EV packet magic mismatch {ev[0]:04x}") raise ValueError(f"EV packet magic mismatch {ev[0]:04x}")
Ba = ev[5] Ba = ev[5]

View file

@ -402,8 +402,7 @@ class dose_cmd(uart.uart):
c = bytes((n, z)) + c + bytes(14) c = bytes((n, z)) + c + bytes(14)
r, e, d = self.cmd("C", c[:16]) r, e, d = self.cmd("C", c[:16])
s = int2flags(self.FPGA_FLGS, d[0]) s = int2flags(self.FPGA_FLGS, d[0])
if self._verbose: print(f"FPGA cmd status {s!r}", file=sys.stderr)
print(f"FPGA cmd status {s!r}", file=sys.stderr)
return d return d
def fpga_config(self, filename="../fpga/quartus/thhor_crs.rbf"): def fpga_config(self, filename="../fpga/quartus/thhor_crs.rbf"):
@ -506,8 +505,7 @@ class dose_cmd(uart.uart):
nnn -= nn nnn -= nn
d += dd[2:] d += dd[2:]
r = struct.unpack(f">{len(d)//2}H", d)[:n] r = struct.unpack(f">{len(d)//2}H", d)[:n]
if self._verbose: print(f"FIFO[{fifo}] ← {[f"{rr:04x}" for rr in r]}", file=sys.stderr)
print(f"FIFO[{fifo}] ← {[f"{rr:04x}" for rr in r]}", file=sys.stderr)
return r return r
def pressure(self, data=None, cmd="BATE", fifo=1): def pressure(self, data=None, cmd="BATE", fifo=1):

View file

@ -2044,7 +2044,7 @@ footprint=C0603
T 40000 52750 5 10 1 1 90 4 1 T 40000 52750 5 10 1 1 90 4 1
refdes=R50 refdes=R50
T 39850 52550 5 10 1 1 90 0 1 T 39850 52550 5 10 1 1 90 0 1
value=15 value=10
} }
C 40600 51400 1 90 0 capacitor-1.sym C 40600 51400 1 90 0 capacitor-1.sym
{ {