void *FliValueObjHdl::get_sub_hdl(int index) { if (!m_indexable) return NULL; if (m_sub_hdls == NULL) { if (is_var()) { m_sub_hdls = (void **)mti_GetVarSubelements(get_handle<mtiVariableIdT>(), NULL); } else { m_sub_hdls = (void **)mti_GetSignalSubelements(get_handle<mtiSignalIdT>(), NULL); } } int idx; if (m_range_left > m_range_right) { idx = m_range_left - index; } else { idx = index - m_range_left; } if (idx < 0 || idx >= m_num_elems) return NULL; else return m_sub_hdls[idx]; }
/** * convert_logic_vector_to_int() - Convert a multibit signal into the * corresponding numerical value * * @vec: std_logic_vector signal to convert * * Return: 32-bit integer equivalent to the input signal */ int convert_logic_vector_to_int(mtiSignalIdT vec) { mtiSignalIdT *elems_list; mtiTypeIdT sig_type; mtiInt32T num_elems; int data; int i; /* Get an handle to the type of the given signal */ sig_type = mti_GetSignalType(vec); /* Get the number of elements that compose the vector */ num_elems = mti_TickLength(sig_type); assert(num_elems <= 25); /* Extract the list of individual elements */ elems_list = mti_GetSignalSubelements(vec, 0); data = 0; for (i = 0; i < num_elems; ++i) { /* If a 1 is received, increment the corresponding bit of the result */ if (mti_GetSignalValue(elems_list[i]) == STD_LOGIC_1) { data += 1 << (num_elems - i - 1); } } mti_VsimFree(elems_list); return data; }
void FliIterator::populate_handle_list(FliIterator::OneToMany childType) { switch (childType) { case FliIterator::OTM_CONSTANTS: { mtiRegionIdT parent = m_parent->get_handle<mtiRegionIdT>(); mtiVariableIdT id; for (id = mti_FirstVarByRegion(parent); id; id = mti_NextVar()) { if (id) { m_vars.push_back(id); } } } break; case FliIterator::OTM_SIGNALS: { mtiRegionIdT parent = m_parent->get_handle<mtiRegionIdT>(); mtiSignalIdT id; for (id = mti_FirstSignal(parent); id; id = mti_NextSignal()) { if (id) { m_sigs.push_back(id); } } } break; case FliIterator::OTM_REGIONS: { mtiRegionIdT parent = m_parent->get_handle<mtiRegionIdT>(); mtiRegionIdT id; for (id = mti_FirstLowerRegion(parent); id; id = mti_NextRegion(id)) { if (id) { m_regs.push_back(id); } } } break; case FliIterator::OTM_SIGNAL_SUB_ELEMENTS: if (m_parent->get_type() == GPI_STRUCTURE) { mtiSignalIdT parent = m_parent->get_handle<mtiSignalIdT>(); mtiTypeIdT type = mti_GetSignalType(parent); mtiSignalIdT *ids = mti_GetSignalSubelements(parent,NULL); LOG_DEBUG("GPI_STRUCTURE: %d fields", mti_TickLength(type)); for (int i = 0; i < mti_TickLength(type); i++) { m_sigs.push_back(ids[i]); } mti_VsimFree(ids); } else if (m_parent->get_indexable()) { FliValueObjHdl *fli_obj = reinterpret_cast<FliValueObjHdl *>(m_parent); int left = m_parent->get_range_left(); int right = m_parent->get_range_right(); if (left > right) { for (int i = left; i >= right; i--) { m_sigs.push_back(static_cast<mtiSignalIdT>(fli_obj->get_sub_hdl(i))); } } else { for (int i = left; i <= right; i++) { m_sigs.push_back(static_cast<mtiSignalIdT>(fli_obj->get_sub_hdl(i))); } } } break; case FliIterator::OTM_VARIABLE_SUB_ELEMENTS: if (m_parent->get_type() == GPI_STRUCTURE) { mtiVariableIdT parent = m_parent->get_handle<mtiVariableIdT>(); mtiTypeIdT type = mti_GetVarType(parent); mtiVariableIdT *ids = mti_GetVarSubelements(parent,NULL); LOG_DEBUG("GPI_STRUCTURE: %d fields", mti_TickLength(type)); for (int i = 0; i < mti_TickLength(type); i++) { m_vars.push_back(ids[i]); } mti_VsimFree(ids); } else if (m_parent->get_indexable()) { FliValueObjHdl *fli_obj = reinterpret_cast<FliValueObjHdl *>(m_parent); int left = m_parent->get_range_left(); int right = m_parent->get_range_right(); if (left > right) { for (int i = left; i >= right; i--) { m_vars.push_back(static_cast<mtiVariableIdT>(fli_obj->get_sub_hdl(i))); } } else { for (int i = left; i <= right; i++) { m_vars.push_back(static_cast<mtiVariableIdT>(fli_obj->get_sub_hdl(i))); } } } break; default: LOG_WARN("Unhandled OneToMany Type (%d)", childType); } }