HPM SDK
HPMicro Software Development Kit
hpm_plb_drv.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2023 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #ifndef HPM_PLB_DRV_H
9 #define HPM_PLB_DRV_H
10 
11 #include "hpm_common.h"
12 #include "hpm_plb_regs.h"
13 
21 #define PLB_SLICE_MASK (0xf)
22 #define PLB_SLICE_HIGH_BIT_MASK_SET(slice) (PLB_SLICE_MASK << ((slice - plb_type_b_slice_8) << 2))
23 #define PLB_SLICE_HIGH_BIT_SHIFT(slice) ((slice - plb_type_b_slice_8) << 2)
24 #define PLB_SLICE_LOW_BIT_MASK_SET(slice) (PLB_SLICE_MASK << (slice << 2))
25 #define PLB_SLICE_LOW_BIT_SHIFT(slice) (slice << 2)
26 
31 typedef enum plb_chn {
32 #ifdef PLB_TYPE_B_0
33  plb_chn0 = PLB_TYPE_B_0,
34 #endif
35 #ifdef PLB_TYPE_B_1
36  plb_chn1 = PLB_TYPE_B_1,
37 #endif
38 #ifdef PLB_TYPE_B_2
39  plb_chn2 = PLB_TYPE_B_2,
40 #endif
41 #ifdef PLB_TYPE_B_3
42  plb_chn3 = PLB_TYPE_B_3,
43 #endif
44 #ifdef PLB_TYPE_B_4
45  plb_chn4 = PLB_TYPE_B_4,
46 #endif
47 #ifdef PLB_TYPE_B_5
48  plb_chn5 = PLB_TYPE_B_5,
49 #endif
50 #ifdef PLB_TYPE_B_6
51  plb_chn6 = PLB_TYPE_B_6,
52 #endif
53 #ifdef PLB_TYPE_B_7
54  plb_chn7 = PLB_TYPE_B_7,
55 #endif
57 
62 typedef enum plb_type_a_lut_num {
63 #ifdef PLB_TYPE_A_0
64  plb_type_a_table0 = PLB_TYPE_A_0,
65 #endif
66 #ifdef PLB_TYPE_A_1
67  plb_type_a_table1 = PLB_TYPE_A_1,
68 #endif
69 #ifdef PLB_TYPE_A_2
70  plb_type_a_table2 = PLB_TYPE_A_2,
71 #endif
72 #ifdef PLB_TYPE_A_3
73  plb_type_a_table3 = PLB_TYPE_A_3,
74 #endif
75 #ifdef PLB_TYPE_A_4
76  plb_type_a_table4 = PLB_TYPE_A_4,
77 #endif
78 #ifdef PLB_TYPE_A_5
79  plb_type_a_table5 = PLB_TYPE_A_5,
80 #endif
81 #ifdef PLB_TYPE_A_6
82  plb_type_a_table6 = PLB_TYPE_A_6,
83 #endif
84 #ifdef PLB_TYPE_A_7
85  plb_type_a_table7 = PLB_TYPE_A_7,
86 #endif
88 
93 typedef union {
94  struct {
95  uint16_t index0_1bit_out: 1;
96  uint16_t index1_1bit_out: 1;
97  uint16_t index2_1bit_out: 1;
98  uint16_t index3_1bit_out: 1;
99  uint16_t index4_1bit_out: 1;
100  uint16_t index5_1bit_out: 1;
101  uint16_t index6_1bit_out: 1;
102  uint16_t index7_1bit_out: 1;
103  uint16_t index8_1bit_out: 1;
104  uint16_t index9_1bit_out: 1;
105  uint16_t index10_1bit_out: 1;
106  uint16_t index11_1bit_out: 1;
107  uint16_t index12_1bit_out: 1;
108  uint16_t index13_1bit_out: 1;
109  uint16_t index14_1bit_out: 1;
110  uint16_t index15_1bit_out: 1;
111  };
112  uint16_t val;
114 
119 typedef enum plb_type_b_lut_slice {
137 
142 typedef enum plb_type_b_slice_opt {
156 
161 typedef enum plb_type_b_cmp {
167 
172 typedef enum plb_type_b_cmp_mode {
188 
189 
190 #ifdef __cplusplus
191 extern "C" {
192 #endif
193 
202 static inline void plb_type_a_set_lut(PLB_Type *plb, plb_chn_t chn, plb_type_a_lut_num_t lut_num, plb_type_a_truth_t *truth)
203 {
205 }
206 
214 static inline void plb_type_a_inject_by_sw(PLB_Type *plb, plb_chn_t chn, uint8_t inject_val)
215 {
216  plb->TYPE_A[chn].SW_INJECT = PLB_TYPE_A_SW_INJECT_SW_INJECT_SET(inject_val);
217 }
218 
227 static inline void plb_type_b_set_cmp_val(PLB_Type *plb, plb_chn_t chn, plb_type_b_cmp_t cmp_index, uint32_t val)
228 {
229  plb->TYPE_B[chn].CMP[cmp_index] = PLB_TYPE_B_CMP_CMP_VALUE_SET(val);
230 }
231 
240 static inline void plb_type_b_set_cmp_mode(PLB_Type *plb, plb_chn_t chn, plb_type_b_cmp_t cmp_index, plb_type_b_cmp_mode_t cmp_mode)
241 {
242  plb->TYPE_B[chn].MODE = (plb->TYPE_B[chn].MODE & (~(PLB_TYPE_B_MODE_OUT0_SEL_MASK << (cmp_index << 2)))) |
243  ((PLB_TYPE_B_MODE_OUT0_SEL_MASK & cmp_mode) << (cmp_index << 2));
244 }
245 
253 static inline void plb_type_b_inject_by_sw(PLB_Type *plb, plb_chn_t chn, uint32_t val)
254 {
255  plb->TYPE_B[chn].SW_INJECT = val;
256 }
257 
258 #ifdef PLB_TYPE_B_LUT_CMP_LUT_CMP_MASK
267 static inline void plb_type_b_set_cmp_lut(PLB_Type *plb, plb_chn_t chn, plb_type_b_cmp_t cmp_index, uint16_t val)
268 {
269  plb->TYPE_B[chn].LUT_CMP[cmp_index] = PLB_TYPE_B_LUT_CMP_LUT_CMP_SET(val);
270 }
271 #endif
272 
283 static inline uint32_t plb_type_b_get_counter(PLB_Type *plb, plb_chn_t chn)
284 {
285  return plb->TYPE_B[chn].SW_INJECT;
286 }
287 
297 
306 void plb_type_b_set_lut_range_mask(PLB_Type *plb, plb_chn_t chn, uint16_t mask, plb_type_b_slice_opt_t opt);
307 
316 
317 #ifdef __cplusplus
318 }
319 #endif
320 
325 #endif /* HPM_PLB_DRV_H */
326 
#define PLB_TYPE_A_2
Definition: hpm_plb_regs.h:145
#define PLB_TYPE_B_2
Definition: hpm_plb_regs.h:161
#define PLB_TYPE_B_MODE_OUT0_SEL_MASK
Definition: hpm_plb_regs.h:118
#define PLB_TYPE_B_CMP_2
Definition: hpm_plb_regs.h:155
#define PLB_TYPE_A_0
Definition: hpm_plb_regs.h:143
#define PLB_TYPE_B_CMP_1
Definition: hpm_plb_regs.h:154
#define PLB_TYPE_B_1
Definition: hpm_plb_regs.h:160
#define PLB_TYPE_A_LOOKUP_TABLE_LOOKUP_TABLE_SET(x)
Definition: hpm_plb_regs.h:36
#define PLB_TYPE_B_CMP_3
Definition: hpm_plb_regs.h:156
#define PLB_TYPE_A_3
Definition: hpm_plb_regs.h:146
#define PLB_TYPE_B_3
Definition: hpm_plb_regs.h:162
#define PLB_TYPE_A_SW_INJECT_SW_INJECT_SET(x)
Definition: hpm_plb_regs.h:47
#define PLB_TYPE_B_CMP_CMP_VALUE_SET(x)
Definition: hpm_plb_regs.h:69
#define PLB_TYPE_B_CMP_0
Definition: hpm_plb_regs.h:153
#define PLB_TYPE_A_1
Definition: hpm_plb_regs.h:144
#define PLB_TYPE_B_0
Definition: hpm_plb_regs.h:159
#define PLB_TYPE_A_7
Definition: hpm_plb_regs.h:150
#define PLB_TYPE_A_6
Definition: hpm_plb_regs.h:149
#define PLB_TYPE_B_4
Definition: hpm_plb_regs.h:167
#define PLB_TYPE_B_7
Definition: hpm_plb_regs.h:170
#define PLB_TYPE_B_6
Definition: hpm_plb_regs.h:169
#define PLB_TYPE_A_5
Definition: hpm_plb_regs.h:148
#define PLB_TYPE_B_5
Definition: hpm_plb_regs.h:168
#define PLB_TYPE_A_4
Definition: hpm_plb_regs.h:147
plb_type_b_lut_slice
Index of slice.
Definition: hpm_plb_drv.h:119
plb_chn
plb channels
Definition: hpm_plb_drv.h:31
static uint32_t plb_type_b_get_counter(PLB_Type *plb, plb_chn_t chn)
Get the counter value for PLB Type B.
Definition: hpm_plb_drv.h:283
enum plb_type_a_lut_num plb_type_a_lut_num_t
PLB look-up table unit.
plb_type_a_lut_num
PLB look-up table unit.
Definition: hpm_plb_drv.h:62
plb_type_b_cmp
Comparator index.
Definition: hpm_plb_drv.h:161
static void plb_type_a_inject_by_sw(PLB_Type *plb, plb_chn_t chn, uint8_t inject_val)
The software injects a cycle value into the TYPE A channel.
Definition: hpm_plb_drv.h:214
void plb_type_b_set_lut_range_mask(PLB_Type *plb, plb_chn_t chn, uint16_t mask, plb_type_b_slice_opt_t opt)
Batch set plb lut b type data, the unit corresponding to the bit marked with a mask of 1 is configure...
Definition: hpm_plb_drv.c:26
static void plb_type_a_set_lut(PLB_Type *plb, plb_chn_t chn, plb_type_a_lut_num_t lut_num, plb_type_a_truth_t *truth)
Configuring the truth table for lookup tables.
Definition: hpm_plb_drv.h:202
static void plb_type_b_set_cmp_val(PLB_Type *plb, plb_chn_t chn, plb_type_b_cmp_t cmp_index, uint32_t val)
Configure the value of the CMP.
Definition: hpm_plb_drv.h:227
enum plb_type_b_cmp_mode plb_type_b_cmp_mode_t
Comparator operation.
enum plb_type_b_slice_opt plb_type_b_slice_opt_t
Configuration of slice.
enum plb_type_b_cmp plb_type_b_cmp_t
Comparator index.
void plb_type_b_set_lut(PLB_Type *plb, plb_chn_t chn, plb_type_b_lut_slice_t slice, plb_type_b_slice_opt_t opt)
Configuring the PLB type_b's lookup table.
Definition: hpm_plb_drv.c:11
static void plb_type_b_set_cmp_mode(PLB_Type *plb, plb_chn_t chn, plb_type_b_cmp_t cmp_index, plb_type_b_cmp_mode_t cmp_mode)
Setting the mode of the CMP.
Definition: hpm_plb_drv.h:240
enum plb_chn plb_chn_t
plb channels
static void plb_type_b_inject_by_sw(PLB_Type *plb, plb_chn_t chn, uint32_t val)
Software injection values.
Definition: hpm_plb_drv.h:253
plb_type_b_slice_opt
Configuration of slice.
Definition: hpm_plb_drv.h:142
void plb_type_b_set_all_slice(PLB_Type *plb, plb_chn_t chn, plb_type_b_slice_opt_t opt)
Configure all lut to the same configuration.
Definition: hpm_plb_drv.c:38
enum plb_type_b_lut_slice plb_type_b_lut_slice_t
Index of slice.
plb_type_b_cmp_mode
Comparator operation.
Definition: hpm_plb_drv.h:172
@ plb_type_b_slice_11
Definition: hpm_plb_drv.h:131
@ plb_type_b_slice_8
Definition: hpm_plb_drv.h:128
@ plb_type_b_slice_14
Definition: hpm_plb_drv.h:134
@ plb_type_b_slice_15
Definition: hpm_plb_drv.h:135
@ plb_type_b_slice_3
Definition: hpm_plb_drv.h:123
@ plb_type_b_slice_5
Definition: hpm_plb_drv.h:125
@ plb_type_b_slice_1
Definition: hpm_plb_drv.h:121
@ plb_type_b_slice_6
Definition: hpm_plb_drv.h:126
@ plb_type_b_slice_2
Definition: hpm_plb_drv.h:122
@ plb_type_b_slice_13
Definition: hpm_plb_drv.h:133
@ plb_type_b_slice_4
Definition: hpm_plb_drv.h:124
@ plb_type_b_slice_9
Definition: hpm_plb_drv.h:129
@ plb_type_b_slice_0
Definition: hpm_plb_drv.h:120
@ plb_type_b_slice_12
Definition: hpm_plb_drv.h:132
@ plb_type_b_slice_7
Definition: hpm_plb_drv.h:127
@ plb_type_b_slice_10
Definition: hpm_plb_drv.h:130
@ plb_type_b_cmp1
Definition: hpm_plb_drv.h:163
@ plb_type_b_cmp3
Definition: hpm_plb_drv.h:165
@ plb_type_b_cmp0
Definition: hpm_plb_drv.h:162
@ plb_type_b_cmp2
Definition: hpm_plb_drv.h:164
@ plb_slice_opt_get_cmp0_val
Definition: hpm_plb_drv.h:144
@ plb_slice_opt_sub_two
Definition: hpm_plb_drv.h:150
@ plb_slice_opt_shift_right
Definition: hpm_plb_drv.h:153
@ plb_slice_opt_add_one
Definition: hpm_plb_drv.h:147
@ plb_slice_opt_shift_left_add_one
Definition: hpm_plb_drv.h:152
@ plb_slice_opt_sub_one
Definition: hpm_plb_drv.h:149
@ plb_slice_opt_get_cmp1_val
Definition: hpm_plb_drv.h:145
@ plb_slice_opt_keep
Definition: hpm_plb_drv.h:143
@ plb_slice_opt_get_cmp2_val
Definition: hpm_plb_drv.h:146
@ plb_slice_opt_add_two
Definition: hpm_plb_drv.h:148
@ plb_slice_opt_shift_right_add_one
Definition: hpm_plb_drv.h:154
@ plb_slice_opt_shift_left
Definition: hpm_plb_drv.h:151
@ plb_cmp_mode_ne
Definition: hpm_plb_drv.h:178
@ plb_cmp_mode_xor_mask
Definition: hpm_plb_drv.h:183
@ plb_cmp_mode_and_mask
Definition: hpm_plb_drv.h:181
@ plb_cmp_mode_xnor_mask
Definition: hpm_plb_drv.h:186
@ plb_cmp_mode_nand_mask
Definition: hpm_plb_drv.h:184
@ plb_cmp_mode_eq
Definition: hpm_plb_drv.h:177
@ plb_cmp_mode_out_one
Definition: hpm_plb_drv.h:174
@ plb_cmp_mode_or_mask
Definition: hpm_plb_drv.h:182
@ plb_cmp_mode_out_zero
Definition: hpm_plb_drv.h:173
@ plb_cmp_mode_lt
Definition: hpm_plb_drv.h:176
@ plb_cmp_mode_nor_mask
Definition: hpm_plb_drv.h:185
@ plb_cmp_mode_gt
Definition: hpm_plb_drv.h:175
@ plb_cmp_mode_le
Definition: hpm_plb_drv.h:180
@ plb_cmp_mode_ge
Definition: hpm_plb_drv.h:179
Definition: hpm_plb_regs.h:12
__RW uint32_t LOOKUP_TABLE[4]
Definition: hpm_plb_regs.h:14
__RW uint32_t CMP[4]
Definition: hpm_plb_regs.h:21
__RW uint32_t SW_INJECT
Definition: hpm_plb_regs.h:15
__RW uint32_t MODE
Definition: hpm_plb_regs.h:22
struct PLB_Type::@304 TYPE_A[4]
struct PLB_Type::@305 TYPE_B[4]
PLB truth table configuration unit.
Definition: hpm_plb_drv.h:93
uint16_t index9_1bit_out
Definition: hpm_plb_drv.h:104
uint16_t index0_1bit_out
Definition: hpm_plb_drv.h:95
uint16_t index15_1bit_out
Definition: hpm_plb_drv.h:110
uint16_t index8_1bit_out
Definition: hpm_plb_drv.h:103
uint16_t index1_1bit_out
Definition: hpm_plb_drv.h:96
uint16_t index5_1bit_out
Definition: hpm_plb_drv.h:100
uint16_t index7_1bit_out
Definition: hpm_plb_drv.h:102
uint16_t index11_1bit_out
Definition: hpm_plb_drv.h:106
uint16_t index4_1bit_out
Definition: hpm_plb_drv.h:99
uint16_t index12_1bit_out
Definition: hpm_plb_drv.h:107
uint16_t val
Definition: hpm_plb_drv.h:112
uint16_t index13_1bit_out
Definition: hpm_plb_drv.h:108
uint16_t index14_1bit_out
Definition: hpm_plb_drv.h:109
uint16_t index10_1bit_out
Definition: hpm_plb_drv.h:105
uint16_t index6_1bit_out
Definition: hpm_plb_drv.h:101
uint16_t index3_1bit_out
Definition: hpm_plb_drv.h:98
uint16_t index2_1bit_out
Definition: hpm_plb_drv.h:97