Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:19:49

0001 #include "L1Trigger/DTTriggerPhase2/interface/vhdl_functions.h"
0002 
0003 // "a la vhdl" functions
0004 std::vector<int> vhdl_slice(std::vector<int> v, int upper, int lower) {
0005   int final_value = lower;
0006   if (final_value < 0)
0007     final_value = 0;
0008 
0009   std::vector<int> v1;
0010   for (int i = final_value; i <= upper; i++) {
0011     v1.push_back(v[i]);
0012   }
0013   return v1;
0014 }
0015 
0016 int vhdl_unsigned_to_int(std::vector<int> v) {
0017   int res = 0;
0018 
0019   for (size_t i = 0; i < v.size(); i++) {
0020     res = res + v[i] * std::pow(2, i);
0021   }
0022   return res;
0023 }
0024 
0025 int vhdl_signed_to_int(std::vector<int> v) {
0026   if (v[v.size() - 1] == 0)
0027     return vhdl_unsigned_to_int(v);
0028   else
0029     return -(std::pow(2, v.size()) - vhdl_unsigned_to_int(v));
0030 }
0031 
0032 void vhdl_int_to_unsigned(int value, std::vector<int> &v) {
0033   if (value == 0) {
0034     v.push_back(0);
0035   } else if (value != 1) {
0036     v.push_back(value % 2);
0037     vhdl_int_to_unsigned(value / 2, v);
0038   } else {
0039     v.push_back(1);
0040   }
0041   return;
0042 }
0043 
0044 void vhdl_int_to_signed(int value, std::vector<int> &v) {
0045   if (value < 0) {
0046     int val = 1;
0047     int size = 1;
0048     while (val < -value) {
0049       val *= 2;
0050       size += 1;
0051     }
0052     vhdl_int_to_unsigned(val + value, v);
0053     for (int i = v.size(); i < size - 1; i++) {
0054       v.push_back(0);
0055     }
0056     v.push_back(1);
0057   } else {
0058     vhdl_int_to_unsigned(value, v);
0059     v.push_back(0);
0060   }
0061   return;
0062 }
0063 
0064 void vhdl_resize_unsigned(std::vector<int> &v, int new_size) {
0065   for (int i = v.size(); i < new_size; i++) {
0066     v.push_back(0);
0067   }
0068 }
0069 
0070 void vhdl_resize_signed(std::vector<int> &v, int new_size) {
0071   int elem = 0;
0072   if (v[v.size() - 1] == 1)
0073     elem = 1;
0074   for (int i = v.size(); i < new_size; i++) {
0075     v.push_back(elem);
0076   }
0077 }
0078 
0079 bool vhdl_resize_signed_ok(std::vector<int> v, int new_size) {
0080   for (size_t i = v.size() - 1 - 1; i >= v.size() - 1 - (v.size() - new_size); i--) {
0081     if (v[i] != v[v.size() - 1])
0082       return false;
0083   }
0084   return true;
0085 };
0086 
0087 bool vhdl_resize_unsigned_ok(std::vector<int> v, int new_size) {
0088   for (size_t i = v.size() - 1; i >= v.size() - 1 + 1 - (v.size() - new_size); i--) {
0089     if (v[i] != 0)
0090       return false;
0091   }
0092   return true;
0093 };