/** @brief run AVGP (average pooling) op */
void run_avgp_op (TRINITY_CORE_PARA_OP& op) {
+ static const int AVGP_RSHAMTS[17] = {
+ 0, 0, 0, 1,
+ 1, 0, 2, 0,
+ 2, 3, 0, 0,
+ 3, 0, 0, 0,
+ 3};
+ static const int AVGP_MULTS[17] = {
+ 0, 0, 1073741824, 1431655765,
+ 1073741824, 0, 1431655765, 0,
+ 1073741824, 1908874354, 0, 0,
+ 1431655765, 0, 0, 0,
+ 1073741824};
avgp_fields avgp;
memcpy(&avgp, PC, sizeof(avgp));
+ op.info.OPCODE = 5;
+ op.cfg.WGT_QBIT = 1;
- /* TODO: Fill here */
+ op.cfg.FLT_H = avgp.flt_h_m1 + 1;
+ op.cfg.FLT_W = avgp.flt_w_m1 + 1;
+ op.cfg.STR_Y = avgp.str_y_m1 + 1;
+ op.cfg.STR_X = avgp.str_x_m1 + 1;
+ op.cfg.PAD_L = avgp.pad_l;
+ op.cfg.PAD_R = avgp.pad_r;
+ op.cfg.PAD_T = avgp.pad_t;
+ op.cfg.PAD_B = avgp.pad_b;
+
+ op.data_size.OUT_H = avgp.out_h_m1 + 1;
+ op.data_size.OUT_W = avgp.out_w_m1 + 1;
+ op.data_size.OUT_D = avgp.out_d_m1 + 1;
+ op.data_size.IN0_D = avgp.out_d_m1 + 1;
+
+ op.quant.IN0_ZERO = 0;
+ op.quant.OUT_ZERO = 0;
+
+ op.quant.OUT_RSHAMT = AVGP_RSHAMTS[op.cfg.FLT_H * op.cfg.FLT_W];
+ op.quant.OUT_MULT = AVGP_MULTS[op.cfg.FLT_H * op.cfg.FLT_W];
+ op.quant.OUT_LSHAMT = 0;
+
+ if (alloc_trinity_data (op, avgp.in0_eaddr0, -1, -1)) {
+ dump_fmap_out(avgp.out_eaddr0);
+ }
PC += sizeof(avgp);
}
switch (opcode) {
case VISA_RELU: /** @todo */
- case VISA_AVGP: /** @todo */
+ case VISA_AVGP:
+ run_avgp_op (op);
case VISA_NOP: /** do nothing */
PC += sizeof(uint32_t);
break;