From 118c32715e33e1ebc8c40b742bc97fb938215d02 Mon Sep 17 00:00:00 2001
From: Andrew Peck <andrew.peck@cern.ch>
Date: Fri, 28 Oct 2022 14:39:11 -0400
Subject: [PATCH] use built-in l1a generator for fifo.py

---
 tamalero/FIFO.py | 58 ++++++++++--------------------------------------
 1 file changed, 12 insertions(+), 46 deletions(-)

diff --git a/tamalero/FIFO.py b/tamalero/FIFO.py
index 2d6b2ac..9d0c971 100644
--- a/tamalero/FIFO.py
+++ b/tamalero/FIFO.py
@@ -20,7 +20,7 @@ def just_read(rb, link, daq=True):
     # just keep the default trigger words
     fifo.set_trigger([0x0]*10, [0x0]*10)
     #fifo.reset()
-    #fifo.reset(l1a=True)
+    #fifo.reset()
     res = fifo.dump(block=255, format=True, daq=daq)
     return res
 
@@ -44,12 +44,14 @@ def just_read_daq(rb, link, lpgbt, fixed_pattern=False, trigger_rate=0, send_l1a
         print (f"Trigger rate is currently {rate} Hz")
     else:
         rb.kcu.write_node("READOUT_BOARD_%s.LPGBT.DAQ.DOWNLINK.DL_SRC"%rb.rb, 0x3)
-    fifo.reset(l1a=send_l1a)
+    fifo.reset()
     #time.sleep(5)  # might be useful if the L1A generator works
-    if l1a_count>1:
-        fifo.send_l1a(count=l1a_count-1)
+
+    if l1a_count>=1:
+        fifo.send_l1a(count=l1a_count)
+
     res = fifo.dump_daq(block=3000)
-    #fifo.reset(l1a=False)
+    #fifo.reset()
     if rb.kcu.firmware_version['minor'] >= 2 and rb.kcu.firmware_version['patch'] >= 3:
         #print ("Setting to ETROC data")
         fifo.use_etroc_data()
@@ -92,31 +94,15 @@ class FIFO:
             #print (f"Setting FIFO {i} to read from elink {link['elink']} and lpGBT {link['lpgbt']}.")  # This is too noisy
             self.rb.kcu.write_node("READOUT_BOARD_%s.FIFO_ELINK_SEL%i"%(self.rb.rb, i), link['elink'])
             self.rb.kcu.write_node("READOUT_BOARD_%s.FIFO_LPGBT_SEL%i"%(self.rb.rb, i), link['lpgbt'])
-        self.rb.kcu.write_node("READOUT_BOARD_%s.LPGBT.DAQ.DOWNLINK.DL_SRC"%self.rb.rb, 3)
+        self.rb.kcu.write_node("READOUT_BOARD_%s.LPGBT.DAQ.DOWNLINK.DL_SRC"%self.rb.rb, 0)
         #self.rb.kcu.write_node("READOUT_BOARD_%s.LPGBT.TRIG.DOWNLINK.DL_SRC"%self.rb.rb, 3)  # This does not exist (no trigger downlink)
 
-        for i in range(10):
-            try:
-                self.rb.kcu.write_node("READOUT_BOARD_%s.FIFO_TRIG%i"%(self.rb.rb, i), 0x00)
-                self.rb.kcu.write_node("READOUT_BOARD_%s.FIFO_TRIG%i_MASK"%(self.rb.rb, i), 0x00)
-            except:
-                # This is dangerous, but will work as long as the right address tables are loaded
-                pass
-
         with open(os.path.expandvars('$TAMALERO_BASE/configs/dataformat.yaml')) as f:
             self.dataformat = load(f, Loader=Loader)[ETROC]
 
         with open(os.path.expandvars('$TAMALERO_BASE/configs/fast_commands.yaml')) as f:
             self.fast_commands = load(f, Loader=Loader)[ETROC]
 
-        self.rb.kcu.write_node("READOUT_BOARD_%s.LPGBT.DAQ.DOWNLINK.FAST_CMD_IDLE"%self.rb.rb, self.fast_commands['IDLE'])
-        self.rb.kcu.write_node("READOUT_BOARD_%s.LPGBT.DAQ.DOWNLINK.FAST_CMD_DATA"%self.rb.rb, self.fast_commands['L1A'])
-
-        if ETROC == 'ETROC2':
-            self.rb.kcu.write_node("READOUT_BOARD_%s.FIFO_REVERSE_BITS"%self.rb.rb, 0x01)
-        elif ETROC == 'ETROC1':
-            self.rb.kcu.write_node("READOUT_BOARD_%s.FIFO_REVERSE_BITS"%self.rb.rb, 0x00)
-
     def turn_on_zero_surpress(self):
         self.rb.kcu.write_node("READOUT_BOARD_%s.ZERO_SUPRESS"%self.rb.rb, 0x1)
 
@@ -135,31 +121,12 @@ class FIFO:
         rate = self.rb.kcu.read_node("READOUT_BOARD_%s.L1A_RATE_CNT"%self.rb.rb).value()
         return rate
 
-    def set_trigger(self, words, masks):
-        assert len(words)==len(masks), "Number of trigger bytes and masks has to match"
-        for i, (word, mask) in enumerate(list(zip(words, masks))):
-            self.rb.kcu.write_node("READOUT_BOARD_%s.FIFO_TRIG%i"%(self.rb.rb, i), word)
-            self.rb.kcu.write_node("READOUT_BOARD_%s.FIFO_TRIG%i_MASK"%(self.rb.rb, i), mask)
-
     def send_l1a(self, count=1):
-        self.rb.kcu.write_node("READOUT_BOARD_%s.LPGBT.DAQ.DOWNLINK.FAST_CMD_DATA"%self.rb.rb, self.fast_commands['L1A'])
         for i in range(count):
-            self.rb.kcu.write_node("READOUT_BOARD_%s.LPGBT.DAQ.DOWNLINK.FAST_CMD_PULSE"%self.rb.rb, 0x01)
-
+            self.rb.kcu.write_node("READOUT_BOARD_%s.L1A_PULSE" % self.rb.rb, 1)
 
-    def reset(self, l1a=False):
-        # needs to be reset twice, dunno
+    def reset(self):
         self.rb.kcu.write_node("READOUT_BOARD_%s.FIFO_RESET"%self.rb.rb, 0x01)
-        self.rb.kcu.write_node("READOUT_BOARD_%s.FIFO_RESET"%self.rb.rb, 0x01)
-        #print(self.rb.kcu.read_node("READOUT_BOARD_%s.FIFO_ARMED"%self.rb.rb))
-        #print(self.rb.kcu.read_node("READOUT_BOARD_%s.FIFO_EMPTY"%self.rb.rb))
-        #self.rb.kcu.write_node("READOUT_BOARD_%s.FIFO_FORCE_TRIG" % self.rb.rb, 1)
-        if self.ETROC == 'ETROC2' and l1a:
-            self.rb.kcu.write_node("READOUT_BOARD_%s.LPGBT.DAQ.DOWNLINK.FAST_CMD_DATA"%self.rb.rb, self.fast_commands['L1A'])
-            self.rb.kcu.write_node("READOUT_BOARD_%s.LPGBT.DAQ.DOWNLINK.FAST_CMD_PULSE"%self.rb.rb, 0x01)  # FIXME confirm this
-        elif self.ETROC == 'ETROC2':
-            self.rb.kcu.write_node("READOUT_BOARD_%s.LPGBT.DAQ.DOWNLINK.FAST_CMD_IDLE"%self.rb.rb, self.fast_commands['IDLE'])
-            self.rb.kcu.write_node("READOUT_BOARD_%s.LPGBT.DAQ.DOWNLINK.FAST_CMD_PULSE"%self.rb.rb, 0x01)  # FIXME confirm this
 
     def make_word(self, bytes, reversed=False):
         if len(bytes) == 5 and not reversed:
@@ -186,8 +153,7 @@ class FIFO:
         return []
 
     def dump(self, block=255, format=True, daq=0):
-        # NOTE: format argument is kept for legacy, does not do anything here.
-        #self.rb.kcu.write_node("READOUT_BOARD_%s.LPGBT.DAQ.DOWNLINK.FAST_CMD_PULSE"%self.rb.rb, 0x01)  # FIXME this is not needed I think
+
         for i in range(10):
             if self.rb.kcu.read_node("READOUT_BOARD_%s.FIFO_EMPTY%i"%(self.rb.rb, daq)).value() < 1: break  # FIXME I'm lazy. This should be done for all (?) FIFOS
         res = self.rb.kcu.hw.getNode("DAQ_%i.FIFO"%daq).readBlock(block)
@@ -199,7 +165,7 @@ class FIFO:
             return []
 
     def dump_daq(self, block=255):
-        # NOTE: format argument is kept for legacy, does not do anything here.
+
         res = self.rb.kcu.hw.getNode("DAQ_RB0.FIFO").readBlock(block)
         try:
             self.rb.kcu.hw.dispatch()
-- 
GitLab