11 #include "trg/cdc/xsi_loader.h"
13 #include <trg/cdc/Cosim.h>
26 int Xsi::Loader::get_port_number_or_exit(std::string name)
28 int portNumber = get_port_number(name.c_str());
30 std::cerr <<
"ERROR: " << name <<
" not found" << std::endl;
41 design_libname{design}, wdbName{waveform},
42 loader{design, simengine_libname}, nMergers{nMergersIn}
46 outputToTracker.fill(0);
64 static constexpr
int outputWidth = 429;
66 static constexpr
int nTrackers = 429;
71 return inputToTSF.data();
75 inline std::array<char, outputWidth * 4>
getOutput()
77 return outputToTracker;
94 return std::string(outputToTracker.data());
99 std::string simengine_libname =
"librdi_simulator_kernel.so";
118 int enableOutTracker = 0;
120 int enableOutEVT = 0;
132 char outputArray[429] = {};
137 using namespace Cosim;
145 array<char, 32768> buffer;
148 if (fgets(buffer.data(), buffer.size(), stream) != NULL) {
151 cout <<
"received input to " << wdbName <<
":\n";
152 for (
int i = 0; i < inputWidth; ++i) {
153 cout << static_cast<int>(buffer[i]);
157 copy(buffer.begin(), buffer.begin() + inputWidth, inputToTSF.begin());
166 string buffer(input);
167 copy(buffer.begin(), buffer.begin() + inputWidth, inputToTSF.begin());
172 std::cout <<
"Design DLL : " << design_libname << std::endl;
173 std::cout <<
"Sim Engine DLL : " << simengine_libname << std::endl;
175 cout << getpid() <<
"\n";
178 memset(&info, 0,
sizeof(info));
179 info.logFileName = NULL;
180 info.wdbFileName =
const_cast<char*
>(wdbName.c_str());
183 string clkName =
"user_clk_127";
184 string inName =
"data_in";
185 string outName =
"TSF_TRACKER_OUT";
186 string enableInName =
"valid_in";
187 string enableTrackerName =
"valid_tracker";
188 string enableEVTName =
"valid_evttime";
190 clk = loader.get_port_number_or_exit(clkName);
191 inPort = loader.get_port_number_or_exit(inName);
192 outPort = loader.get_port_number_or_exit(outName);
193 enableIn = loader.get_port_number_or_exit(enableInName);
194 enableOutTracker = loader.get_port_number_or_exit(enableTrackerName);
195 enableOutEVT = loader.get_port_number_or_exit(enableEVTName);
196 int dataClock = loader.get_port_number_or_exit(
"user_clk_3175");
198 loader.put_value(dataClock, &
zero_val);
199 loader.put_value(enableIn, &
zero_val);
200 loader.put_value(inPort, inputToTSF.data());
201 for (
int i = 0; i < 32; ++i) {
203 loader.put_value(enableIn, &
one_val);
205 loader.put_value(clk, &
one_val);
210 cout <<
"worker " << design_libname <<
" initialized \n";
232 loader.put_value(inPort, inputToTSF.data());
234 loader.put_value(enableIn, &
one_val);
235 for (
int j = 0; j < 4; j++) {
242 loader.put_value(clk, &
one_val);
246 loader.get_value(outPort, outputToTracker.data());
258 }
catch (std::exception& e) {
259 std::cerr <<
"ERROR: An exception occurred: " << e.what() << std::endl;
262 std::cerr <<
"ERROR: An unknown exception occurred." << std::endl;
268 int main(
int argc,
char* argv[])
271 cerr <<
"too few arguments!" <<
"\n";
274 int inputFileDescriptor = stoi(argv[1]);
275 int outputFileDescriptor = stoi(argv[2]);
276 FILE* instream = fdopen(inputFileDescriptor,
"r");
278 ostream* outstream = createOutStreamFromFD(outputFileDescriptor);
281 (*outstream) <<
"init" << endl;
283 while (!feof(instream) && !ferror(instream) && worker.setInput(instream)) {
299 (*outstream) << string(worker.getOutput().data(), worker.outputWidth * 4) << endl;
303 close(inputFileDescriptor);
304 close(outputFileDescriptor);