diff --git a/MAC/APL/PIC/RSP_Driver/src/BMRead.cc b/MAC/APL/PIC/RSP_Driver/src/BMRead.cc index 41b2e14c1b111f5b2fcb9e23097add8103080099..1f562604615018912a1782eb73b4486a1752f8c5 100644 --- a/MAC/APL/PIC/RSP_Driver/src/BMRead.cc +++ b/MAC/APL/PIC/RSP_Driver/src/BMRead.cc @@ -52,7 +52,9 @@ void BMRead::sendrequest() if ((( Cache::getInstance().getBack().getVersions().bp()(getBoardId()).fpga_maj * 10) + Cache::getInstance().getBack().getVersions().bp()(getBoardId()).fpga_min) < 74) { LOG_DEBUG_STR(formatString("BMRead:: Firmware on board[%d], has NO bitmode support", getBoardId())); + Cache::getInstance().getState().bmState().unmodified(getBoardId()); setContinue(true); // continue with next action + setFinished(); } else { EPAReadEvent bmread; @@ -87,6 +89,7 @@ GCFEvent::TResult BMRead::handleack(GCFEvent& event, GCFPortInterface& /*port*/) if (!bm.hdr.isValidAck(itsHdr)) { + Cache::getInstance().getState().bmState().read_error(getBoardId()); LOG_ERROR("BMRead::handleack: invalid ack"); return GCFEvent::NOT_HANDLED; } @@ -98,6 +101,8 @@ GCFEvent::TResult BMRead::handleack(GCFEvent& event, GCFPortInterface& /*port*/) Cache::getInstance().getBack().getBitModeInfo()()(getBoardId()).bm_select = bm.beammode.bm_select; Cache::getInstance().getBack().getBitModeInfo()()(getBoardId()).bm_max = bm.beammode.bm_max; + Cache::getInstance().getState().bmState().read_ack(getBoardId()); + LOG_DEBUG_STR("BMRead::handleack() done"); return GCFEvent::HANDLED; } diff --git a/MAC/APL/PIC/RSP_Driver/src/BMWrite.cc b/MAC/APL/PIC/RSP_Driver/src/BMWrite.cc index 3997cf280fc23337d89c79f67908facf431acba1..e884df65895bbfd7128da452e81e87b63a18f7ad 100644 --- a/MAC/APL/PIC/RSP_Driver/src/BMWrite.cc +++ b/MAC/APL/PIC/RSP_Driver/src/BMWrite.cc @@ -55,7 +55,9 @@ void BMWrite::sendrequest() if ((( Cache::getInstance().getBack().getVersions().bp()(getBoardId()).fpga_maj * 10) + Cache::getInstance().getBack().getVersions().bp()(getBoardId()).fpga_min) < 74) { LOG_DEBUG_STR(formatString("BMWrite:: Firmware on board[%d], has NO bitmode support", getBoardId())); + Cache::getInstance().getState().bmState().read_ack(getBoardId()); setContinue(true); // continue with next action + setFinished(); } else { @@ -67,7 +69,7 @@ void BMWrite::sendrequest() if (RTC::RegisterState::WRITE != Cache::getInstance().getState().bmState().get(getBoardId())) { Cache::getInstance().getState().bmState().unmodified(getBoardId()); setContinue(true); - + setFinished(); return; } diff --git a/MAC/APL/PIC/RSP_Driver/src/BWWrite.cc b/MAC/APL/PIC/RSP_Driver/src/BWWrite.cc index bc7e51ee7e3906d30376bfeddc465cd5fe8a2335..d04fd573c35be36fe1badc8b1fab65e59aa4bf84 100644 --- a/MAC/APL/PIC/RSP_Driver/src/BWWrite.cc +++ b/MAC/APL/PIC/RSP_Driver/src/BWWrite.cc @@ -46,8 +46,9 @@ using namespace EPA_Protocol; BWWrite::BWWrite(GCFPortInterface& board_port, int board_id, int blp, int regid) : SyncAction(board_port, board_id, MEPHeader::BF_N_FRAGMENTS*MAX_NR_BM_BANKS), - m_blp(blp), m_regid(regid), itsBank(0), m_remaining(0), m_offset(0) + m_blp(blp), m_regid(regid), itsBank(0), itsActiveBanks(1), m_remaining(0), m_offset(0) { + memset(&m_hdr, 0, sizeof(MEPHeader)); } @@ -57,13 +58,17 @@ BWWrite::~BWWrite() void BWWrite::sendrequest() { - int activeBanks = (MAX_BITS_PER_SAMPLE / Cache::getInstance().getBack().getBitsPerSample()); - if (getCurrentIndex() >= (activeBanks*MEPHeader::BF_N_FRAGMENTS)) { + itsActiveBanks = (MAX_BITS_PER_SAMPLE / Cache::getInstance().getBack().getBitsPerSample()); + uint8 global_blp = (getBoardId() * NR_BLPS_PER_RSPBOARD) + m_blp; + if (getCurrentIndex() >= (itsActiveBanks*MEPHeader::BF_N_FRAGMENTS)) { + if (getCurrentIndex() == (MEPHeader::BF_N_FRAGMENTS*MAX_NR_BM_BANKS - 1)) { + Cache::getInstance().getState().bf().write_ack(global_blp * MEPHeader::N_PHASEPOL + m_regid); + } setContinue(true); return; } - uint8 global_blp = (getBoardId() * NR_BLPS_PER_RSPBOARD) + m_blp; + itsBank = (getCurrentIndex() / MEPHeader::BF_N_FRAGMENTS) ; // no conditional, update every second @@ -122,11 +127,13 @@ void BWWrite::sendrequest() m_offset); break; } - + +#if 0 if (getBoardId() == 11) { LOG_INFO_STR("BWWrite:board:" << getBoardId() << ",global_blp=" << (int)global_blp << ",bank=" << itsBank << "," << bfcoefs.hdr); } +#endif // create blitz view om the weights in the bfcoefs message to be sent to the RSP hardware int nbeamlets_per_fragment = MEPHeader::N_BEAMLETS / MEPHeader::BF_N_FRAGMENTS; @@ -154,13 +161,13 @@ void BWWrite::sendrequest() Range hw_range(hw_offset, hw_offset + nbeamlets_per_fragment - MEPHeader::N_BLPS, MEPHeader::N_BLPS); Range cache_range(cache_offset, cache_offset + (nbeamlets_per_fragment / MEPHeader::N_SERDES_LANES) - 1, 1); - +#if 0 if (getBoardId() == 11) { LOG_INFO_STR("board=" << getBoardId() << ",bank=" << itsBank << ",lane=" << lane << (m_regid / 2 ? ",Y" : ",X") << (m_regid % 2 ? "I" : "R") << ", hw_range=" << hw_range << ", cache_range=" << cache_range); } - +#endif // X = normal 0 weights(hw_range, 0) = Cache::getInstance().getBack().getBeamletWeights()()(0, global_blp * 2, itsBank, cache_range); @@ -295,7 +302,7 @@ GCFEvent::TResult BWWrite::handleack(GCFEvent& event, GCFPortInterface& /*port*/ // // Last fragment signals completion // - if (MEPHeader::MEPHeader::BF_N_FRAGMENTS - 1 == getCurrentIndex()) { + if ((MEPHeader::BF_N_FRAGMENTS*itsActiveBanks-1) == getCurrentIndex()) { Cache::getInstance().getState().bf().write_ack(global_blp * MEPHeader::N_PHASEPOL + m_regid); } } diff --git a/MAC/APL/PIC/RSP_Driver/src/BWWrite.h b/MAC/APL/PIC/RSP_Driver/src/BWWrite.h index e8d45e17dbb0432e2f105a1615877d2197c47e77..bc8a9c8dc723cda79103daecdb81df59fcc8addf 100644 --- a/MAC/APL/PIC/RSP_Driver/src/BWWrite.h +++ b/MAC/APL/PIC/RSP_Driver/src/BWWrite.h @@ -63,6 +63,7 @@ private: int m_blp; int m_regid; int itsBank; + int itsActiveBanks; size_t m_remaining; // how much to write size_t m_offset; // where to write diff --git a/MAC/APL/PIC/RSP_Driver/src/BstRead.cc b/MAC/APL/PIC/RSP_Driver/src/BstRead.cc index 01139bdb3011a7dfa36613e32ebed5383468a10b..7f59eb6bb18c16f15fc91b993e9680a4541973c0 100644 --- a/MAC/APL/PIC/RSP_Driver/src/BstRead.cc +++ b/MAC/APL/PIC/RSP_Driver/src/BstRead.cc @@ -39,9 +39,10 @@ using namespace EPA_Protocol; using namespace RSP_Protocol; BstRead::BstRead(GCFPortInterface& board_port, int board_id, int lane_id) - : SyncAction(board_port, board_id, MEPHeader::N_SERDES_LANES) + : SyncAction(board_port, board_id, MEPHeader::N_SERDES_LANES) // MEPHeader::MAX_N_BANKS in new firmware { itsLaneId = lane_id; + itsRealLaneId = (lane_id < 10)?lane_id:(lane_id-10); memset(&m_hdr, 0, sizeof(MEPHeader)); } @@ -59,17 +60,14 @@ void BstRead::sendrequest() if ((( Cache::getInstance().getBack().getVersions().bp()(getBoardId()).fpga_maj * 10) + Cache::getInstance().getBack().getVersions().bp()(getBoardId()).fpga_min ) < 74) { // if old firmware version do - int real_lane = (itsLaneId < 10)?itsLaneId:(itsLaneId-10); - if (getCurrentIndex() != real_lane) { + if (getCurrentIndex() != itsRealLaneId) { setContinue(true); + return; } } else { // if new firmware version do if (getCurrentIndex() >= (MAX_BITS_PER_SAMPLE / Cache::getInstance().getBack().getBitsPerSample())) { - if (getCurrentIndex() == MEPHeader::N_SERDES_LANES - 1) { - Cache::getInstance().getState().bst().read_ack(getBoardId()); - } setContinue(true); return; } @@ -77,8 +75,6 @@ void BstRead::sendrequest() EPAReadEvent bstread; - Cache::getInstance().getState().bst().read(getBoardId()); - bstread.hdr.set(MEPHeader::READ, MEPHeader::DST_RSP, MEPHeader::BST, getCurrentIndex(), MEPHeader::BST_POWER_SIZE); m_hdr = bstread.hdr; getBoardPort().send(bstread); @@ -87,8 +83,12 @@ void BstRead::sendrequest() string s; hexdump(s, (void*)&bstread, sizeof(bstread)); LOG_INFO_STR("BSTREADREQUEST=" << s); -#endif LOG_INFO(formatString("BSTREAD:board=%d,dstid=%d,pid=%d,regid=%d,offset=%d,payload=%d,seqnr=%d", getBoardId(), bstread.hdr.m_fields.addr.dstid, bstread.hdr.m_fields.addr.pid, bstread.hdr.m_fields.addr.regid, bstread.hdr.m_fields.offset, bstread.hdr.m_fields.payload_length, bstread.hdr.m_fields.seqnr)); + +if (getBoardId() == 11) { + LOG_INFO(formatString("BSTREAD:board=%d,dstid=%d,pid=%d,regid=%d,offset=%d,payload=%d,seqnr=%d", getBoardId(), bstread.hdr.m_fields.addr.dstid, bstread.hdr.m_fields.addr.pid, bstread.hdr.m_fields.addr.regid, bstread.hdr.m_fields.offset, bstread.hdr.m_fields.payload_length, bstread.hdr.m_fields.seqnr)); +} +#endif } void BstRead::sendrequest_status() @@ -138,7 +138,7 @@ GCFEvent::TResult BstRead::handleack(GCFEvent& event, GCFPortInterface& /*port*/ EPABstStatsEvent ack(event); if (!ack.hdr.isValidAck(m_hdr)) { - Cache::getInstance().getState().bst().read_error(getBoardId()); + Cache::getInstance().getState().bst().read_error(itsRealLaneId); LOG_ERROR("BstRead::handleack: invalid ack"); return GCFEvent::NOT_HANDLED; } @@ -147,21 +147,20 @@ GCFEvent::TResult BstRead::handleack(GCFEvent& event, GCFPortInterface& /*port*/ int swstart; // In new firmware versions BST registers are used in a different way - int real_lane = (itsLaneId < 10)?itsLaneId:(itsLaneId-10); if ((( Cache::getInstance().getBack().getVersions().bp()(getBoardId()).fpga_maj * 10) + Cache::getInstance().getBack().getVersions().bp()(getBoardId()).fpga_min ) < 74) { - swstart = (real_lane * MEPHeader::N_BEAMLETS); + swstart = (itsRealLaneId * MEPHeader::N_BEAMLETS); } else { - swstart = (real_lane * MEPHeader::N_BEAMLETS) + (getCurrentIndex() * MEPHeader::N_DATA_SLOTS); + swstart = (itsRealLaneId * MEPHeader::N_BEAMLETS) + (getCurrentIndex() * MEPHeader::N_DATA_SLOTS); } Range fragment_range(swstart, swstart+MEPHeader::N_DATA_SLOTS-1); // normal set 0/1, if splitter active also 2/3 int beamletsSet = (itsLaneId < 10)?0:2; - - LOG_INFO_STR("fragment_range[" << getBoardId() << "," << getCurrentIndex() << "]=" << fragment_range); + + LOG_DEBUG_STR("fragment_range[" << getBoardId() << "," << getCurrentIndex() << "]=" << fragment_range); if (getCurrentIndex() != ack.hdr.m_fields.addr.regid) { LOG_ERROR("invalid bst ack"); @@ -170,21 +169,19 @@ GCFEvent::TResult BstRead::handleack(GCFEvent& event, GCFPortInterface& /*port*/ Array<uint32, 2> stats((uint32*)&ack.stat, shape((MEPHeader::BST_POWER_SIZE / sizeof(uint32)) / N_POL, N_POL), neverDeleteData); - LOG_INFO(formatString("real_lane=%d, beamletsSet=%d, swstart=%d", real_lane, beamletsSet, swstart)); -// LOG_INFO_STR("stats:" << stats); + LOG_DEBUG(formatString("real_lane=%d, beamletsSet=%d, swstart=%d", itsRealLaneId, beamletsSet, swstart)); + LOG_DEBUG_STR("stats:" << stats); Array<double, 2>& cache(Cache::getInstance().getBack().getBeamletStats()()); // x-pol beamlet statistics: copy and convert to double cache(beamletsSet, fragment_range) = - convert_uint32_to_double(stats(Range::all(), 0)); + convert_uint32_to_double(stats(Range::all(), 0)); // y-pol beamlet statistics: copy and convert to double cache(beamletsSet + 1, fragment_range) = - convert_uint32_to_double(stats(Range::all(), 1)); + convert_uint32_to_double(stats(Range::all(), 1)); - if (getCurrentIndex() == MEPHeader::N_SERDES_LANES - 1) { - Cache::getInstance().getState().bst().read_ack(getBoardId()); - } + Cache::getInstance().getState().bst().read_ack(itsRealLaneId); return GCFEvent::HANDLED; } diff --git a/MAC/APL/PIC/RSP_Driver/src/BstRead.h b/MAC/APL/PIC/RSP_Driver/src/BstRead.h index fc512e17ff2fb35f4e4111590194c7d6e52e4bc9..efbeb5d320e2754a86e84b343238c4fee4f7d442 100644 --- a/MAC/APL/PIC/RSP_Driver/src/BstRead.h +++ b/MAC/APL/PIC/RSP_Driver/src/BstRead.h @@ -59,8 +59,10 @@ namespace LOFAR { virtual GCFEvent::TResult handleack(GCFEvent& event, GCFPortInterface& port); private: - EPA_Protocol::MEPHeader m_hdr; int itsLaneId; + int itsRealLaneId; + + EPA_Protocol::MEPHeader m_hdr; }; }; }; diff --git a/MAC/APL/PIC/RSP_Driver/src/SSRead.cc b/MAC/APL/PIC/RSP_Driver/src/SSRead.cc index 60f824ce1e81c4bb037d3df2c3b9a0b3c5860c80..5ec208b33f03da165639ca7cb6e18c317e85dc91 100644 --- a/MAC/APL/PIC/RSP_Driver/src/SSRead.cc +++ b/MAC/APL/PIC/RSP_Driver/src/SSRead.cc @@ -54,6 +54,7 @@ void SSRead::sendrequest() itsActivePlanes = (MAX_BITS_PER_SAMPLE / Cache::getInstance().getBack().getBitsPerSample()); if (getCurrentIndex() >= (itsActivePlanes*NR_BLPS_PER_RSPBOARD)) { setContinue(true); + return; } int dstid = 1 << (getCurrentIndex() / itsActivePlanes); diff --git a/MAC/APL/PIC/RSP_Driver/src/SSWrite.cc b/MAC/APL/PIC/RSP_Driver/src/SSWrite.cc index 9ad8cb8bbf60b395338f377e05812b1b28e1eea3..e7c8aa3ca6a07798a1f8d8981916dd430f4f1fd1 100644 --- a/MAC/APL/PIC/RSP_Driver/src/SSWrite.cc +++ b/MAC/APL/PIC/RSP_Driver/src/SSWrite.cc @@ -40,7 +40,9 @@ using namespace RSP; using namespace RTC; SSWrite::SSWrite(GCFPortInterface& board_port, int board_id) - : SyncAction(board_port, board_id, NR_BLPS_PER_RSPBOARD * MAX_BITS_PER_SAMPLE / MIN_BITS_PER_SAMPLE) + : SyncAction(board_port, board_id, NR_BLPS_PER_RSPBOARD * (MAX_BITS_PER_SAMPLE / MIN_BITS_PER_SAMPLE)), + itsActiveBanks(1) + { memset(&m_hdr, 0, sizeof(MEPHeader)); } @@ -57,6 +59,7 @@ void SSWrite::sendrequest() setContinue(true); return; } + uint8 global_blp = (getBoardId() * NR_BLPS_PER_RSPBOARD) + (getCurrentIndex()/itsActiveBanks); LOG_DEBUG(formatString(">>>> SSWrite(%s) global_blp=%d", getBoardPort().getName().c_str(), global_blp)); @@ -69,7 +72,7 @@ void SSWrite::sendrequest() int dstid = 1 << (getCurrentIndex() / itsActiveBanks); // used bank int bank = getCurrentIndex() % itsActiveBanks; - LOG_INFO(formatString("SSWRITE:board=%d, index=%d, globalblp=%d, dstID=%d, bank=%d, regid=%d", + LOG_DEBUG(formatString("SSWRITE:board=%d, index=%d, globalblp=%d, dstID=%d, bank=%d, regid=%d", getBoardId(), getCurrentIndex(), global_blp, dstid, bank, MEPHeader::SS_SELECT+bank)); ss.hdr.set( MEPHeader::WRITE, @@ -133,8 +136,10 @@ GCFEvent::TResult SSWrite::handleack(GCFEvent& event, GCFPortInterface& /*port*/ LOG_ERROR("SSWrite::handleack: invalid ack"); return GCFEvent::NOT_HANDLED; } - - Cache::getInstance().getState().ss().write_ack(global_blp); + + if ((getCurrentIndex() % itsActiveBanks) == 0) { + Cache::getInstance().getState().ss().write_ack(global_blp); + } return GCFEvent::HANDLED; } diff --git a/MAC/APL/PIC/RSP_Driver/src/SSWrite.h b/MAC/APL/PIC/RSP_Driver/src/SSWrite.h index 0f93c6b63c1ab498bd9e48236d0211b359793f02..4d14c3b14d730cf97ac13d539992124cc5b99364 100644 --- a/MAC/APL/PIC/RSP_Driver/src/SSWrite.h +++ b/MAC/APL/PIC/RSP_Driver/src/SSWrite.h @@ -60,8 +60,9 @@ namespace LOFAR { virtual GCFEvent::TResult handleack(GCFEvent& event, GCFPortInterface& port); private: - EPA_Protocol::MEPHeader m_hdr; int itsActiveBanks; + + EPA_Protocol::MEPHeader m_hdr; }; }; }; diff --git a/MAC/APL/PIC/RSP_Protocol/include/APL/RSP_Protocol/AllRegisterState.h b/MAC/APL/PIC/RSP_Protocol/include/APL/RSP_Protocol/AllRegisterState.h index 96712dd30bfb9069626a7b3afa7a234b1e84b67f..a3334af0aff49defe6c6ef375fd7f1e5cb03423e 100644 --- a/MAC/APL/PIC/RSP_Protocol/include/APL/RSP_Protocol/AllRegisterState.h +++ b/MAC/APL/PIC/RSP_Protocol/include/APL/RSP_Protocol/AllRegisterState.h @@ -67,7 +67,7 @@ public: rsuclear_state.resize(nrRspBoards); diagwgsettings_state.resize(nrRcus * EPA_Protocol::MEPHeader::N_DIAG_WG_REGISTERS); sst_state.resize(nrBlps * EPA_Protocol::MEPHeader::SST_N_FRAGMENTS); - bst_state.resize(nrRspBoards); + bst_state.resize(EPA_Protocol::MEPHeader::N_SERDES_LANES); xst_state.resize(nrRspBoards * EPA_Protocol::MEPHeader::XST_NR_STATS); cdo_state.resize(nrRspBoards * EPA_Protocol::MEPHeader::N_CDO_REGISTERS); bs_state.resize(nrBlps); diff --git a/MAC/APL/PIC/RSP_Protocol/include/APL/RSP_Protocol/MEPHeader.h b/MAC/APL/PIC/RSP_Protocol/include/APL/RSP_Protocol/MEPHeader.h index fe98a8314beb49dcfefb7e9a636dbc085a99f760..7f361bdcc790f02bba289c878baa5e47cf7164e5 100644 --- a/MAC/APL/PIC/RSP_Protocol/include/APL/RSP_Protocol/MEPHeader.h +++ b/MAC/APL/PIC/RSP_Protocol/include/APL/RSP_Protocol/MEPHeader.h @@ -247,6 +247,7 @@ public: static const uint16 N_BEAMLETS = N_SERDES_LANES * N_DATA_SLOTS; static const uint16 XLET_SIZE = N_POL * sizeof(std::complex<uint32>); static const uint16 WEIGHT_SIZE = N_POL * sizeof(std::complex<uint16>); + static const uint16 MAX_N_BANKS = 4; // TBB related constants static const uint16 TBB_MAXPAYLOADSIZE = 1948; // available TBB payload bytes diff --git a/MAC/APL/PIC/RSP_Protocol/include/APL/RSP_Protocol/Statistics.h b/MAC/APL/PIC/RSP_Protocol/include/APL/RSP_Protocol/Statistics.h index 493abb6ac296624fa3b70f2ba8c2965285d9213a..f4769f42beefd9c7e7e2e9cd4e4264a3ff8817d8 100644 --- a/MAC/APL/PIC/RSP_Protocol/include/APL/RSP_Protocol/Statistics.h +++ b/MAC/APL/PIC/RSP_Protocol/include/APL/RSP_Protocol/Statistics.h @@ -82,7 +82,7 @@ namespace LOFAR { * Statistics * Dimensions are: (N_DEVICES, N_SUBBANDS); * - * N_DEVICES == 2 * N_POL for beamlet statistics + * N_DEVICES == 2 * N_POL for beamlet statistics (2 *) for splitter * N_DEVICES == N_RSPBOARDS * N_BLPS * N_POL for subband statistics * */