@@ -33,16 +33,16 @@ AlfServer::AlfServer() : mRpcServers()
3333{
3434}
3535
36- std::string AlfServer::registerRead (const std::string& parameter, std::shared_ptr<roc::BarInterface> bar2 )
36+ std::string AlfServer::registerRead (const std::string& parameter, std::shared_ptr<roc::BarInterface> bar )
3737{
3838 uint32_t address = Util::stringToHex (parameter); // Error from here will get picked up by the StringRpcServer try clause
3939 // Util::checkAddress(address);
4040
41- uint32_t value = bar2 ->readRegister (address / 4 );
41+ uint32_t value = bar ->readRegister (address / 4 );
4242 return Util::formatValue (value);
4343}
4444
45- std::string AlfServer::registerWrite (const std::string& parameter, std::shared_ptr<roc::BarInterface> bar2 )
45+ std::string AlfServer::registerWrite (const std::string& parameter, std::shared_ptr<roc::BarInterface> bar )
4646{
4747 std::vector<std::string> params = Util::split (parameter, pairSeparator ());
4848
@@ -54,10 +54,32 @@ std::string AlfServer::registerWrite(const std::string& parameter, std::shared_p
5454 // Util::checkAddress(address);
5555 uint32_t value = Util::stringToHex (params[1 ]);
5656
57- bar2 ->writeRegister (address / 4 , value);
57+ bar ->writeRegister (address / 4 , value);
5858 return " " ;
5959}
6060
61+ std::string AlfServer::registerBlobWrite (const std::string& parameter, AlfLink link)
62+ {
63+ std::vector<std::string> stringPairs = Util::split (parameter, argumentSeparator ());
64+ std::vector<std::vector<uint32_t >> registerPairs = parseStringToRegisterPairs (stringPairs);
65+ std::stringstream resultBuffer;
66+ uint32_t value;
67+ uint32_t address;
68+ for (const auto & registerPair : registerPairs) {
69+ address = registerPair.at (0 );
70+ if (registerPair.size () == 1 ) {
71+ value = link.bar ->readRegister (address / 4 );
72+ resultBuffer << Util::formatValue (value) << " \n " ;
73+ } else if (registerPair.size () == 2 ) {
74+ value = registerPair.at (1 );
75+ link.bar ->writeRegister (address / 4 , value);
76+ resultBuffer << " 0"
77+ << " \n " ;
78+ }
79+ }
80+ return resultBuffer.str ();
81+ }
82+
6183std::string AlfServer::scaBlobWrite (const std::string& parameter, AlfLink link)
6284{
6385 std::vector<std::string> stringPairs = Util::split (parameter, argumentSeparator ());
@@ -177,6 +199,16 @@ roc::PatternPlayer::Info AlfServer::parseStringToPatternPlayerInfo(const std::ve
177199 return ppInfo;
178200}
179201
202+ std::vector<uint32_t > AlfServer::stringToRegisterPair (const std::string stringPair)
203+ {
204+ std::vector<uint32_t > registers;
205+ auto stringRegisters = Util::split (stringPair, pairSeparator ());
206+ for (const auto & stringRegister : stringRegisters) {
207+ registers.push_back (Util::stringToHex (stringRegister));
208+ }
209+ return registers;
210+ }
211+
180212std::pair<Sca::Data, Sca::Operation> AlfServer::stringToScaPair (const std::string stringPair)
181213{
182214 std::vector<std::string> scaPair = Util::split (stringPair, pairSeparator ());
@@ -209,7 +241,6 @@ std::pair<Sca::Data, Sca::Operation> AlfServer::stringToScaPair(const std::strin
209241// / Converts a 76-bit hex number string
210242std::pair<Swt::Data, Swt::Operation> AlfServer::stringToSwtPair (const std::string stringPair)
211243{
212- std::cout << " trigger" << std::endl;
213244 std::vector<std::string> swtPair = Util::split (stringPair, pairSeparator ());
214245 if (swtPair.size () < 1 || swtPair.size () > 2 ) {
215246 BOOST_THROW_EXCEPTION (
@@ -346,6 +377,17 @@ std::pair<Ic::IcData, Ic::Operation> AlfServer::stringToIcPair(const std::string
346377 return std::make_pair (icData, icOperation);
347378}
348379
380+ std::vector<std::vector<uint32_t >> AlfServer::parseStringToRegisterPairs (std::vector<std::string> stringPairs)
381+ {
382+ std::vector<std::vector<uint32_t >> pairs;
383+ for (const auto & stringPair : stringPairs) {
384+ if (stringPair.find (' #' ) == std::string::npos) {
385+ pairs.push_back (stringToRegisterPair (stringPair));
386+ }
387+ }
388+ return pairs;
389+ }
390+
349391std::vector<std::pair<Sca::Data, Sca::Operation>> AlfServer::parseStringToScaPairs (std::vector<std::string> stringPairs)
350392{
351393 std::vector<std::pair<Sca::Data, Sca::Operation>> pairs;
@@ -394,35 +436,42 @@ void AlfServer::makeRpcServers(std::vector<AlfLink> links)
394436 ServiceNames names (link);
395437
396438 // Start the RPC Servers
397- auto & servers = mRpcServers [link.cruSequence ][link.linkId ];
398- std::shared_ptr<roc::BarInterface> bar2 = link.bar2 ;
399-
400- if (link.linkId == 0 ) { // Register Read / Write services are per card; register them as soon as possible
401- // Register Read
402- servers.push_back (makeServer (names.registerRead (),
403- [bar2](auto parameter) { return registerRead (parameter, bar2); }));
404- // Register Write
405- servers.push_back (makeServer (names.registerWrite (),
406- [bar2](auto parameter) { return registerWrite (parameter, bar2); }));
407-
408- // Register Write
409- servers.push_back (makeServer (names.patternPlayer (),
410- [bar2](auto parameter) { return patternPlayer (parameter, bar2); }));
411- }
439+ auto & servers = mRpcServers [link.cardSequence ][link.linkId ];
440+ std::shared_ptr<roc::BarInterface> bar = link.bar ;
441+
442+ if (link.cardType == roc::CardType::Cru) {
443+ if (link.linkId == 0 ) { // Register Read / Write services are per card; register them as soon as possible
444+ // Register Read
445+ servers.push_back (makeServer (names.registerRead (),
446+ [bar](auto parameter) { return registerRead (parameter, bar); }));
447+ // Register Write
448+ servers.push_back (makeServer (names.registerWrite (),
449+ [bar](auto parameter) { return registerWrite (parameter, bar); }));
450+
451+ // Pattern Player
452+ servers.push_back (makeServer (names.patternPlayer (),
453+ [bar](auto parameter) { return patternPlayer (parameter, bar); }));
454+ }
412455
413- // SCA Sequence
414- servers.push_back (makeServer (names.scaSequence (),
415- [link](auto parameter) { return scaBlobWrite (parameter, link); }));
416- // SWT Sequence
417- servers.push_back (makeServer (names.swtSequence (),
418- [link](auto parameter) { return swtBlobWrite (parameter, link); }));
419- // IC Sequence
420- servers.push_back (makeServer (names.icSequence (),
421- [link](auto parameter) { return icBlobWrite (parameter, link); }));
422-
423- // IC GBT I2C write
424- servers.push_back (makeServer (names.icGbtI2cWrite (),
425- [link](auto parameter) { return icGbtI2cWrite (parameter, link); }));
456+ // SCA Sequence
457+ servers.push_back (makeServer (names.scaSequence (),
458+ [link](auto parameter) { return scaBlobWrite (parameter, link); }));
459+ // SWT Sequence
460+ servers.push_back (makeServer (names.swtSequence (),
461+ [link](auto parameter) { return swtBlobWrite (parameter, link); }));
462+ // IC Sequence
463+ servers.push_back (makeServer (names.icSequence (),
464+ [link](auto parameter) { return icBlobWrite (parameter, link); }));
465+
466+ // IC GBT I2C write
467+ servers.push_back (makeServer (names.icGbtI2cWrite (),
468+ [link](auto parameter) { return icGbtI2cWrite (parameter, link); }));
469+
470+ } else if (link.cardType == roc::CardType::Crorc) {
471+ // Register Sequence
472+ servers.push_back (makeServer (names.registerSequence (),
473+ [link](auto parameter) { return registerBlobWrite (parameter, link); }));
474+ }
426475 }
427476}
428477
0 commit comments