origen_sim 0.20.0 → 0.20.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/config/version.rb +1 -1
- data/lib/origen_sim/simulation.rb +9 -2
- data/lib/origen_sim/simulator.rb +44 -7
- data/lib/origen_sim/stdout_reader.rb +27 -1
- data/lib/origen_sim.rb +8 -1
- data/pattern/test.rb +4 -0
- data/templates/rtl_v/origen.v.erb +4 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 00ddb2d142b91e167ae6ad4edddeb93a25aa22ce9ae57d771158329416f0f5b6
|
4
|
+
data.tar.gz: 45d794e47570c784b8815ef8c7f8cd095ae93048c27bec8dd05cedec2614e514
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 44c72049e0a7c9ec50e4862db21dba4b972731afdadf79643c4fe29a11647f14071263498aad30c39e1313aa62f48b8d530c173e8e19ed9fde6a2a23cd5e0231
|
7
|
+
data.tar.gz: 18a952cad38daaf3ad78c4d2854f9f848714b26990621ae6999b3e3c7ea213b3bfb606164ee61e1da2813410ea8ba4a5871487b334da1d61347ec26dfe4cb912
|
data/config/version.rb
CHANGED
@@ -197,8 +197,14 @@ module OrigenSim
|
|
197
197
|
# That's all status info done until the simulation process ends, start a thread
|
198
198
|
# to wait for that in case it ends before the VPI starts
|
199
199
|
Thread.new do
|
200
|
-
|
201
|
-
|
200
|
+
begin
|
201
|
+
@status.gets.chomp # This will block until something is received
|
202
|
+
rescue Exception => e
|
203
|
+
Origen.log.error "Exception occurred while processing the monitor's status!"
|
204
|
+
raise e
|
205
|
+
ensure
|
206
|
+
abort_connection
|
207
|
+
end
|
202
208
|
end
|
203
209
|
Origen.log.debug 'Waiting for Origen VPI to start...'
|
204
210
|
|
@@ -252,6 +258,7 @@ module OrigenSim
|
|
252
258
|
File.unlink(socket_id(:stderr)) if File.exist?(socket_id(:stderr))
|
253
259
|
File.unlink(socket_id(:stdout)) if File.exist?(socket_id(:stdout))
|
254
260
|
File.unlink(socket_id(:status)) if File.exist?(socket_id(:status))
|
261
|
+
@opened = false
|
255
262
|
end
|
256
263
|
|
257
264
|
# Returns true if the simulation is running
|
data/lib/origen_sim/simulator.rb
CHANGED
@@ -14,6 +14,15 @@ module OrigenSim
|
|
14
14
|
LOG_CODES = { debug: 0, info: 1, warn: 2, warning: 2, success: 3, error: 4, deprecate: 5, deprecated: 5 }
|
15
15
|
LOG_CODES_ = { 0 => :debug, 1 => :info, 2 => :warn, 3 => :success, 4 => :error, 5 => :deprecated }
|
16
16
|
|
17
|
+
# Sending logs over VPI has a maximum size, some of which are collateral, leaving
|
18
|
+
# the difference for the actual message.
|
19
|
+
LOGGER_COLLATERAL_SIZE = 11
|
20
|
+
MULTIPART_LOGGER_TOKEN = '!k+!'
|
21
|
+
|
22
|
+
# These config attributes are accepted by OrigenSim, but cannot be
|
23
|
+
# 'Marshal-ed'.
|
24
|
+
NON_DATA_CONFIG_ATTRIBUTES = [:post_process_run_cmd]
|
25
|
+
|
17
26
|
TIMESCALES = { -15 => '1fs',
|
18
27
|
-14 => '10fs',
|
19
28
|
-13 => '100fs',
|
@@ -144,7 +153,11 @@ module OrigenSim
|
|
144
153
|
fail "Unknown vendor #{options[:vendor]}, valid values are: #{VENDORS.map { |v| ':' + v.to_s }.join(', ')}"
|
145
154
|
end
|
146
155
|
@configuration = {
|
147
|
-
snapshot_details_options: {}
|
156
|
+
snapshot_details_options: {},
|
157
|
+
|
158
|
+
# The maximum message size the VPI can accept.
|
159
|
+
# Have this as a configuration parameter since this is VPI-implementation specific.
|
160
|
+
max_log_size: 1024
|
148
161
|
}.merge(options)
|
149
162
|
@tmp_dir = nil
|
150
163
|
|
@@ -316,7 +329,8 @@ module OrigenSim
|
|
316
329
|
check_for_changes: false,
|
317
330
|
quiet: true,
|
318
331
|
options: { dir: wave_dir, wave_file: wave_file_basename, force: config[:force], setup: config[:setup], depth: :all },
|
319
|
-
output_file_name: "#{wave_file_basename}.tcl"
|
332
|
+
output_file_name: "#{wave_file_basename}.tcl",
|
333
|
+
preserve_target: true
|
320
334
|
end
|
321
335
|
input_file_fast = "#{tmp_dir}/#{wave_file_basename}_fast.tcl"
|
322
336
|
if !File.exist?(input_file_fast) || config_changed?
|
@@ -327,7 +341,8 @@ module OrigenSim
|
|
327
341
|
check_for_changes: false,
|
328
342
|
quiet: true,
|
329
343
|
options: { dir: wave_dir, wave_file: wave_file_basename, force: config[:force], setup: config[:setup], depth: fast_probe_depth },
|
330
|
-
output_file_name: "#{wave_file_basename}_fast.tcl"
|
344
|
+
output_file_name: "#{wave_file_basename}_fast.tcl",
|
345
|
+
preserve_target: true
|
331
346
|
end
|
332
347
|
save_config_signature
|
333
348
|
wave_dir # Ensure this exists since it won't be referenced above if the input file is already generated
|
@@ -621,7 +636,21 @@ module OrigenSim
|
|
621
636
|
if options[:from_origen_sim]
|
622
637
|
original.call(msg, type, options)
|
623
638
|
else
|
624
|
-
|
639
|
+
# If the message would fit without the multi-line collateral, send it as normal.
|
640
|
+
# Note: this also avoids the pitfall of a message whose size is exactly
|
641
|
+
# config[:max_log_size] - LOGGER_COLLATERAL_SIZE getting stuck until
|
642
|
+
# something else is pushed.
|
643
|
+
if msg.size > config[:max_log_size] - (LOGGER_COLLATERAL_SIZE - MULTIPART_LOGGER_TOKEN.size)
|
644
|
+
msg.chars.each_slice(config[:max_log_size] - LOGGER_COLLATERAL_SIZE) do |m|
|
645
|
+
if m.size == config[:max_log_size] - LOGGER_COLLATERAL_SIZE
|
646
|
+
log(m.join + MULTIPART_LOGGER_TOKEN, type, multipart: true)
|
647
|
+
else
|
648
|
+
log(m.join, type, multipart: false)
|
649
|
+
end
|
650
|
+
end
|
651
|
+
else
|
652
|
+
log(msg, type, multipart: false)
|
653
|
+
end
|
625
654
|
end
|
626
655
|
end
|
627
656
|
end
|
@@ -745,7 +774,7 @@ module OrigenSim
|
|
745
774
|
# the simulator. This ensures that the given log messages will be in sync with output from the
|
746
775
|
# simulator rather than potentially being ahead of the simulator if Origen were to output them
|
747
776
|
# immediately.
|
748
|
-
def log(msg, type = :info)
|
777
|
+
def log(msg, type = :info, multipart: false)
|
749
778
|
if dut_version > '0.15.0'
|
750
779
|
put("k^#{LOG_CODES[type]}^#{msg}")
|
751
780
|
else
|
@@ -1050,13 +1079,13 @@ module OrigenSim
|
|
1050
1079
|
|
1051
1080
|
# Returns true if the config has been changed since the last time we called save_config_signature
|
1052
1081
|
def config_changed?
|
1053
|
-
Origen.app.session.origen_sim["#{id}_config"] != config
|
1082
|
+
Origen.app.session.origen_sim["#{id}_config"] != config.except(*NON_DATA_CONFIG_ATTRIBUTES)
|
1054
1083
|
end
|
1055
1084
|
|
1056
1085
|
# Locally saves a signature for the current config, this will cause config_changed? to return false
|
1057
1086
|
# until its contents change
|
1058
1087
|
def save_config_signature
|
1059
|
-
Origen.app.session.origen_sim["#{id}_config"] = config
|
1088
|
+
Origen.app.session.origen_sim["#{id}_config"] = config.except(*NON_DATA_CONFIG_ATTRIBUTES)
|
1060
1089
|
end
|
1061
1090
|
|
1062
1091
|
# Returns the version of Origen Sim that the current DUT object was compiled with
|
@@ -1167,6 +1196,14 @@ module OrigenSim
|
|
1167
1196
|
get.strip.to_i
|
1168
1197
|
end
|
1169
1198
|
|
1199
|
+
def running?
|
1200
|
+
if simulation
|
1201
|
+
simulation.running?
|
1202
|
+
else
|
1203
|
+
false
|
1204
|
+
end
|
1205
|
+
end
|
1206
|
+
|
1170
1207
|
# Returns true if the snapshot has been compiled with WREAL support
|
1171
1208
|
def wreal?
|
1172
1209
|
return @wreal if defined?(@wreal)
|
@@ -10,8 +10,33 @@ module OrigenSim
|
|
10
10
|
@last_message_at = Time.now
|
11
11
|
super do
|
12
12
|
begin
|
13
|
+
line = ''
|
13
14
|
while @continue
|
14
|
-
|
15
|
+
loop do
|
16
|
+
out = @socket.gets
|
17
|
+
if out.nil?
|
18
|
+
line += ''
|
19
|
+
break
|
20
|
+
end
|
21
|
+
|
22
|
+
unless line.empty?
|
23
|
+
# If there's already stuff in the current line,
|
24
|
+
# remove the VPI cruft and leave just the remainder of the message.
|
25
|
+
out = out.split(' ', 2)[-1]
|
26
|
+
end
|
27
|
+
|
28
|
+
if out.chomp.end_with?(OrigenSim::Simulator::MULTIPART_LOGGER_TOKEN)
|
29
|
+
# Part of a multipart message. Add this to the current line
|
30
|
+
# and grab the next piece.
|
31
|
+
line += out.chomp.gsub(OrigenSim::Simulator::MULTIPART_LOGGER_TOKEN, '')
|
32
|
+
else
|
33
|
+
# Either a single message or a the end of a multi-part message.
|
34
|
+
# Add this to the line break to print the output to the console.
|
35
|
+
line += out
|
36
|
+
break
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
15
40
|
if line
|
16
41
|
line = line.chomp
|
17
42
|
# If line has been sent from Origen for logging
|
@@ -46,6 +71,7 @@ module OrigenSim
|
|
46
71
|
end
|
47
72
|
end
|
48
73
|
end
|
74
|
+
line = ''
|
49
75
|
@last_message_at = Time.now
|
50
76
|
end
|
51
77
|
end
|
data/lib/origen_sim.rb
CHANGED
@@ -54,7 +54,14 @@ module OrigenSim
|
|
54
54
|
'disable' => -1,
|
55
55
|
'disabled' => -1,
|
56
56
|
'no_action' => -1,
|
57
|
-
'no-action' => -1
|
57
|
+
'no-action' => -1,
|
58
|
+
|
59
|
+
# Disconnet/No-Connect Options
|
60
|
+
'-2' => -2,
|
61
|
+
'no-connect' => -2,
|
62
|
+
'no_connect' => -2,
|
63
|
+
'disconnect' => -2,
|
64
|
+
'disconnected' => -2
|
58
65
|
}
|
59
66
|
|
60
67
|
def self.__instantiate_simulator__
|
data/pattern/test.rb
CHANGED
@@ -360,4 +360,8 @@ Pattern.create do
|
|
360
360
|
if (tester.cycle_count - e) < 1400
|
361
361
|
OrigenSim.error "sim_delay padding was not applied!"
|
362
362
|
end
|
363
|
+
|
364
|
+
Origen.log.info("Testing that OrigenSim can send exceedingly long messages through the simulator...")
|
365
|
+
Origen.log.debug('OrigenSim'*1024)
|
366
|
+
Origen.log.success("If you see this, it worked!")
|
363
367
|
end
|
@@ -156,14 +156,16 @@ module pin_drivers(<%= dut.rtl_pins.map { |n, p, o| "#{p.id}_o" }.join(', ') %>)
|
|
156
156
|
reg sync = 0;
|
157
157
|
|
158
158
|
% dut.rtl_pins.each do |name, pin, options|
|
159
|
-
%
|
159
|
+
% unless pin.meta[:origen_sim_init_pin_state] == -2
|
160
|
+
% if pin.type == :analog
|
160
161
|
`ifdef ORIGEN_WREAL
|
161
162
|
ana_pin_driver <%= pin.id %>(.pin(<%= pin.id %>_o));
|
162
163
|
`else
|
163
164
|
pin_driver #(<%= pin.meta[:origen_sim_init_pin_state].nil? ? '' : ".init_drive(#{pin.meta[:origen_sim_init_pin_state]}), "%>.pin_name("<%= pin.id %>")) <%= pin.id %>(.pin(<%= pin.id %>_o), .sync(sync));
|
164
165
|
`endif
|
165
|
-
%
|
166
|
+
% else
|
166
167
|
pin_driver #(<%= pin.meta[:origen_sim_init_pin_state].nil? ? '' : ".init_drive(#{pin.meta[:origen_sim_init_pin_state]}), "%>.pin_name("<%= pin.id %>")) <%= pin.id %>(.pin(<%= pin.id %>_o), .sync(sync));
|
168
|
+
% end
|
167
169
|
% end
|
168
170
|
% end
|
169
171
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: origen_sim
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.20.
|
4
|
+
version: 0.20.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stephen McGinty
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-05-
|
11
|
+
date: 2019-05-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: origen
|