147: def put_value aValue, aFormat = nil, aTime = nil, aDelay = VpiNoDelay
148: aFormat =
149: if aFormat
150: resolve_prop_type(aFormat)
151: else
152: get_value_wrapper(VpiObjTypeVal).format
153: end
154:
155: newVal = S_vpi_value.new(:format => aFormat)
156:
157: case aFormat
158: when VpiBinStrVal, VpiOctStrVal, VpiDecStrVal, VpiHexStrVal, VpiStringVal
159: newVal.value.str = aValue.to_s
160:
161: when VpiScalarVal
162: newVal.value.scalar = aValue
163:
164: when VpiIntVal
165: newVal.format = VpiHexStrVal
166: newVal.value.str = aValue.to_i.to_s(16)
167:
168: when VpiRealVal
169: newVal.value.real = aValue.to_f
170:
171: when VpiTimeVal
172: newVal.value.time = aValue
173:
174: when VpiVectorVal
175: newVal.value.vector = aValue
176:
177: when VpiStrengthVal
178: newVal.value.strength = aValue
179:
180: else
181: raise "unknown S_vpi_value.format: #{newVal.format}"
182: end
183:
184: vpi_put_value(self, newVal, aTime, aDelay)
185:
186:
187: readenVal = get_value(aFormat)
188:
189: writtenCorrectly =
190: case aFormat
191: when VpiBinStrVal, VpiOctStrVal, VpiDecStrVal, VpiHexStrVal
192: if aValue =~ /[xz]/i
193: readenVal =~ /[xz]/i
194: else
195: readenVal == aValue.to_s
196: end
197:
198: when VpiStringVal
199: readenVal == aValue.to_s
200:
201: when VpiIntVal
202:
203: readenVal == (aValue.to_i % (2 ** vpi_get(VpiSize, self)))
204:
205: when VpiRealVal
206: readenVal == aValue.to_f
207:
208: else
209: true
210: end
211:
212: unless writtenCorrectly
213: raise "value written (#{aValue.inspect}) does not match value read (#{readenVal.inspect}) on handle #{self}"
214: end
215:
216: aValue
217: end