def getActiveConditions_fsm(self, fsm_sig, funcdict): # returns a list of some (state, transcond) pairs active_conditions = [] fsm_sig_width = self.getWidth(fsm_sig) for condlist, func in sorted(funcdict.items(), key=lambda x: len(x[0])): node = transition.walkCondlist(condlist, fsm_sig, fsm_sig_width) state_node_list = [] if isinstance(node, transition.StateNodeList): for n in node.nodelist: state_node_list.append(n) elif node: state_node_list.append(node) for state_node in state_node_list: # if state_node.isany: # active_conditions.append( ('any', state_node.transcond) ) for rs, re in state_node.range_pairs: for state in range(rs, re + 1): transcond = self.optimizer.optimize( state_node.transcond) if isinstance(transcond, DFEvalValue) and transcond.value == 0: continue active_conditions.append((state, transcond)) return tuple(active_conditions)
def getFiniteStateMachine(self, termname, funcdict): fsm = FiniteStateMachine(util.toFlatname(termname)) if len(funcdict) == 0: return fsm width = self.getWidth(termname) for condlist, func in sorted(funcdict.items(), key=lambda x:len(x[0])): if not isinstance(func, DFEvalValue): continue print("Condition: %s, Inferring transition condition" % str(condlist)) node = transition.walkCondlist(condlist, termname, width) if node is None: continue statenode_list = node.nodelist if isinstance(node, transition.StateNodeList) else [node,] for statenode in statenode_list: fsm.construct(func.value, statenode) return fsm
def getActiveConditions_fsm(self, fsm_sig, funcdict): # returns a list of some (state, transcond) pairs active_conditions = [] fsm_sig_width = self.getWidth(fsm_sig) for condlist, func in sorted(funcdict.items(), key=lambda x:len(x[0])): node = transition.walkCondlist(condlist, fsm_sig, fsm_sig_width) state_node_list = [] if isinstance(node, transition.StateNodeList): for n in node.nodelist: state_node_list.append(n) elif node: state_node_list.append(node) for state_node in state_node_list: #if state_node.isany: # active_conditions.append( ('any', state_node.transcond) ) for rs, re in state_node.range_pairs: for state in range(rs, re+1): transcond = self.optimizer.optimize(state_node.transcond) if isinstance(transcond, DFEvalValue) and transcond.value == 0: continue active_conditions.append( (state, transcond) ) return tuple(active_conditions)