otsdaq_components  v2_02_00
PSI46DigROCDefinitions.cc
1 /*
2  * PSI46DigROCDefinitions.cc
3  *
4  * Created on: Jun 12, 2013
5  * Author: Luigi Vigani
6  */
7 
8 #include "otsdaq-components/DetectorHardware/PSI46DigROCDefinitions.h"
9 #include "otsdaq-core/BitManipulator/BitManipulator.h"
10 //#include "otsdaq-core/MessageFacility/MessageFacility.h"
11 #include "otsdaq-core/Macros/CoutMacros.h"
12 #include <cassert>
13 #include <iostream>
14 #include<cstdlib>
15 
16 using namespace ots;
17 
18 
19 //========================================================================================================================
20 PSI46DigROCDefinitions::PSI46DigROCDefinitions()
21 {
22 }
23 
24 //========================================================================================================================
25 PSI46DigROCDefinitions::~PSI46DigROCDefinitions (void)
26 {}
27 
28 //========================================================================================================================
29 unsigned int PSI46DigROCDefinitions::getDACRegisterAddress(const std::string& registerName)
30 {
31  if (registerName == "PulserData" ) return 1;
32  else if (registerName == "PulserControl") return 2;
33  else if (registerName == "IntegratorVbn") return 3;
34  else if (registerName == "ShaperVbp2" ) return 4;
35  else if (registerName == "ShaperVbp1" ) return 5;
36  else if (registerName == "BLRestorer" ) return 6;
37  else if (registerName == "VTn" ) return 7;
38  else if (registerName == "VTp0" ) return 8;
39  else if (registerName == "VTp1" ) return 9;
40  else if (registerName == "VTp2" ) return 10;
41  else if (registerName == "VTp3" ) return 11;
42  else if (registerName == "VTp4" ) return 12;
43  else if (registerName == "VTp5" ) return 13;
44  else if (registerName == "VTp6" ) return 14;
45  else if (registerName == "VTp7" ) return 15;
46  else if (registerName == "ActiveLines" ) return 16;
47  else if (registerName == "SendData" ) return 19;
48  else if (registerName == "RejectHits" ) return 20;
49  else if (registerName == "DigContrReg" ) return 27;
50  else if (registerName == "AqBCO" ) return 30;
51  //Kill and Inject are GENERAL names that will be used for all ROCs
52  else if (registerName == "Kill" ) return 17;
53  else if (registerName == "Inject" ) return 18;
54  else
55  {
56  std::cout << __COUT_HDR_FL__ << " Register Name not recognized!" << std::endl;
57  assert(0);
58  }
59  return 0;
60 }
61 
62 //========================================================================================================================
63 uint64_t PSI46DigROCDefinitions::makeDACWriteHeader(int chipId, const std::string& registerName)
64 {
65  return makeDACHeader(chipId, registerName, write);
66 }
67 
68 //========================================================================================================================
69 uint64_t PSI46DigROCDefinitions::makeDACSetHeader(int chipId, const std::string& registerName)
70 {
71  return makeDACHeader(chipId, registerName, set);
72 }
73 
74 //========================================================================================================================
75 uint64_t PSI46DigROCDefinitions::makeDACResetHeader(int chipId, const std::string& registerName)
76 {
77  return makeDACHeader(chipId, registerName, reset);
78 }
79 
80 //========================================================================================================================
81 uint64_t PSI46DigROCDefinitions::makeDACReadHeader(int chipId, const std::string& registerName)
82 {
83  return makeDACHeader(chipId, registerName, read);
84 }
85 
86 //========================================================================================================================
87 uint64_t PSI46DigROCDefinitions::makeDACHeader(int chipId, const std::string& registerName, unsigned int instruction)
88 {
89 /*Ryan
90  uint64_t command = 0;
91  //Insert Chip ID
92  BitManipulator::insertBits(command,BitManipulator::reverseBits(chipId,0,5),0,5);
93  //Insert Register Address
94  BitManipulator::insertBits(command,BitManipulator::reverseBits(getDACRegisterAddress(registerName),0,5),5,5);
95  //Insert instruction
96  BitManipulator::insertBits(command,BitManipulator::reverseBits(instruction,0,3),10,3);
97 */
98  uint32_t command = 0x80000000;
99  uint32_t registerAddress = getDACRegisterAddress(registerName);
100  //Insert Chip ID
101  BitManipulator::insertBits(command,chipId,0,5);
102  //Insert Register Address
103  BitManipulator::insertBits(command,registerAddress,5,5);
104  //Insert instruction
105  BitManipulator::insertBits(command,instruction,10,3);
106 
107  //Insert mask
108  //BitManipulator::insertBits(command,0x1,16,8);
109  unsigned int length = 3;
110  if ( registerAddress < 16 || registerAddress < 27 || registerAddress < 30)
111  length = 3;
112  else if ( registerAddress == 17 || registerAddress == 18 )
113  length = 4;
114  else if ( registerAddress == 16 )
115  length = 2;
116  else if ( registerAddress == 19 || registerAddress == 20 )
117  length = 1;
118  //Insert command length
119  BitManipulator::insertBits(command,length,24,7);
120 
121  return command;
122 }
123 
124 //========================================================================================================================
125 uint64_t PSI46DigROCDefinitions::makeDACWriteCommand(int chipId, const std::string& registerName, unsigned int valueToWrite)
126 {
127  std::cout << __COUT_HDR_FL__ << "Working on Register " << registerName << " Address: " << getDACRegisterAddress(registerName) << " Value: " << valueToWrite << std::endl;
128  uint64_t command = 0;
129  if (registerName != "SendData" && registerName != "RejectHits")
130  {
131  command = makeDACWriteHeader(chipId, registerName);
132  BitManipulator::insertBits(command,BitManipulator::reverseBits(valueToWrite,0,8),13,8);
133  }
134  else
135  if (valueToWrite == 1)
136  command = makeDACSetHeader(chipId, registerName);
137  else
138  command = makeDACResetHeader(chipId, registerName);
139  //BitManipulator::insertBits(command,0x0,13,8);It doesn't matter the value you put in if is set or reset!
140 
141  return command;
142 }
143 
144 //========================================================================================================================
145 uint64_t PSI46DigROCDefinitions::makeDACReadCommand(int chipId, const std::string& registerName)
146 {
147  return makeDACHeader(chipId, registerName, read);
148 }
149 
150 //========================================================================================================================
151 std::string PSI46DigROCDefinitions::makeMaskWriteCommand (int chipId, const std::string& registerName, std::string valueToWrite)
152 {
153  std::string command = "0000000000000000000";
154 
155 
156 
157 /*Ryan's
158  //Insert Chip ID
159  //BitManipulator::insertBits(command,BitManipulator::reverseBits(chipId,0,5),0,5);
160  BitManipulator::insertBits(command,chipId,0,5);
161  //Insert Register Address
162  //BitManipulator::insertBits(command,BitManipulator::reverseBits(getDACRegisterAddress(registerName),0,5),5,5);
163  BitManipulator::insertBits(command,getDACRegisterAddress(registerName),5,5);
164  //Insert instruction
165  //BitManipulator::insertBits(command,writeReversed,10,3);
166  BitManipulator::insertBits(command,write,10,3);
167 
168  UInt8 revField = (UInt8)0;
169  for (unsigned int c=0; c<valueToWrite.length(); c++)
170  {
171  if(registerName == "Inject")
172  revField = !(UInt8)valueToWrite.substr(c,1).data()[0];
173  else
174  revField = (UInt8)valueToWrite.substr(c,1).data()[0];
175  //revField = 0x40;
176  BitManipulator::insertBits(command,(uint64_t)revField,13+c,1);
177  }
178 
179  std::cout << __COUT_HDR_FL__ << " std::string made: " << std::endl;
180  for (int i=0; i<19; i++)
181  {
182  std::cout << __COUT_HDR_FL__ << hex << (uint64_t)command.substr(i, 1).data()[0] << "-" << std::endl;
183  }
184  std::cout << __COUT_HDR_FL__ << "\n" << std::endl;
185 */
186  return command;
187 }
188 
189 //========================================================================================================================
190 uint64_t PSI46DigROCDefinitions::makeMaskReadCommand (int chipId, const std::string& registerName)
191 {
192  return 0;
193 }
194 
195 //========================================================================================================================
196 uint64_t PSI46DigROCDefinitions::setSendData(int chipId)
197 {
198  return makeDACWriteCommand(chipId, "SendData", 1);
199 }
200 
201 //========================================================================================================================
202 uint64_t PSI46DigROCDefinitions::resetSendData(int chipId)
203 {
204  return makeDACWriteCommand(chipId, "SendData", 0);
205 }
206 
207 //========================================================================================================================
208 uint64_t PSI46DigROCDefinitions::setRejectHits(int chipId)
209 {
210  return makeDACWriteCommand(chipId, "RejectHits", 1);
211 }
212 
213 //========================================================================================================================
214 uint64_t PSI46DigROCDefinitions::resetRejectHits(int chipId)
215 {
216  return makeDACWriteCommand(chipId, "RejectHits", 0);
217 }