origen_sim 0.20.0 → 0.20.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|