#include "CruConfig.h" CruConfig::CruConfig(int32_t configType, uint32_t debuglevel) { fdebuglevel = debuglevel; fconfigType = configType; } CruConfig::~CruConfig() { } uint32_t CruConfig::getState(uint32_t side, uint32_t sector, uint32_t partition, uint32_t cru){ // State of the CRU (on/off). By default all CRUs are on. uint32_t retval = 1; return retval; } uint32_t CruConfig::getGFD_LINK_ACTIVE(uint32_t side, uint32_t sector, uint32_t partition, uint32_t cru){ // Return the 24-bit mask with all active input links for this CRU (before link selector) uint32_t retval = 0x0; if ( partition == 0 ) retval = 0x07F0FF; else if ( partition == 1 ) retval = 0x1FF1FF; else if ( partition == 2 ) retval = 0x1FF1FF; else if ( partition == 3 ) retval = 0x3FF3FF; else if ( partition == 4 ) retval = 0x3FF3FF; ///////////////// // Link swaps ///////////////// // A04 RP3 A3 slave link if ( (side == 0) && (sector == 4) && (partition == 3) && (cru == 1) ) retval = 0x3FF7F7; // A07 RP2 B1 slave link if ( (side == 0) && (sector == 7) && (partition == 2) && (cru == 1) ) retval = 0x5FD1FF; // A09 RP1 A4 slave link if ( (side == 0) && (sector == 9) && (partition == 1) && (cru == 1) ) retval = 0x1FF5EF; // A09 RP4 A6 slave link if ( (side == 0) && (sector == 9) && (partition == 4) && (cru == 1) ) retval = 0x3FF7BF; // A11 RP2 B0 slave link if ( (side == 0) && (sector == 11) && (partition == 2) && (cru == 1) ) retval = 0x5FE1FF; // A12 RP1 B1 slave link if ( (side == 0) && (sector == 12) && (partition == 1) && (cru == 1) ) retval = 0x5FD1FF; // A15 RP3 A2 master link if ( (side == 0) && (sector == 15) && (partition == 3) && (cru == 0) ) retval = 0x3FF7FB; // A17 RP3 A1 master link if ( (side == 0) && (sector == 17) && (partition == 3) && (cru == 0) ) retval = 0x3FF7FD; // C03 RP3 A7 master link if ( (side == 1) && (sector == 3) && (partition == 3) && (cru == 0) ) retval = 0x3FF77F; // C07 RP3 B1 slave link if ( (side == 1) && (sector == 7) && (partition == 3) && (cru == 1) ) retval = 0x7FD3FF; return retval; } uint32_t CruConfig::getGFD_STRICT_SYNC(uint32_t side, uint32_t sector, uint32_t partition, uint32_t cru){ // Default: No strict sync return 0; } uint32_t CruConfig::getGFD_ENABLE_MASK(uint32_t side, uint32_t sector, uint32_t partition, uint32_t cru){ // Default: Enable on SOC/SOT (= bit 2) return 0x4; } uint32_t CruConfig::getGFD_STREAM_MASK(uint32_t side, uint32_t sector, uint32_t partition, uint32_t cru){ // Default: All 5 streams enabled return 0x1F; } uint32_t CruConfig::getON_LINK(uint32_t side, uint32_t sector, uint32_t partition, uint32_t cru){ // ON_LINK = Link mask (after link selector, 20 bit) uint32_t retval = 0x0; // This is after the link selector, so fiber swaps dont matter here. if ( partition == 0 ) retval = 0x1FCFF; else if ( partition == 1 ) retval = 0x7FDFF; else if ( partition == 2 ) retval = 0x7FDFF; else if ( partition == 3 ) retval = 0xFFFFF; else if ( partition == 4 ) retval = 0xFFFFF; // If one link is permanently unusable, it can be set here return retval; } uint32_t CruConfig::getLINK_SELECTOR_A(uint32_t side, uint32_t sector, uint32_t partition, uint32_t cru){ // Link selector configuration for branch A uint32_t retval = 0x0; ///////////////// // Link swaps ///////////////// // A04 RP3 A3 slave link if ( (side == 0) && (sector == 4) && (partition == 3) && (cru == 1) ) { uint32_t badlink = 3; uint32_t usedspare = 0x1; // 1 = link 10. 2 = link 11. retval = usedspare << 2*badlink; } // A09 RP1 A4 slave link if ( (side == 0) && (sector == 9) && (partition == 1) && (cru == 1) ) { uint32_t badlink = 4; uint32_t usedspare = 0x1; // 1 = link 10. 2 = link 11. retval = usedspare << 2*badlink; } // A09 RP4 A6 slave link if ( (side == 0) && (sector == 9) && (partition == 4) && (cru == 1) ) { uint32_t badlink = 6; uint32_t usedspare = 0x1; // 1 = link 10. 2 = link 11. retval = usedspare << 2*badlink; } // A15 RP3 A2 master link if ( (side == 0) && (sector == 15) && (partition == 3) && (cru == 0) ) { uint32_t badlink = 2; uint32_t usedspare = 0x1; // 1 = link 10. 2 = link 11. retval = usedspare << 2*badlink; } // A17 RP3 A1 master link if ( (side == 0) && (sector == 17) && (partition == 3) && (cru == 0) ) { uint32_t badlink = 1; uint32_t usedspare = 0x1; // 1 = link 10. 2 = link 11. retval = usedspare << 2*badlink; } // C03 RP3 A7 master link if ( (side == 1) && (sector == 3) && (partition == 3) && (cru == 0) ) { uint32_t badlink = 7; uint32_t usedspare = 0x1; // 1 = link 10. 2 = link 11. retval = usedspare << 2*badlink; } return retval; } uint32_t CruConfig::getLINK_SELECTOR_B(uint32_t side, uint32_t sector, uint32_t partition, uint32_t cru){ // Link selector configuration for branch B uint32_t retval = 0x0; ///////////////// // Link swaps ///////////////// // A07 RP2 B1 slave link if ( (side == 0) && (sector == 7) && (partition == 2) && (cru == 1) ) { uint32_t badlink = 1; uint32_t usedspare = 0x1; // 1 = link 10. 2 = link 11. retval = usedspare << 2*badlink; } // A11 RP2 B0 slave link if ( (side == 0) && (sector == 11) && (partition == 2) && (cru == 1) ) { uint32_t badlink = 0; uint32_t usedspare = 0x1; // 1 = link 10. 2 = link 11. retval = usedspare << 2*badlink; } // A12 RP1 B1 slave link if ( (side == 0) && (sector == 12) && (partition == 1) && (cru == 1) ) { uint32_t badlink = 1; uint32_t usedspare = 0x1; // 1 = link 10. 2 = link 11. retval = usedspare << 2*badlink; } // C07 RP3 B1 slave link if ( (side == 1) && (sector == 7) && (partition == 3) && (cru == 1) ) { uint32_t badlink = 1; uint32_t usedspare = 0x1; // 1 = link 10. 2 = link 11. retval = usedspare << 2*badlink; } return retval; } uint32_t CruConfig::getZS_EN(uint32_t side, uint32_t sector, uint32_t partition, uint32_t cru){ // Enable zero suppression if ( fconfigType == 0 ) return 0; else if ( fconfigType == 2 ) return 0; else return 1; // ZS is usually enabled } uint32_t CruConfig::getTRG_WINDOW_SIZE(uint32_t side, uint32_t sector, uint32_t partition, uint32_t cru){ // Trigger window size (for triggered mode only) in TPC time-bins return 0x226; // 512 time bins } uint32_t CruConfig::getMAX_PAYLOAD_SIZE(uint32_t side, uint32_t sector, uint32_t partition, uint32_t cru){ // Default size of packets: 508 return 0x1FC; } uint32_t CruConfig::getSUPPRESS_HBR(uint32_t side, uint32_t sector, uint32_t partition, uint32_t cru){ // Suppress HBr packages return 1; } uint32_t CruConfig::getUSE_LINK_ID_15(uint32_t side, uint32_t sector, uint32_t partition, uint32_t cru){ // Use link id 15 for all UL packages return 0; } float CruConfig::getITCORR0(uint32_t side, uint32_t sector, uint32_t partition, uint32_t cru){ // ITCORR0 correction factor return 0.8; } uint32_t CruConfig::getITF_EN(uint32_t side, uint32_t sector, uint32_t partition, uint32_t cru){ // Enable ion tail filter if ( fconfigType <= 3 ) return 0; else if ( fconfigType == 10 ) return 0; else return 1; // ITF is usually enabled } uint32_t CruConfig::getCMC_EN(uint32_t side, uint32_t sector, uint32_t partition, uint32_t cru){ // Enable common mode correction if ( fconfigType <= 3 ) return 0; else if ( fconfigType == 10 ) return 0; else return 0xFFFFF; // CMC is usually enabled } uint32_t CruConfig::getOFFSET(uint32_t side, uint32_t sector, uint32_t partition, uint32_t cru){ // Get offset to be added for each channel if ( fconfigType == 9 ) return 80.; return 0; } uint32_t CruConfig::getRESYNC_EN(uint32_t side, uint32_t sector, uint32_t partition, uint32_t cru){ // Enable automatic link re-synchronisation if ( fconfigType <= 2 ) return 0; else if ( fconfigType == 4 ) return 0; else if ( fconfigType == 9 ) return 0; else return 1; // RESYNC is usually enabled } uint32_t CruConfig::getBC_EN(uint32_t side, uint32_t sector, uint32_t partition, uint32_t cru){ // Enable baseline correction (pedestal subtraction) if ( fconfigType == 0 ) return 0; else if ( fconfigType == 2 ) return 0; else return 1; // BC is usually enabled } uint32_t CruConfig::getCMC_THRESH1(uint32_t side, uint32_t sector, uint32_t partition, uint32_t cru){ // Set THRESH_1 for CMC module // 8 positions after decimal point // Internal offset is 100. So register value is (100 + Threshold) * (1<<8) if ( fconfigType == 12 ) return 0x7000; // Threshold 12 (for Pb-Pb. as tested in HI 2024) else return 0x6600; // Threshold 2 } uint32_t CruConfig::getCMC_MIN_MATCHES(uint32_t side, uint32_t sector, uint32_t partition, uint32_t cru){ // Set MIN_MATCHES for CMC module if ( fconfigType == 12 ) return 5; // For Pb-Pb. as tested in HI 2024 else return 6; } uint32_t CruConfig::getCMC_MATCH_DISTANCE(uint32_t side, uint32_t sector, uint32_t partition, uint32_t cru){ // Set MATCH_DISTANCE for CMC module // 4 bit for positions after decimal point if ( fconfigType == 12 ) return 0x30; // THRESH2 = 3 (for Pb-Pb. as tested in HI 2024) else return 0x10; // THRESH2 = 1 } uint32_t CruConfig::getCMC_WRITEOUT_EN(uint32_t side, uint32_t sector, uint32_t partition, uint32_t cru){ // Set WRITEOUT_EN for CMC module // This is just for testing the CMC module. Never use in PHYSICS. return 0; } bool CruConfig::isMaster(uint32_t side, uint32_t sector, uint32_t partition, uint32_t cru){ // CRU 0 = Master // CRU 1 = Slave uint32_t retval = 1; if (cru == 1) retval = 0; if ( (cru<0) || (cru>1) ) cerr << "Error in CruConfig::isMaster(). Strange CRU coordinate: " << cru << endl; return retval; } uint32_t CruConfig::getState(){ return getState(0,0,0,0); } uint32_t CruConfig::getZS_EN(){ return getZS_EN(0,0,0,0); } uint32_t CruConfig::getTRG_WINDOW_SIZE(){ return getTRG_WINDOW_SIZE(0,0,0,0); } uint32_t CruConfig::getSUPPRESS_HBR(){ return getSUPPRESS_HBR(0,0,0,0); } uint32_t CruConfig::getUSE_LINK_ID_15(){ return getUSE_LINK_ID_15(0,0,0,0); } uint32_t CruConfig::getITCORR0(){ return getITCORR0(0,0,0,0); }