/** @file AltroCommandCoder.C * @brief The AltroCommandCoder class implements the transofrmation of ALTRO Parameters into commands * * This Class transforms ALTRO configuration settings in the appropriate Assembled form for the ALTRO\n * Each function to compose a ALTRO Command with data is returning a uint64_t. The Command and the * Adressing is in the first 32 bit, the data follows in the second 32 bit word. In both cases the lower * 20 bit are containing the command data.\n * Each function without data is returned as a 32 unsigned int, again the lower 20 bit hold the coded command.\n * There are also functions to compose and decompose the various ALTRORegisters and the error states\n * * \verbinclude Configuration/AltroCommandCoder.C.log */ #include "AltroCommandCoder.h" //=========================================================================== AltroCommandCoder::AltroCommandCoder() { } //=========================================================================== AltroCommandCoder::~AltroCommandCoder() { } // //Set Channel Registers-------------------------------------------------------------------------------------- // //=========================================================================== uint64_t AltroCommandCoder::sendK1(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr, uint32_t channeladdr, uint32_t filtercoefficient){ uint64_t retval; retval = ((uint64_t)instruction(eScope(LOCAL), branch, FECaddr, chipaddr, channeladdr, eAltroCommand(K1))<<32) + (filtercoefficient&ci16BitOn); return retval; } //=========================================================================== uint64_t AltroCommandCoder::sendK1(uint32_t filtercoefficient){ uint64_t retval; retval = ((uint64_t)instruction(eScope(BROADCAST), 0, 0, 0, 0, eAltroCommand(K1))<<32) + (filtercoefficient&ci16BitOn); return retval; } //=========================================================================== uint64_t AltroCommandCoder::sendK2(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr, uint32_t channeladdr, uint32_t filtercoefficient){ uint64_t retval; retval = ((uint64_t)instruction(eScope(LOCAL), branch, FECaddr, chipaddr, channeladdr, eAltroCommand(K2))<<32) + (filtercoefficient&ci16BitOn); return retval; } //=========================================================================== uint64_t AltroCommandCoder::sendK2(uint32_t filtercoefficient){ uint64_t retval; retval = ((uint64_t)instruction(eScope(BROADCAST), 0, 0, 0, 0, eAltroCommand(K2))<<32) + (filtercoefficient&ci16BitOn); return retval; } //=========================================================================== uint64_t AltroCommandCoder::sendK3(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr, uint32_t channeladdr, uint32_t filtercoefficient){ uint64_t retval; retval = ((uint64_t)instruction(eScope(LOCAL), branch, FECaddr, chipaddr, channeladdr, eAltroCommand(K3))<<32) + (filtercoefficient&ci16BitOn); return retval; } //=========================================================================== uint64_t AltroCommandCoder::sendK3(uint32_t filtercoefficient){ uint64_t retval; retval = ((uint64_t)instruction(eScope(BROADCAST), 0, 0, 0, 0, eAltroCommand(K3))<<32) + (filtercoefficient&ci16BitOn); return retval; } //=========================================================================== uint64_t AltroCommandCoder::sendL1(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr, uint32_t channeladdr, uint32_t filtercoefficient){ uint64_t retval; retval = ((uint64_t)instruction(eScope(LOCAL), branch, FECaddr, chipaddr, channeladdr, eAltroCommand(L1))<<32) + (filtercoefficient&ci16BitOn); return retval; } //=========================================================================== uint64_t AltroCommandCoder::sendL1(uint32_t filtercoefficient){ uint64_t retval; retval = ((uint64_t)instruction(eScope(BROADCAST), 0, 0, 0, 0, eAltroCommand(L1))<<32) + (filtercoefficient&ci16BitOn); return retval; } //=========================================================================== uint64_t AltroCommandCoder::sendL2(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr, uint32_t channeladdr, uint32_t filtercoefficient){ uint64_t retval; retval = ((uint64_t)instruction(eScope(LOCAL), branch, FECaddr,chipaddr, channeladdr, eAltroCommand(L2))<<32) + (filtercoefficient&ci16BitOn); return retval; } //=========================================================================== uint64_t AltroCommandCoder::sendL2(uint32_t filtercoefficient){ uint64_t retval; retval = ((uint64_t)instruction(eScope(BROADCAST), 0, 0, 0, 0, eAltroCommand(L2))<<32) + (filtercoefficient&ci16BitOn); return retval; } //=========================================================================== uint64_t AltroCommandCoder::sendL3(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr, uint32_t channeladdr, uint32_t filtercoefficient){ uint64_t retval; retval = ((uint64_t)instruction(eScope(LOCAL), branch, FECaddr, chipaddr, channeladdr, eAltroCommand(L3))<<32) + (filtercoefficient&ci16BitOn); return retval; } //=========================================================================== uint64_t AltroCommandCoder::sendL3(uint32_t filtercoefficient){ uint64_t retval; retval = ((uint64_t)instruction(eScope(BROADCAST), 0, 0, 0, 0, eAltroCommand(L3))<<32) + (filtercoefficient&ci16BitOn); return retval; } //=========================================================================== uint64_t AltroCommandCoder::sendVFPED(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr, uint32_t channeladdr, uint32_t fixedPedestal){ uint64_t retval; retval = ((uint64_t)instruction(eScope(LOCAL), branch, FECaddr, chipaddr, channeladdr, eAltroCommand(VFPED))<<32) + (fixedPedestal&ci10BitOn); return retval; } //=========================================================================== uint64_t AltroCommandCoder::sendVFPED(uint32_t fixedPedestal){ uint64_t retval; retval = ((uint64_t)instruction(eScope(BROADCAST), 0, 0, 0, 0, eAltroCommand(VFPED))<<32) + (fixedPedestal&ci10BitOn); return retval; } //=========================================================================== uint64_t AltroCommandCoder::sendPMDTA(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr, uint32_t channeladdr, uint32_t data){ uint64_t retval; retval = ((uint64_t)instruction(eScope(LOCAL), branch, FECaddr, chipaddr, channeladdr, eAltroCommand(PMDTA))<<32) + (data&ci10BitOn); return retval; } //=========================================================================== uint64_t AltroCommandCoder::sendPMDTA(uint32_t data){ uint64_t retval; retval = ((uint64_t)instruction(eScope(BROADCAST), 0, 0, 0, 0, eAltroCommand(PMDTA))<<32) + (data&ci10BitOn); return retval; } // //Get Channel Registers-------------------------------------------------------------------------------------- //The difference of writing and reading is done via the rcu command ... // //=========================================================================== uint32_t AltroCommandCoder::receiveK1(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr, uint32_t channeladdr){ uint32_t retval; retval = instruction(eScope(LOCAL), branch, FECaddr, chipaddr, channeladdr, eAltroCommand(K1)); return retval; } //=========================================================================== uint32_t AltroCommandCoder::receiveK2(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr, uint32_t channeladdr){ uint32_t retval; retval = instruction(eScope(LOCAL), branch, FECaddr, chipaddr, channeladdr, eAltroCommand(K2)); return retval; } //=========================================================================== uint32_t AltroCommandCoder::receiveK3(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr, uint32_t channeladdr){ uint32_t retval; retval = instruction(eScope(LOCAL), branch, FECaddr, chipaddr, channeladdr, eAltroCommand(K3)); return retval; } //=========================================================================== uint32_t AltroCommandCoder::receiveL1(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr, uint32_t channeladdr){ uint32_t retval; retval = instruction(eScope(LOCAL), branch, FECaddr, chipaddr, channeladdr, eAltroCommand(L1)); return retval; } //=========================================================================== uint32_t AltroCommandCoder::receiveL2(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr, uint32_t channeladdr){ uint32_t retval; retval = instruction(eScope(LOCAL), branch, FECaddr, chipaddr, channeladdr, eAltroCommand(L2)); return retval; } //=========================================================================== uint32_t AltroCommandCoder::receiveL3(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr, uint32_t channeladdr){ uint32_t retval; retval = instruction(eScope(LOCAL), branch, FECaddr, chipaddr, channeladdr, eAltroCommand(L3)); return retval; } //=========================================================================== uint32_t AltroCommandCoder::receiveVFPED(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr, uint32_t channeladdr){ uint32_t retval; retval = instruction(eScope(LOCAL), branch, FECaddr, chipaddr, channeladdr, eAltroCommand(VFPED)); return retval; }//ead vfpd ?? //=========================================================================== uint32_t AltroCommandCoder::receivePMDTA(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr, uint32_t channeladdr, uint32_t Data){ uint32_t retval; retval = instruction(eScope(LOCAL), branch, FECaddr, chipaddr, channeladdr, eAltroCommand(PMDTA)); return retval; }//needed ? // //Set Global Registers------------------------------------------------------------------------------------------ // //=========================================================================== uint64_t AltroCommandCoder::sendZSTHR(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr, uint32_t parameterZSTHR){ uint64_t retval; retval = ((uint64_t)instruction(eScope(LOCAL), branch, FECaddr, chipaddr, 0, eAltroCommand(ZSTHR))<<32) + (parameterZSTHR&ci20BitOn); return retval; } //=========================================================================== uint64_t AltroCommandCoder::sendZSTHR(uint32_t parameterZSTHR){ uint64_t retval; retval = ((uint64_t)instruction(eScope(BROADCAST), 0, 0, 0, 0, eAltroCommand(ZSTHR))<<32) + (parameterZSTHR&ci20BitOn); return retval; } //=========================================================================== uint64_t AltroCommandCoder::sendBCTHR(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr, uint32_t parameterBCTHR){ uint64_t retval; retval = ((uint64_t)instruction(eScope(LOCAL), branch, FECaddr, chipaddr, 0, eAltroCommand(BCTHR))<<32) + (parameterBCTHR&ci20BitOn); return retval; } //=========================================================================== uint64_t AltroCommandCoder::sendBCTHR(uint32_t parameterBCTHR){ uint64_t retval; retval = ((uint64_t)instruction(eScope(BROADCAST), 0, 0, 0, 0, eAltroCommand(BCTHR))<<32) + (parameterBCTHR&ci20BitOn); return retval; } //=========================================================================== uint64_t AltroCommandCoder::sendTRCFG(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr, uint32_t parameterTRCFG){ uint64_t retval; retval = ((uint64_t)instruction(eScope(LOCAL), branch, FECaddr, chipaddr, 0, eAltroCommand(TRCFG))<<32) + (parameterTRCFG&ci20BitOn); return retval; } //=========================================================================== uint64_t AltroCommandCoder::sendTRCFG(uint32_t parameterTRCFG){ uint64_t retval; retval = ((uint64_t)instruction(eScope(BROADCAST), 0, 0, 0, 0, eAltroCommand(TRCFG))<<32) + (parameterTRCFG&ci20BitOn); return retval; } //=========================================================================== uint64_t AltroCommandCoder::sendDPCFG(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr, uint32_t parameterDPCFG){ uint64_t retval; retval = ((uint64_t)instruction(eScope(LOCAL), branch, FECaddr, chipaddr, 0, eAltroCommand(DPCFG))<<32) + (parameterDPCFG&ci20BitOn); return retval; } //=========================================================================== uint64_t AltroCommandCoder::sendDPCFG(uint32_t parameterDPCFG){ uint64_t retval; retval = ((uint64_t)instruction(eScope(BROADCAST), 0, 0, 0, 0, eAltroCommand(DPCFG))<<32) + (parameterDPCFG&ci20BitOn); return retval; } //=========================================================================== uint64_t AltroCommandCoder::sendDPCF2(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr, uint32_t parameterDPCF2){ uint64_t retval; retval = ((uint64_t)instruction(eScope(LOCAL), branch, FECaddr, chipaddr, 0, eAltroCommand(DPCF2))<<32) + (parameterDPCF2&ci07BitOn); return retval; } //=========================================================================== uint64_t AltroCommandCoder::sendDPCF2(uint32_t parameterDPCF2){ uint64_t retval; retval = ((uint64_t)instruction(eScope(BROADCAST), 0, 0, 0, 0, eAltroCommand(DPCF2))<<32) + (parameterDPCF2&ci07BitOn); return retval; } //=========================================================================== uint64_t AltroCommandCoder::sendPMADD(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr, uint32_t addressofpedestalmem){ uint64_t retval; retval = ((uint64_t)instruction(eScope(LOCAL), branch, FECaddr, chipaddr, 0, eAltroCommand(PMADD))<<32) + addressofpedestalmem; return retval; } //=========================================================================== uint64_t AltroCommandCoder::sendPMADD(uint32_t addressofpedestalmem){ uint64_t retval; retval = ((uint64_t)instruction(eScope(BROADCAST), 0, 0, 0, 0, eAltroCommand(PMADD))<<32) + addressofpedestalmem; return retval; } //Get Global Registers----------------------------------------------------------------------------------------------- //=========================================================================== uint32_t AltroCommandCoder::receiveZSTHR(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr){ uint32_t retval; retval = instruction(eScope(LOCAL), branch, FECaddr, chipaddr, 0, eAltroCommand(ZSTHR)); return retval; } //=========================================================================== uint32_t AltroCommandCoder::receiveBCTHR(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr){ uint32_t retval; retval = instruction(eScope(LOCAL), branch, FECaddr, chipaddr, 0, eAltroCommand(BCTHR)); return retval; } //=========================================================================== uint32_t AltroCommandCoder::receiveTRCFG(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr){ uint32_t retval; retval = instruction(eScope(LOCAL), branch, FECaddr, chipaddr, 0, eAltroCommand(TRCFG)); return retval; } //=========================================================================== uint32_t AltroCommandCoder::receiveDPCFG(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr){ uint32_t retval; retval = instruction(eScope(LOCAL), branch, FECaddr, chipaddr, 0, eAltroCommand(DPCFG)); return retval; } //=========================================================================== uint32_t AltroCommandCoder::receiveDPCF2(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr){ uint32_t retval; retval = instruction(eScope(LOCAL), branch, FECaddr, chipaddr, 0, eAltroCommand(DPCF2)); return retval; } //=========================================================================== uint32_t AltroCommandCoder::receivePMADD(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr){ uint32_t retval; retval = instruction(eScope(LOCAL), branch, FECaddr, chipaddr, 0, eAltroCommand(PMADD)); return retval; } //--------------------------------------------------------------------------------------------------------- //=========================================================================== uint32_t AltroCommandCoder::sendWPINC(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr){ uint32_t retval; retval = instruction(eScope(LOCAL), branch, FECaddr, chipaddr, 0, eAltroCommand(WPINC)); return retval; } //=========================================================================== uint32_t AltroCommandCoder::sendWPINC(){ uint32_t retval; retval = instruction(eScope(BROADCAST), 0, 0, 0, 0, eAltroCommand(WPINC)); return retval; } //=========================================================================== uint32_t AltroCommandCoder::sendRPINC(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr){ uint32_t retval; retval = instruction(eScope(LOCAL), branch, FECaddr, chipaddr, 0, eAltroCommand(RPINC)); return retval; } //=========================================================================== uint32_t AltroCommandCoder::sendRPINC(){ uint32_t retval; retval = instruction(eScope(BROADCAST), 0, 0, 0, 0, eAltroCommand(RPINC)); return retval; } //=========================================================================== uint32_t AltroCommandCoder::sendSWTRG(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr){ uint32_t retval; retval = instruction(eScope(LOCAL), branch, FECaddr, chipaddr, 0, eAltroCommand(SWTRG)); return retval; } //=========================================================================== uint32_t AltroCommandCoder::sendSWTRG(){ uint32_t retval; retval = instruction(eScope(BROADCAST), 0, 0, 0, 0, eAltroCommand(SWTRG)); return retval; } //=========================================================================== uint32_t AltroCommandCoder::sendTRCLR(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr){ uint32_t retval; retval = instruction(eScope(LOCAL), branch, FECaddr, chipaddr, 0, eAltroCommand(TRCLR)); return retval; } //=========================================================================== uint32_t AltroCommandCoder::sendTRCLR(){ uint32_t retval; retval = instruction(eScope(BROADCAST), 0, 0, 0, 0, eAltroCommand(TRCLR)); return retval; } //=========================================================================== uint32_t AltroCommandCoder::sendERCLR(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr){ uint32_t retval; retval = instruction(eScope(LOCAL), branch, FECaddr, chipaddr, 0, eAltroCommand(ERCLR)); return retval; } //=========================================================================== uint32_t AltroCommandCoder::sendERCLR(){ uint32_t retval; retval = instruction(eScope(BROADCAST), 0, 0, 0, 0, eAltroCommand(ERCLR)); return retval; } //=========================================================================== uint32_t AltroCommandCoder::receiveERSTR(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr){ uint32_t retval; retval = instruction(eScope(LOCAL), branch, FECaddr, chipaddr, 0, eAltroCommand(ERSTR)); return retval; } //=========================================================================== uint32_t AltroCommandCoder::receiveADEVL(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr, uint32_t channeladdr){ uint32_t retval; retval = instruction(eScope(LOCAL), branch, FECaddr, chipaddr, channeladdr, eAltroCommand(ADEVL)); return retval; }//why no channel in vi ? //=========================================================================== uint32_t AltroCommandCoder::receiveTRCNT(uint32_t branch, uint32_t FECaddr, uint32_t chipaddr){ uint32_t retval; retval = instruction(eScope(LOCAL), branch, FECaddr, chipaddr, 0, eAltroCommand(TRCNT)); return retval; } //Code/decode Registers------------------------------------------------------------------------------------------ //=========================================================================== uint32_t AltroCommandCoder::codeTCFParameter(double TCFPar){ uint32_t retval = 0; retval = (uint32_t) ( ((1<<16)-1) * TCFPar); return retval; } //=========================================================================== uint32_t AltroCommandCoder::getDecodedVFPED_FPD(uint32_t VFPED){ return (VFPED&ci10BitOn); } //=========================================================================== uint32_t AltroCommandCoder::getDecodedVFPED_VPD(uint32_t VFPED){ return (VFPED>>10); } //=========================================================================== uint32_t AltroCommandCoder::codeZSTHR(uint32_t Offset, uint32_t ZS_THR){ uint32_t retval; retval = ((Offset&ci10BitOn)<<10) + (ZS_THR&ci10BitOn); return retval; } //=========================================================================== uint32_t AltroCommandCoder::decodeZSTHR_ZSTHR(uint32_t parameterZSTHR){ return (parameterZSTHR&ci10BitOn); } //=========================================================================== uint32_t AltroCommandCoder::decodeZSTHR_Offset(uint32_t parameterZSTHR){ return ((parameterZSTHR>>10)&ci10BitOn); } //=========================================================================== uint32_t AltroCommandCoder::codeBCTHR(uint32_t THR_HI, uint32_t THR_LOW){ uint32_t retval; retval = ((THR_HI&ci10BitOn)<<10) + (THR_LOW&ci10BitOn); return retval; } //=========================================================================== uint32_t AltroCommandCoder::decodeBCTHR_THRLOW(uint32_t parameterBCTHR){ return (parameterBCTHR&ci10BitOn); } //=========================================================================== uint32_t AltroCommandCoder::decodeBCTHR_THRHI(uint32_t parameterBCTHR){ return ((parameterBCTHR>>10)&ci10BitOn); } //=========================================================================== uint32_t AltroCommandCoder::codeTRCFG(uint32_t ACQ_START, uint32_t ACQ_END){ uint32_t retval; retval = ((ACQ_START&ci10BitOn)<<10) + (ACQ_END&ci10BitOn); return retval; } //=========================================================================== uint32_t AltroCommandCoder::getDecodedTRCFG_ACQ_END(uint32_t parameterTRCFG){ return (parameterTRCFG&ci10BitOn); } //=========================================================================== uint32_t AltroCommandCoder::getDecodedTRCFG_ACQ_START(uint32_t parameterTRCFG){ return ((parameterTRCFG>>10)&ci10BitOn); } //=========================================================================== uint32_t AltroCommandCoder::codeDPCFG(uint32_t ZS_CFG, uint32_t BC2_CFG, uint32_t BC1_CFG){ uint32_t retval; retval = ((ZS_CFG&ci08BitOn)<<12) + ((BC2_CFG&ci07BitOn)<<5) + (BC1_CFG&ci05BitOn); return retval; } //=========================================================================== uint32_t AltroCommandCoder::getDecodedDPCFG_ZS_CFG(uint32_t parameterDPCFG){ return (parameterDPCFG>>12); } //=========================================================================== uint32_t AltroCommandCoder::getDecodedDPCFG_BC2_CFG(uint32_t parameterDPCFG){ return ((parameterDPCFG>>5)&ci07BitOn); } //=========================================================================== uint32_t AltroCommandCoder::getDecodedDPCFG_BC1_CFG(uint32_t parameterDPCFG){ return (parameterDPCFG&ci05BitOn); } //=========================================================================== uint32_t AltroCommandCoder::codeBC1_CFG(uint32_t FirstBaselineCorrectionMode, uint32_t Polarity){ uint32_t retval; retval = ((Polarity&1)<<4) + (FirstBaselineCorrectionMode&ci04BitOn); return retval; } //=========================================================================== uint32_t AltroCommandCoder::getDecodedDPCFG_BC1_CFG_FirstBaselineCorrectionMode(uint32_t BC1_CFG){ return (BC1_CFG&ci04BitOn); } //=========================================================================== uint32_t AltroCommandCoder::getDecodedDPCFG_BC1_CFG_Polarity(uint32_t BC1_CFG){ return ((BC1_CFG>>4)&1); } //=========================================================================== uint32_t AltroCommandCoder::codeBC2_CFG(uint32_t NumofExcludedPreS, uint32_t NumofExcludedPostS, uint32_t enable){ uint32_t retval; retval = ((enable&1)<<6) + ((NumofExcludedPostS&ci04BitOn)<<2) + (NumofExcludedPreS&ci02BitOn); return retval; } //=========================================================================== uint32_t AltroCommandCoder::getDecodedDPCFG_BC2_CFG_NumofExcludedPreS(uint32_t BC2_CFG){ return (BC2_CFG&ci02BitOn); } //=========================================================================== uint32_t AltroCommandCoder::getDecodedDPCFG_BC2_CFG_NumofExcludedPostS(uint32_t BC2_CFG){ return ((BC2_CFG>>2)&ci04BitOn); } //=========================================================================== uint32_t AltroCommandCoder::getDecodedDPCFG_BC2_CFG_enable(uint32_t BC2_CFG){ return (BC2_CFG>>6); } //=========================================================================== uint32_t AltroCommandCoder::codeZS_CFG(uint32_t GlitchFilterConfig, uint32_t NumofExcludedPostS, uint32_t NumofExcludedPreS, uint32_t Enable){ uint32_t retval; retval = ((Enable&1)<<7) + ((NumofExcludedPreS&ci02BitOn)<<5) + ((NumofExcludedPostS&ci03BitOn)<<2) + (GlitchFilterConfig&ci02BitOn); return retval; } //=========================================================================== uint32_t AltroCommandCoder::getDecodedDPCFG_ZS_CFG_GlitchFilterConfig(uint32_t ZS_CFG){ return (ZS_CFG&ci02BitOn); } //=========================================================================== uint32_t AltroCommandCoder::getDecodedDPCFG_ZS_CFG_NumofExcludedPreS(uint32_t ZS_CFG){ return ((ZS_CFG>>2)&ci03BitOn); } //=========================================================================== uint32_t AltroCommandCoder::getDecodedDPCFG_ZS_CFG_NumofExcludedPostS(uint32_t ZS_CFG){ return ((ZS_CFG>>5)&ci02BitOn); } //=========================================================================== uint32_t AltroCommandCoder::getDecodedDPCFG_ZS_CFG_Enable(uint32_t ZS_CFG){ return (ZS_CFG>>7); } //=========================================================================== uint32_t AltroCommandCoder::codeDPCF2(uint32_t PTRG, uint32_t NBUF, uint32_t FLT_EN, uint32_t PWSV){ uint32_t retval; retval = ((PWSV&1)<<6) + ((FLT_EN&1)<<5) + ((NBUF&1)<<4) + (PTRG&ci04BitOn); return retval; } //=========================================================================== uint32_t AltroCommandCoder::getDecodedDPCF2_PTRG(uint32_t parameter){ return (parameter&ci04BitOn); } //=========================================================================== uint32_t AltroCommandCoder::getDecodedDPCF2_NBUF(uint32_t parameter){ return ((parameter>>4)&1); } //=========================================================================== uint32_t AltroCommandCoder::getDecodedDPCF2_FLT_EN(uint32_t parameter){ return ((parameter>>5)&1); } //=========================================================================== uint32_t AltroCommandCoder::getDecodedDPCF2_PWSV(uint32_t parameter){ return (parameter>>6); } //=========================================================================== uint32_t AltroCommandCoder::getDecodedERSTR_PTRG_ReadPointer(uint32_t ERSTR){ return (ERSTR&ci03BitOn); } //=========================================================================== uint32_t AltroCommandCoder::getDecodedERSTR_PTRG_WritePointer(uint32_t ERSTR){ return ((ERSTR>>3)&ci03BitOn); } //=========================================================================== uint32_t AltroCommandCoder::getDecodedERSTR_PTRG_RemainingBuffer(uint32_t ERSTR){ return ((ERSTR>>6)&ci04BitOn); } //=========================================================================== uint32_t AltroCommandCoder::getDecodedERSTR_PTRG_FULL(uint32_t ERSTR){ return ((ERSTR>>10)&1); } //=========================================================================== uint32_t AltroCommandCoder::getDecodedERSTR_PTRG_EMPTY(uint32_t ERSTR){ return ((ERSTR>>11)&1); } //=========================================================================== uint32_t AltroCommandCoder::getDecodedERSTR_PTRG_ParityERROR(uint32_t ERSTR){ return ((ERSTR>>12)&1); } //=========================================================================== uint32_t AltroCommandCoder::getDecodedERSTR_PTRG_InstructionERROR(uint32_t ERSTR){ return ((ERSTR>>13)&1); } //=========================================================================== uint32_t AltroCommandCoder::getDecodedERSTR_PTRG_TriggerOverlap(uint32_t ERSTR){ return ((ERSTR>>14)&1); } //=========================================================================== uint32_t AltroCommandCoder::getDecodedERSTR_PTRG_MMU1SEU(uint32_t ERSTR){ return ((ERSTR>>15)&1); } //=========================================================================== uint32_t AltroCommandCoder::getDecodedERSTR_PTRG_MMU2SEU(uint32_t ERSTR){ return ((ERSTR>>16)&1); } //=========================================================================== uint32_t AltroCommandCoder::getDecodedERSTR_PTRG_INT1SEU(uint32_t ERSTR){ return ((ERSTR>>17)&1); } //=========================================================================== uint32_t AltroCommandCoder::getDecodedERSTR_PTRG_INT2SEU(uint32_t ERSTR){ return ((ERSTR>>18)&1); } //=========================================================================== uint32_t AltroCommandCoder::getDecodedERSTR_PTRG_RDOERROR(uint32_t ERSTR){ return (ERSTR>>19); } //=========================================================================== uint32_t AltroCommandCoder::getDecodedADEVL_EVL(uint32_t ADEVL){ return (ADEVL&ci08BitOn); } //=========================================================================== uint32_t AltroCommandCoder::getDecodedADEVL_HADD(uint32_t ADEVL){ return (ADEVL>>8); } //=========================================================================== uint32_t AltroCommandCoder::codeAddress(uint32_t Branch, uint32_t FECaddr, uint32_t chipaddr, uint32_t channeladdr){ return ((Branch&1)<<11) + ((FECaddr&ci04BitOn)<<7) + ((chipaddr&ci03BitOn)<<4) + (channeladdr&ci04BitOn); } //=========================================================================== uint32_t AltroCommandCoder::codeAddress(uint32_t Branch, uint32_t hwaddr){ return ((Branch&1)<<11) + (hwaddr&ci11BitOn); } //=========================================================================== uint32_t AltroCommandCoder::getDecodedAddressBranch(uint32_t Address){ return ((Address>>11)&1); } //=========================================================================== uint32_t AltroCommandCoder::getDecodedAddressFECaddr(uint32_t Address){ return ((Address>>7)&ci04BitOn); } //=========================================================================== uint32_t AltroCommandCoder::getDecodedAddressChipaddr(uint32_t Address){ return ((Address>>4)&ci03BitOn); } //=========================================================================== uint32_t AltroCommandCoder::getDecodedAddressChanneladdr(uint32_t Address){ return ((Address&ci04BitOn)); } // // Private functions // //=========================================================================== int32_t AltroCommandCoder::instruction(eScope broadcast, uint32_t branch, uint32_t FECaddr, uint32_t chipaddr, uint32_t channeladdr, eAltroCommand commandcode){ // get ALTRO bus instruction uint32_t retval; int32_t data = (int)((broadcast<<18) + (0<<17) + ((branch&1)<<16) + ((FECaddr&ci04BitOn)<<12) + ((chipaddr&ci03BitOn)<<9) + ((channeladdr&ci04BitOn)<<5) + (commandcode)); int32_t parity = 0; //getParity(data&ci19BitOn); retval = ((int)parity<<19) + ((int)data&ci19BitOn); return retval; } //=========================================================================== uint32_t AltroCommandCoder::getParity(uint32_t data) { // get parity of integer 'data' uint32_t no_of_ones = 0; while ( data != 0 ) { no_of_ones++; data &= (data-1); // the loop will execute once for each bit of data set } return (no_of_ones&ci01BitOn); // if no_of_ones is odd, least significant bit will be 1 }