int VhpiLogicSignalObjHdl::set_signal_value(std::string &value) { switch (m_value.format) { case vhpiEnumVal: case vhpiLogicVal: { m_value.value.enumv = chr2vhpi(value.c_str()[0]); break; } case vhpiEnumVecVal: case vhpiLogicVecVal: { int len = value.length(); // Since we may not get the numElems correctly from the sim and have to infer it // we also need to set it here as well each time. m_value.numElems = len; if (len > m_num_elems) { LOG_DEBUG("VHPI: Attempt to write string longer than (%s) signal %d > %d", m_name.c_str(), len, m_num_elems); m_value.numElems = m_num_elems; } std::string::iterator iter; int i = 0; for (iter = value.begin(); (iter != value.end()) && (i < m_num_elems); iter++, i++) { m_value.value.enumvs[i] = chr2vhpi(*iter); } // Fill bits at the end of the value to 0's for (i = len; i < m_num_elems; i++) { m_value.value.enumvs[i] = vhpi0; } break; } default: { LOG_ERROR("VHPI: Unable to set a std_logic signal with a raw value"); return -1; } } if (vhpi_put_value(GpiObjHdl::get_handle<vhpiHandleT>(), &m_value, vhpiDepositPropagate)) { check_vhpi_error(); return -1; } return 0; }
int VhpiSignalObjHdl::set_signal_value(std::string &value) { switch (m_value.format) { case vhpiEnumVal: case vhpiLogicVal: { m_value.value.enumv = chr2vhpi(value.c_str()[0]); break; } case vhpiEnumVecVal: case vhpiLogicVecVal: { unsigned int len = value.length(); if (len > m_size) { LOG_ERROR("VHPI: Attempt to write string longer than signal %d > %d", len, m_size); return -1; } std::string::iterator iter; unsigned int i = 0; for (iter = value.begin(); iter != value.end(); iter++, i++) { m_value.value.enumvs[i] = chr2vhpi(*iter); } // Fill bits at the end of the value to 0's for (i = len; i < m_size; i++) { m_value.value.enumvs[i] = vhpi0; } break; } default: { LOG_CRITICAL("VHPI type of object has changed at runtime: ABORTING"); } } vhpi_put_value(GpiObjHdl::get_handle<vhpiHandleT>(), &m_value, vhpiForcePropagate); check_vhpi_error(); return 0; }