From 41fb1775f8425e5f99d6f69f87b756d6cf34f127 Mon Sep 17 00:00:00 2001 From: Pieter Donker <donker@astron.nl> Date: Wed, 31 Oct 2012 10:21:43 +0000 Subject: [PATCH] Task #3785: small changes in communication and logging --- MAC/APL/PIC/RSP_Driver/src/BMRead.cc | 5 +++ MAC/APL/PIC/RSP_Driver/src/BMWrite.cc | 4 +- MAC/APL/PIC/RSP_Driver/src/BWWrite.cc | 23 +++++++---- MAC/APL/PIC/RSP_Driver/src/BWWrite.h | 1 + MAC/APL/PIC/RSP_Driver/src/BstRead.cc | 41 +++++++++---------- MAC/APL/PIC/RSP_Driver/src/BstRead.h | 4 +- MAC/APL/PIC/RSP_Driver/src/SSRead.cc | 1 + MAC/APL/PIC/RSP_Driver/src/SSWrite.cc | 13 ++++-- MAC/APL/PIC/RSP_Driver/src/SSWrite.h | 3 +- .../APL/RSP_Protocol/AllRegisterState.h | 2 +- .../include/APL/RSP_Protocol/MEPHeader.h | 1 + .../include/APL/RSP_Protocol/Statistics.h | 2 +- 12 files changed, 61 insertions(+), 39 deletions(-) diff --git a/MAC/APL/PIC/RSP_Driver/src/BMRead.cc b/MAC/APL/PIC/RSP_Driver/src/BMRead.cc index 41b2e14c1b1..1f562604615 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 3997cf280fc..e884df65895 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 bc7e51ee7e3..d04fd573c35 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 e8d45e17dbb..bc8a9c8dc72 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 01139bdb301..7f59eb6bb18 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 fc512e17ff2..efbeb5d320e 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 60f824ce1e8..5ec208b33f0 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 9ad8cb8bbf6..e7c8aa3ca6a 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 0f93c6b63c1..4d14c3b14d7 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 96712dd30bf..a3334af0aff 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 fe98a8314be..7f361bdcc79 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 493abb6ac29..f4769f42bee 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 * */ -- GitLab