Skip to content
This repository was archived by the owner on Dec 24, 2024. It is now read-only.

Commit 341f680

Browse files
committed
eda: consolidate RFM-sink type
1 parent f92ca51 commit 341f680

File tree

3 files changed

+47
-36
lines changed

3 files changed

+47
-36
lines changed

eda/device.go

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ const (
3737
nChans = 64
3838

3939
daqBufferSize = nRFM * (26 + nHR*(2+128*20))
40+
41+
nHdr = 8 // 'HDR\0+u32'
4042
)
4143

4244
const (
@@ -139,9 +141,6 @@ type Device struct {
139141
}
140142

141143
daq struct {
142-
cycleID [nRFM]uint32
143-
bcid48Offset uint32
144-
145144
rfm []rfmSink // DIF data sink, one per RFM
146145

147146
done chan int // signal to stop daq
@@ -151,12 +150,17 @@ type Device struct {
151150
}
152151

153152
type rfmSink struct {
154-
id uint8 // RFM/DIF ID
155-
slot int // EDA slot
156-
w *wbuf
157-
sck net.Conn
153+
id uint8 // RFM/DIF ID
154+
slot int // EDA slot
155+
w *wbuf
156+
buf []byte
157+
cycle uint32
158+
bcid uint32 // BCID48 offset
159+
sck net.Conn
158160
}
159161

162+
func (sink *rfmSink) valid() bool { return sink.id != 0 }
163+
160164
type Option func(*Device)
161165

162166
func WithThreshold(v uint32) Option {
@@ -248,7 +252,9 @@ func newDevice(devmem, odir, devshm, cfgdir string, opts ...Option) (*Device, er
248252
// setup RFMs indices from provided mask
249253
dev.rfms = nil
250254
dev.difs = make(map[int]uint8, nRFM)
255+
dev.daq.rfm = make([]rfmSink, nRFM)
251256
for i := 0; i < nRFM; i++ {
257+
dev.daq.rfm[i].buf = make([]byte, nHdr)
252258
if (dev.cfg.daq.rfm>>i)&1 == 1 {
253259
dev.rfms = append(dev.rfms, i)
254260
dev.difs[i] = difIDFrom(dev.id, i)
@@ -312,7 +318,9 @@ func NewDevice(fname string, odir string, opts ...Option) (*Device, error) {
312318

313319
// setup RFMs indices from provided mask
314320
dev.rfms = nil
321+
dev.daq.rfm = make([]rfmSink, nRFM)
315322
for i := 0; i < nRFM; i++ {
323+
dev.daq.rfm[i].buf = make([]byte, nHdr)
316324
if (dev.cfg.daq.rfm>>i)&1 == 1 {
317325
dev.rfms = append(dev.rfms, i)
318326
}
@@ -422,7 +430,6 @@ func (dev *Device) configureFromCSV() error {
422430

423431
func (dev *Device) Initialize() error {
424432
if len(dev.cfg.daq.addrs) != 0 {
425-
dev.daq.rfm = make([]rfmSink, len(dev.rfms))
426433
dev.msg.Printf("initialize rfm sinks: %v", dev.rfms)
427434
for i := range dev.rfms {
428435
dev.serveRFM(i, dev.cfg.daq.addrs[i])
@@ -900,15 +907,13 @@ func (dev *Device) loop() {
900907
}
901908

902909
func (dev *Device) loopDCC() {
903-
const nHdr = 8 // 'HDR\0+u32'
904910
var (
905911
w = dev.msg.Writer()
906912
printf = fmt.Fprintf
907913
errorf = func(format string, args ...interface{}) {
908914
dev.err = fmt.Errorf(format, args...)
909915
dev.msg.Printf("%+v", dev.err)
910916
}
911-
buf = make([][]byte, len(dev.daq.rfm))
912917
cycle int
913918
err error
914919
)
@@ -919,7 +924,6 @@ func (dev *Device) loopDCC() {
919924
if rfm.sck == nil {
920925
continue
921926
}
922-
buf[i] = make([]byte, nHdr)
923927
defer rfm.sck.Close()
924928
}
925929
}
@@ -974,9 +978,12 @@ func (dev *Device) loopDCC() {
974978
printf(w, "tx-")
975979
var grp errgroup.Group
976980
for i := range dev.daq.rfm {
981+
if !dev.daq.rfm[i].valid() {
982+
continue
983+
}
977984
ii := i
978985
grp.Go(func() error {
979-
err := dev.daqSendDIFData(ii, buf[ii])
986+
err := dev.daqSendDIFData(ii)
980987
if err != nil {
981988
errorf("eda: could not send DIF data (RFM=%d): %w", dev.rfms[ii], err)
982989
return err
@@ -1003,26 +1010,23 @@ func (dev *Device) loopDCC() {
10031010
}
10041011

10051012
func (dev *Device) loopInj() {
1006-
const nHdr = 8 // 'HDR\0+u32'
10071013
var (
10081014
w = dev.msg.Writer()
10091015
printf = fmt.Fprintf
10101016
errorf = func(format string, args ...interface{}) {
10111017
dev.err = fmt.Errorf(format, args...)
10121018
dev.msg.Printf("%+v", dev.err)
10131019
}
1014-
buf = make([][]byte, len(dev.daq.rfm))
10151020
cycle int
10161021
err error
10171022
)
10181023

10191024
if len(dev.daq.rfm) != 0 {
10201025
for i := range dev.daq.rfm {
10211026
rfm := &dev.daq.rfm[i]
1022-
if rfm.sck == nil {
1027+
if !rfm.valid() {
10231028
continue
10241029
}
1025-
buf[i] = make([]byte, nHdr)
10261030
defer rfm.sck.Close()
10271031
}
10281032
}
@@ -1073,9 +1077,12 @@ func (dev *Device) loopInj() {
10731077
printf(w, "tx-")
10741078
var grp errgroup.Group
10751079
for i := range dev.daq.rfm {
1080+
if !dev.daq.rfm[i].valid() {
1081+
continue
1082+
}
10761083
ii := i
10771084
grp.Go(func() error {
1078-
err := dev.daqSendDIFData(ii, buf[ii])
1085+
err := dev.daqSendDIFData(ii)
10791086
if err != nil {
10801087
errorf("eda: could not send DIF data (RFM=%d): %w", dev.rfms[ii], err)
10811088
return err
@@ -1263,7 +1270,7 @@ func (dev *Device) DumpCounters(w io.Writer, rfm int) error {
12631270
printf("#cycle_id;cnt_hit0;cnt_hit1;trig;")
12641271
printf("cnt48_msb;cnt48_lsb;cnt24\n")
12651272
printf("%d;%d;%d;%d;",
1266-
dev.daq.cycleID[rfm],
1273+
dev.daq.rfm[rfm].cycle,
12671274
dev.cntHit0(rfm),
12681275
dev.cntHit1(rfm),
12691276
dev.cntTrig(),

eda/pio.go

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1829,7 +1829,7 @@ func difIDFrom(id uint32, rfm int) byte {
18291829
return difIDOffset + byte(id&7)<<3 + byte(rfm)&3
18301830
}
18311831

1832-
func (dev *Device) daqWriteDIFData(w io.Writer, rfm int) {
1832+
func (dev *Device) daqWriteDIFData(w io.Writer, slot int) {
18331833
var (
18341834
wU8 = func(v uint8) {
18351835
dev.buf[0] = v
@@ -1843,26 +1843,29 @@ func (dev *Device) daqWriteDIFData(w io.Writer, rfm int) {
18431843
binary.BigEndian.PutUint32(dev.buf[:4], v)
18441844
_, _ = w.Write(dev.buf[:4])
18451845
}
1846+
rfm = &dev.daq.rfm[slot]
1847+
fifo = &dev.regs.fifo.daq[slot]
18461848
)
18471849

18481850
// offset
1849-
if dev.daq.cycleID[rfm] == 0 {
1850-
dev.daq.bcid48Offset = dev.cntBCID48LSB() - dev.cntBCID24()
1851+
if rfm.cycle == 0 {
1852+
rfm.bcid = dev.cntBCID48LSB() - dev.cntBCID24()
18511853
}
1854+
bcid48Offset := rfm.bcid
18521855

18531856
// DIF DAQ header
18541857
wU8(0xB0)
1855-
wU8(dev.difs[rfm])
1858+
wU8(dev.difs[slot])
18561859
// counters
1857-
wU32(dev.daq.cycleID[rfm] + 1) // FIXME(sbinet): off-by-one ?
1858-
wU32(dev.cntHit0(rfm))
1860+
wU32(rfm.cycle + 1) // FIXME(sbinet): off-by-one ?
1861+
wU32(dev.cntHit0(slot))
18591862
//wU32(dev.cntHit1(rfm)) // FIXME(sbinet): hack
1860-
wU32(dev.daq.cycleID[rfm] + 1) // FIXME(sbinet): hack (and off-by-one?)
1863+
wU32(rfm.cycle + 1) // FIXME(sbinet): hack (and off-by-one?)
18611864
// assemble and correct absolute BCID
18621865
bcid48 := uint64(dev.cntBCID48MSB())
18631866
bcid48 <<= 32
18641867
bcid48 |= uint64(dev.cntBCID48LSB())
1865-
bcid48 -= uint64(dev.daq.bcid48Offset)
1868+
bcid48 -= uint64(bcid48Offset)
18661869
// copy frame
18671870
wU16(uint16(bcid48>>32) & 0xffff)
18681871
wU32(uint32(bcid48))
@@ -1880,11 +1883,11 @@ func (dev *Device) daqWriteDIFData(w io.Writer, rfm int) {
18801883
wU8(0xB4) // HR header
18811884

18821885
const nWordsPerHR = 5
1883-
n := int(dev.daqFIFOFillLevel(rfm) / nWordsPerHR)
1886+
n := int(dev.daqFIFOFillLevel(slot) / nWordsPerHR)
18841887

18851888
for i := 0; i < n; i++ {
18861889
// read HR ID
1887-
id := dev.regs.fifo.daq[rfm].r()
1890+
id := fifo.r()
18881891
hrID = int(id >> 24)
18891892
// insert trailer and header if new hardroc ID
18901893
if hrID != lastHR {
@@ -1894,22 +1897,23 @@ func (dev *Device) daqWriteDIFData(w io.Writer, rfm int) {
18941897
}
18951898
}
18961899
wU32(id)
1897-
wU32(dev.regs.fifo.daq[rfm].r())
1898-
wU32(dev.regs.fifo.daq[rfm].r())
1899-
wU32(dev.regs.fifo.daq[rfm].r())
1900-
wU32(dev.regs.fifo.daq[rfm].r())
1900+
wU32(fifo.r())
1901+
wU32(fifo.r())
1902+
wU32(fifo.r())
1903+
wU32(fifo.r())
19011904
lastHR = hrID
19021905
}
19031906
wU8(0xA3) // last HR trailer
19041907
wU8(0xA0) // DIF DAQ trailer
19051908
wU16(0xC0C0) // fake CRC
19061909

1907-
dev.daq.cycleID[rfm]++
1910+
rfm.cycle++
19081911
}
19091912

1910-
func (dev *Device) daqSendDIFData(i int, buf []byte) error {
1913+
func (dev *Device) daqSendDIFData(i int) error {
19111914
var (
19121915
sink = &dev.daq.rfm[i]
1916+
buf = sink.buf
19131917
w = sink.w
19141918
sck = sink.sck
19151919
)

eda/pio_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -850,7 +850,6 @@ func TestDAQSendDIFData(t *testing.T) {
850850
},
851851
} {
852852
t.Run(tc.name, func(t *testing.T) {
853-
buf := make([]byte, 8)
854853
dev := &Device{
855854
msg: log.New(ioutil.Discard, "eda: ", 0),
856855
buf: make([]byte, 4),
@@ -862,10 +861,11 @@ func TestDAQSendDIFData(t *testing.T) {
862861
p: make([]byte, daqBufferSize),
863862
c: 66,
864863
},
864+
buf: make([]byte, 8),
865865
sck: sck,
866866
},
867867
}
868-
err := dev.daqSendDIFData(0, buf)
868+
err := dev.daqSendDIFData(0)
869869
switch {
870870
case err == nil && tc.err == nil:
871871
// ok.

0 commit comments

Comments
 (0)