22#define DATAFORMATS_L1TPARTICLEFLOW_ENCODING_H
33
44#include < cassert>
5+ #include < type_traits>
6+
57#include " DataFormats/L1TParticleFlow/interface/datatypes.h"
68
79template <typename U, typename T>
@@ -28,64 +30,210 @@ inline void unpack_bool_from_bits(const U& u, unsigned int& start, bool& data) {
2830 data = u[start++];
2931}
3032
31- template <unsigned int N, unsigned int OFFS = 0 , typename T, int NB>
33+ // Enum to define different packing strategies for data encoding
34+ // DEFAULT: Standard packing
35+ // BARREL: Packing strategy for barrel region
36+ // ENDCAP: Packing strategy for endcap region
37+ enum class PackingStrategy { DEFAULT, BARREL, ENDCAP };
38+
39+ // Default case: Calls T::unpack()
40+ template <typename T,
41+ int NB,
42+ PackingStrategy METHOD = PackingStrategy::DEFAULT,
43+ typename std::enable_if<METHOD == PackingStrategy::DEFAULT, int >::type = 0 >
44+ inline auto unpack_helper (const ap_uint<NB>& data) {
45+ static_assert (T::BITWIDTH <= NB, " NB Type is too small for the object" );
46+ return T::unpack (data);
47+ }
48+
49+ // Specialization for BARREL
50+ template <typename T,
51+ int NB,
52+ PackingStrategy METHOD,
53+ typename std::enable_if<METHOD == PackingStrategy::BARREL, int >::type = 0 >
54+ inline auto unpack_helper (const ap_uint<NB>& data) {
55+ static_assert (T::BITWIDTH_BARREL <= NB, " NB Type is too small for the object" );
56+ return T::unpack_barrel (data);
57+ }
58+
59+ // Specialization for ENDCAP
60+ template <typename T,
61+ int NB,
62+ PackingStrategy METHOD,
63+ typename std::enable_if<METHOD == PackingStrategy::ENDCAP, int >::type = 0 >
64+ inline auto unpack_helper (const ap_uint<NB>& data) {
65+ static_assert (T::BITWIDTH_ENDCAP <= NB, " NB Type is too small for the object" );
66+ return T::unpack_endcap (data);
67+ }
68+
69+ // Default case: Calls T::unpack()
70+ template <typename T,
71+ int NB,
72+ PackingStrategy METHOD = PackingStrategy::DEFAULT,
73+ typename std::enable_if<METHOD == PackingStrategy::DEFAULT, int >::type = 0 >
74+ inline auto unpack_slim_helper (const ap_uint<NB>& data) {
75+ static_assert (T::BITWIDTH_SLIM <= NB, " NB Type is too small for the object" );
76+ return T::unpack (data);
77+ }
78+
79+ // Specialization for BARREL
80+ template <typename T,
81+ int NB,
82+ PackingStrategy METHOD,
83+ typename std::enable_if<METHOD == PackingStrategy::BARREL, int >::type = 0 >
84+ inline auto unpack_slim_helper (const ap_uint<NB>& data) {
85+ static_assert (T::BITWIDTH_BARREL_SLIM <= NB, " NB Type is too small for the object" );
86+ return T::unpack_barrel (data);
87+ }
88+
89+ // Specialization for ENDCAP
90+ template <typename T,
91+ int NB,
92+ PackingStrategy METHOD,
93+ typename std::enable_if<METHOD == PackingStrategy::ENDCAP, int >::type = 0 >
94+ inline auto unpack_slim_helper (const ap_uint<NB>& data) {
95+ static_assert (T::BITWIDTH_ENDCAP_SLIM <= NB, " NB Type is too small for the object" );
96+ return T::unpack_endcap (data);
97+ }
98+
99+ // Default case: Calls T::unpack()
100+ template <typename T,
101+ int NB,
102+ PackingStrategy METHOD = PackingStrategy::DEFAULT,
103+ typename std::enable_if<METHOD == PackingStrategy::DEFAULT, int >::type = 0 >
104+ inline auto pack_helper (const T& obj) {
105+ static_assert (T::BITWIDTH <= NB, " NB Type is too small for the object" );
106+ return obj.pack ();
107+ }
108+
109+ // Specialization for BARREL
110+ template <typename T,
111+ int NB,
112+ PackingStrategy METHOD,
113+ typename std::enable_if<METHOD == PackingStrategy::BARREL, int >::type = 0 >
114+ inline auto pack_helper (const T& obj) {
115+ static_assert (T::BITWIDTH_BARREL <= NB, " NB Type is too small for the object" );
116+ return obj.pack_barrel ();
117+ }
118+
119+ // Specialization for ENDCAP
120+ template <typename T,
121+ int NB,
122+ PackingStrategy METHOD,
123+ typename std::enable_if<METHOD == PackingStrategy::ENDCAP, int >::type = 0 >
124+ inline auto pack_helper (const T& obj) {
125+ static_assert (T::BITWIDTH_ENDCAP <= NB, " NB Type is too small for the object" );
126+ return obj.pack_endcap ();
127+ }
128+
129+ // Default case: Calls T::unpack()
130+ template <typename T,
131+ int NB,
132+ PackingStrategy METHOD = PackingStrategy::DEFAULT,
133+ typename std::enable_if<METHOD == PackingStrategy::DEFAULT, int >::type = 0 >
134+ inline auto pack_slim_helper (const T& obj) {
135+ static_assert (T::BITWIDTH_SLIM <= NB, " NB Type is too small for the object" );
136+ return obj.pack_slim ();
137+ }
138+
139+ // Specialization for BARREL
140+ template <typename T,
141+ int NB,
142+ PackingStrategy METHOD,
143+ typename std::enable_if<METHOD == PackingStrategy::BARREL, int >::type = 0 >
144+ inline auto pack_slim_helper (const T& obj) {
145+ static_assert (T::BITWIDTH_BARREL_SLIM <= NB, " NB Type is too small for the object" );
146+ return obj.pack_barrel_slim ();
147+ }
148+
149+ // Specialization for ENDCAP
150+ template <typename T,
151+ int NB,
152+ PackingStrategy METHOD,
153+ typename std::enable_if<METHOD == PackingStrategy::ENDCAP, int >::type = 0 >
154+ inline auto pack_slim_helper (const T& obj) {
155+ static_assert (T::BITWIDTH_ENDCAP_SLIM <= NB, " NB Type is too small for the object" );
156+ return obj.pack_endcap_slim ();
157+ }
158+
159+ template <unsigned int N, PackingStrategy METHOD = PackingStrategy::DEFAULT, unsigned int OFFS = 0 , typename T, int NB>
32160inline void l1pf_pattern_pack (const T objs[N], ap_uint<NB> data[]) {
33161#ifdef __SYNTHESIS__
34162#pragma HLS inline
35163#pragma HLS inline region recursive
36164#endif
37- assert (T::BITWIDTH <= NB);
38165 for (unsigned int i = 0 ; i < N; ++i) {
39166#ifdef __SYNTHESIS__
40167#pragma HLS unroll
41168#endif
42- data[i + OFFS] = objs[i]. pack ( );
169+ data[i + OFFS] = pack_helper<T, NB, METHOD>( objs[i]);
43170 }
44171}
45172
46- template <unsigned int N, unsigned int OFFS = 0 , typename T, int NB>
173+ // overlaod for default strategy
174+ template <unsigned int N, unsigned int OFFS, typename T, int NB>
175+ inline void l1pf_pattern_pack (const T objs[N], ap_uint<NB> data[]) {
176+ l1pf_pattern_pack<N, PackingStrategy::DEFAULT, OFFS, T, NB>(objs, data);
177+ }
178+
179+ template <unsigned int N, PackingStrategy METHOD = PackingStrategy::DEFAULT, unsigned int OFFS = 0 , typename T, int NB>
47180inline void l1pf_pattern_unpack (const ap_uint<NB> data[], T objs[N]) {
48181#ifdef __SYNTHESIS__
49182#pragma HLS inline
50183#pragma HLS inline region recursive
51184#endif
52- assert (T::BITWIDTH <= NB);
53185 for (unsigned int i = 0 ; i < N; ++i) {
54186#ifdef __SYNTHESIS__
55187#pragma HLS unroll
56188#endif
57- objs[i] = T::unpack (data[i + OFFS]);
189+ objs[i] = unpack_helper<T, NB, METHOD> (data[i + OFFS]);
58190 }
59191}
60192
61- template <unsigned int N, unsigned int OFFS = 0 , typename T, int NB>
193+ // overlaod for default strategy
194+ template <unsigned int N, unsigned int OFFS, typename T, int NB>
195+ inline void l1pf_pattern_unpack (const ap_uint<NB> data[], T objs[N]) {
196+ l1pf_pattern_unpack<N, PackingStrategy::DEFAULT, OFFS, T, NB>(data, objs);
197+ }
198+
199+ template <unsigned int N, PackingStrategy METHOD = PackingStrategy::DEFAULT, unsigned int OFFS = 0 , typename T, int NB>
62200inline void l1pf_pattern_pack_slim (const T objs[N], ap_uint<NB> data[]) {
63201#ifdef __SYNTHESIS__
64202#pragma HLS inline
65203#pragma HLS inline region recursive
66204#endif
67- assert (T::BITWIDTH_SLIM <= NB);
68205 for (unsigned int i = 0 ; i < N; ++i) {
69206#ifdef __SYNTHESIS__
70207#pragma HLS unroll
71208#endif
72- data[i + OFFS] = objs[i]. pack_slim ( );
209+ data[i + OFFS] = pack_slim_helper<T, NB, METHOD>( objs[i]);
73210 }
74211}
75212
76- template <unsigned int N, unsigned int OFFS = 0 , typename T, int NB>
213+ // overlaod for default strategy
214+ template <unsigned int N, unsigned int OFFS, typename T, int NB>
215+ inline void l1pf_pattern_pack_slim (const T objs[N], ap_uint<NB> data[]) {
216+ l1pf_pattern_pack_slim<N, PackingStrategy::DEFAULT, OFFS, T, NB>(objs, data);
217+ }
218+
219+ template <unsigned int N, PackingStrategy METHOD = PackingStrategy::DEFAULT, unsigned int OFFS = 0 , typename T, int NB>
77220inline void l1pf_pattern_unpack_slim (const ap_uint<NB> data[], T objs[N]) {
78221#ifdef __SYNTHESIS__
79222#pragma HLS inline
80223#pragma HLS inline region recursive
81224#endif
82- assert (T::BITWIDTH_SLIM <= NB);
83225 for (unsigned int i = 0 ; i < N; ++i) {
84226#ifdef __SYNTHESIS__
85227#pragma HLS unroll
86228#endif
87- objs[i] = T::unpack (data[i + OFFS]);
229+ objs[i] = unpack_slim_helper<T, NB, METHOD> (data[i + OFFS]);
88230 }
89231}
90232
233+ // overlaod for default strategy
234+ template <unsigned int N, unsigned int OFFS, typename T, int NB>
235+ inline void l1pf_pattern_unpack_slim (const ap_uint<NB> data[], T objs[N]) {
236+ l1pf_pattern_unpack_slim<N, PackingStrategy::DEFAULT, OFFS, T, NB>(data, objs);
237+ }
238+
91239#endif
0 commit comments