File indexing completed on 2024-04-06 12:19:49
0001 #include "L1Trigger/DTTriggerPhase2/interface/vhdl_functions.h"
0002
0003
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 };