int SIM_power_ALU_record(SIM_power_ALU_t *alu, LIB_Type_max_uint d1, LIB_Type_max_uint d2, u_int type) { u_int d_H4, d_H8, d_H16; LIB_Type_max_uint d1_old, d2_old; switch (alu->model) { case PLX_ALU: /* control logic */ alu->n_chg_blk[PLX_CTR] += type != alu->type; /* global data path */ if (is_logic(alu->type)) { d1_old = alu->l_d1; d2_old = alu->l_d2; } else { /* arithmetic */ d1_old = alu->a_d1; d2_old = alu->a_d2; } d_H8 = SIM_power_Hamming_group(d1, d1_old, d2, d2_old, 8, alu->data_width / 8); alu->n_chg_blk[PLX_IMM] += d_H8; alu->n_chg_blk[PLX_OUT] += d_H8; /* logic/arithmetic data path */ if (is_logic(type)) { d_H8 = SIM_power_Hamming_group(d1, alu->l_d1, d2, alu->l_d2, 8, alu->data_width / 8); alu->n_chg_blk[PLX_LOGIC] += d_H8; alu->l_d1 = d1; alu->l_d2 = d2; } else { /* arithmetic */ /* WHS: hack to support 8-bit ALU */ d_H16 = SIM_power_Hamming_group(d1, alu->a_d1, d2, alu->a_d2, 16, MAX(1, alu->data_width / 16)); d_H8 = SIM_power_Hamming_group(d1, alu->a_d1, d2, alu->a_d2, 8, alu->data_width / 8); d_H4 = SIM_power_Hamming_group(d1, alu->a_d1, d2, alu->a_d2, 4, alu->data_width / 4); alu->n_chg_blk[PLX_SIGN] += d_H8; alu->n_chg_blk[PLX_SHIFT] += d_H16; alu->n_chg_blk[PLX_2COM] += d_H8; alu->n_chg_blk[PLX_ADD] += d_H4; alu->n_chg_blk[PLX_SUBW] += d_H8; alu->n_chg_blk[PLX_SAT] += d_H8; alu->n_chg_blk[PLX_AVG] += d_H8; alu->a_d1 = d1; alu->a_d2 = d2; } alu->type = type; break; default: return -1; } return 0; }
static char parse_logic(t_token **list, t_node **tree) { t_node *node; t_token *save; if ((node = ft_nodenew(LOGIC)) != NULL && parse_pipe(list, &node->left)) { save = *list; if (ft_tokenstep(list) && is_logic((*list)->data, node) && (*list)->type == SPECIAL) { if (!ft_tokenstep(list) || !parse_logic(list, &node->right)) return (!ft_clear_tree(&node)); } else *list = save; if (node->right) *tree = node; else { *tree = node->left; free(node->data); free(node); } return (1); } return (!ft_clear_tree(&node)); }