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