origen_sim 0.9.0 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f670da6bba360fa76ac30b10cd097cde48d6353a
4
- data.tar.gz: 07a1c407163212fd4fd04b45336ff399751155e2
3
+ metadata.gz: 3b31bfc2f252031780f05373507dbbb75db36300
4
+ data.tar.gz: fb37cfeb67cde82e1f829630b36ea6752e581189
5
5
  SHA512:
6
- metadata.gz: 0f0bcd9d653bf6ba02617116e3d843c9e1f39c20f023544b9cf5bbf152289fd9fa5654be8d72b2bcd77928f0a26041ed4da9370110b1281b98e1e7568df73aa5
7
- data.tar.gz: 1bd7de244589567b366d0213279df4f295f0ed374311bfc1b22d0666eacfd6855c19ecaa7fe4f7c6214452d54fb0ab4076b69f3714fae397dc9d25142ebfa580
6
+ metadata.gz: f86cbee77db2cd17707e7c68aa96a70a18922772207e302b7abf6c416d9e28a2a0c2035339d28f3fde56214a6331a6e657a0be3b1b3945dfc5b1566d673d1e91
7
+ data.tar.gz: 865533e70e134f220837accecdbefa616f1df14f8cf185bc3584a923e3c5af4afe2d5a3b7662221de125b0b45c5eb975569bfe51da679dc442d10e4c5f38e0df
@@ -57,7 +57,9 @@ class OrigenSimApplication < Origen::Application
57
57
 
58
58
  # An example of how to set application specific LSF parameters
59
59
  #config.lsf.project = "msg.te"
60
-
60
+ config.lsf.queue = ENV["ORIGEN_LSF_QUEUE"] if ENV["ORIGEN_LSF_QUEUE"]
61
+ config.lsf.resource = ENV["ORIGEN_LSF_RESOURCE"] if ENV["ORIGEN_LSF_RESOURCE"]
62
+
61
63
  # An example of how to specify a prefix to add to all generated patterns
62
64
  #config.pattern_prefix = "nvm"
63
65
 
@@ -5,9 +5,12 @@ when 'generate'
5
5
  $use_fast_probe_depth = false
6
6
  @application_options << ["--fast", "Fast simulation, minimum probe depth"]
7
7
  $use_fast_probe_depth = ARGV.include?('--fast')
8
+
8
9
  @application_options << ["--sim_capture", "Update sim captures (ignored when not running a simulation)"]
9
10
  Origen.app!.update_sim_captures = ARGV.include?('--sim_capture')
10
11
 
12
+ @application_options << ["--flow NAME", "Simulate multiple patterns back-back within a single simulation with the given name", ->(options, name) { OrigenSim.flow = name }]
13
+
11
14
  when "sim:ci", "origen_sim:ci"
12
15
  require "#{Origen.root!}/lib/origen_sim/commands/ci"
13
16
  exit 0
data/config/version.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module OrigenSim
2
2
  MAJOR = 0
3
- MINOR = 9
3
+ MINOR = 10
4
4
  BUGFIX = 0
5
5
  DEV = nil
6
6
 
@@ -3,7 +3,7 @@ require 'origen_sim'
3
3
  require_relative '../../../config/version'
4
4
  require 'origen_verilog'
5
5
 
6
- options = { source_dirs: [], testbench_name: 'origen' }
6
+ options = { source_dirs: [], testbench_name: 'origen', defines: [] }
7
7
 
8
8
  # App options are options that the application can supply to extend this command
9
9
  app_options = @application_options || []
@@ -22,6 +22,9 @@ Usage: origen sim:build TOP_LEVEL_VERILOG_FILE [options]
22
22
  opts.on('-s', '--source_dir PATH', 'Directories to look for include files in (the directory containing the top-level is already considered)') do |path|
23
23
  options[:source_dirs] << path
24
24
  end
25
+ opts.on('--define MACRO', 'Specify a compiler define') do |macro|
26
+ options[:defines] << macro
27
+ end
25
28
  opts.on('-d', '--debugger', 'Enable the debugger') { options[:debugger] = true }
26
29
  app_options.each do |app_option|
27
30
  opts.on(*app_option) {}
@@ -32,21 +35,30 @@ end
32
35
 
33
36
  opt_parser.parse! ARGV
34
37
 
38
+ def _exit_fail_
39
+ if $_testing_build_return_dut_
40
+ return nil
41
+ else
42
+ exit 1
43
+ end
44
+ end
45
+
35
46
  unless ARGV.size > 0
36
47
  puts 'You must supply a path to the top-level RTL file'
37
- exit 1
48
+ _exit_fail_
38
49
  end
39
- rtl_top = ARGV.first
50
+ files = ARGV.first
51
+ rtl_top = files.split(/\s+/).last
40
52
  unless File.exist?(rtl_top)
41
53
  puts "File does not exist: #{rtl_top}"
42
- exit 1
54
+ _exit_fail_
43
55
  end
44
56
 
45
- ast = OrigenVerilog.parse_file(rtl_top)
57
+ ast = OrigenVerilog.parse_file(files, options)
46
58
 
47
59
  unless ast
48
60
  puts 'Sorry, but the given top-level RTL file failed to parse'
49
- exit 1
61
+ _exit_fail_
50
62
  end
51
63
 
52
64
  candidates = ast.top_level_modules
@@ -54,7 +66,7 @@ candidates = ast.modules if candidates.empty?
54
66
 
55
67
  if candidates.size == 0
56
68
  puts "Sorry, couldn't find any Verilog module declarations in that file"
57
- exit 1
69
+ _exit_fail_
58
70
  elsif candidates.size > 1
59
71
  if options[:top_level_name]
60
72
  mod = candidates.find { |c| c.name == options[:top_level_name] }
@@ -64,7 +76,7 @@ elsif candidates.size > 1
64
76
  candidates.each do |c|
65
77
  puts " #{c.name}"
66
78
  end
67
- exit 1
79
+ _exit_fail_
68
80
  end
69
81
  else
70
82
  mod = candidates.first
@@ -74,104 +86,110 @@ rtl_top_module = mod.name
74
86
 
75
87
  mod.to_top_level # Creates dut
76
88
 
77
- output_directory = options[:output] || Origen.config.output_directory
78
-
79
- Origen.app.runner.launch action: :compile,
80
- files: "#{Origen.root!}/templates/rtl_v/origen.v.erb",
81
- output: output_directory,
82
- check_for_changes: false,
83
- quiet: true,
84
- options: { vendor: :cadence, top: dut.name, incl: options[:incl_files] }
85
-
86
- Origen.app.runner.launch action: :compile,
87
- files: "#{Origen.root!}/ext",
88
- output: output_directory,
89
- check_for_changes: false,
90
- quiet: true,
91
- options: options
92
-
93
- dut.export(rtl_top_module, dir: "#{output_directory}", namespace: nil)
94
-
95
- puts
96
- puts
97
- puts 'Testbench and VPI extension created!'
98
- puts
99
- puts 'This file can be imported into an Origen top-level DUT model to define the pins:'
100
- puts
101
- puts " #{output_directory}/#{rtl_top_module}.rb"
102
- puts
103
- puts 'See below for what to do now to create an Origen-enabled simulation object for your particular simulator:'
104
- puts
105
- puts '-----------------------------------------------------------'
106
- puts 'Cadence Incisive (irun)'
107
- puts '-----------------------------------------------------------'
108
- puts
109
- puts 'Add the following to your build script (AND REMOVE ANY OTHER TESTBENCH!):'
110
- puts
111
- puts " #{output_directory}/origen.v \\"
112
- puts " #{output_directory}/*.c \\"
113
- puts ' -ccargs "-std=c99" \\'
114
- puts ' -top origen \\'
115
- puts ' -elaborate \\'
116
- puts ' -snapshot origen \\'
117
- puts ' -access +rw \\'
118
- puts ' -timescale 1ns/1ns'
119
- puts
120
- puts 'Here is an example which may work for the file you just parsed (add additional -incdir options at the end if required):'
121
- puts
122
- puts " #{ENV['ORIGEN_SIM_IRUN'] || 'irun'} #{rtl_top} #{output_directory}/origen.v #{output_directory}/*.c -ccargs \"-std=c99\" -top origen -elaborate -snapshot origen -access +rw -timescale 1ns/1ns -incdir #{Pathname.new(rtl_top).dirname}"
123
- puts
124
- puts 'Copy the following directory (produced by irun) to simulation/<target>/cadence/. within your Origen application:'
125
- puts
126
- puts ' INCA_libs'
127
- puts
128
- puts '-----------------------------------------------------------'
129
- puts 'Synopsys VCS'
130
- puts '-----------------------------------------------------------'
131
- puts
132
- puts 'Add the following to your build script (AND REMOVE ANY OTHER TESTBENCH!):'
133
- puts
134
- puts " #{output_directory}/origen.v \\"
135
- puts " #{output_directory}/brdige.c \\"
136
- puts " #{output_directory}/client.c \\"
137
- puts ' -CFLAGS "-std=c99" \\'
138
- puts ' +vpi \\'
139
- puts " -use_vpiobj #{output_directory}/origen.c \\"
140
- puts ' +define+ORIGEN_VPD=1 \\'
141
- puts ' -debug_access+all \\'
142
- puts ' -PP \\'
143
- puts ' -timescale=1ns/1ns'
144
- puts
145
- puts 'Here is an example which may work for the file you just parsed (add additional -incdir options at the end if required):'
146
- puts
147
- puts " #{ENV['ORIGEN_SIM_VCS'] || 'vcs'} #{rtl_top} #{output_directory}/origen.v #{output_directory}/bridge.c #{output_directory}/client.c -CFLAGS \"-std=c99\" +vpi -use_vpiobj #{output_directory}/origen.c -timescale=1ns/1ns +define+ORIGEN_VPD=1 +incdir+#{Pathname.new(rtl_top).dirname} -debug_access+all -PP"
148
- puts
149
- puts 'Copy the following files (produced by vcs) to simulation/<target>/synopsys/. within your Origen application:'
150
- puts
151
- puts ' simv'
152
- puts ' simv.daidir'
153
- puts
154
- puts '-----------------------------------------------------------'
155
- puts 'Icarus Verilog'
156
- puts '-----------------------------------------------------------'
157
- puts
158
- puts 'Compile the VPI extension using the following command:'
159
- puts
160
- puts " cd #{output_directory} && #{ENV['ORIGEN_SIM_IVERILOG_VPI'] || 'iverilog-vpi'} *.c --name=origen && cd #{Pathname.pwd}"
161
- puts
162
- puts 'Add the following to your build script (AND REMOVE ANY OTHER TESTBENCH!):'
163
- puts
164
- puts " #{output_directory}/origen.v \\"
165
- puts ' -o origen.vvp \\'
166
- puts ' -DORIGEN_VCD'
167
- puts
168
- puts 'Here is an example which may work for the file you just parsed (add additional source dirs with more -I options at the end if required):'
169
- puts
170
- puts " #{ENV['ORIGEN_SIM_IVERILOG'] || 'iverilog'} #{rtl_top} #{output_directory}/origen.v -o origen.vvp -DICARUS -I #{Pathname.new(rtl_top).dirname}"
171
- puts
172
- puts 'Copy the following files (produced by iverilog) to simulation/<target>/icarus/. within your Origen application:'
173
- puts
174
- puts " #{output_directory}/origen.vpi"
175
- puts ' origen.vvp'
176
- puts
177
- puts
89
+ if $_testing_build_return_dut_
90
+ dut
91
+
92
+ else
93
+
94
+ output_directory = options[:output] || Origen.config.output_directory
95
+
96
+ Origen.app.runner.launch action: :compile,
97
+ files: "#{Origen.root!}/templates/rtl_v/origen.v.erb",
98
+ output: output_directory,
99
+ check_for_changes: false,
100
+ quiet: true,
101
+ options: { vendor: :cadence, top: dut.name, incl: options[:incl_files] }
102
+
103
+ Origen.app.runner.launch action: :compile,
104
+ files: "#{Origen.root!}/ext",
105
+ output: output_directory,
106
+ check_for_changes: false,
107
+ quiet: true,
108
+ options: options
109
+
110
+ dut.export(rtl_top_module, dir: "#{output_directory}", namespace: nil)
111
+
112
+ puts
113
+ puts
114
+ puts 'Testbench and VPI extension created!'
115
+ puts
116
+ puts 'This file can be imported into an Origen top-level DUT model to define the pins:'
117
+ puts
118
+ puts " #{output_directory}/#{rtl_top_module}.rb"
119
+ puts
120
+ puts 'See below for what to do now to create an Origen-enabled simulation object for your particular simulator:'
121
+ puts
122
+ puts '-----------------------------------------------------------'
123
+ puts 'Cadence Incisive (irun)'
124
+ puts '-----------------------------------------------------------'
125
+ puts
126
+ puts 'Add the following to your build script (AND REMOVE ANY OTHER TESTBENCH!):'
127
+ puts
128
+ puts " #{output_directory}/origen.v \\"
129
+ puts " #{output_directory}/*.c \\"
130
+ puts ' -ccargs "-std=c99" \\'
131
+ puts ' -top origen \\'
132
+ puts ' -elaborate \\'
133
+ puts ' -snapshot origen \\'
134
+ puts ' -access +rw \\'
135
+ puts ' -timescale 1ns/1ns'
136
+ puts
137
+ puts 'Here is an example which may work for the file you just parsed (add additional -incdir options at the end if required):'
138
+ puts
139
+ puts " #{ENV['ORIGEN_SIM_IRUN'] || 'irun'} #{rtl_top} #{output_directory}/origen.v #{output_directory}/*.c -ccargs \"-std=c99\" -top origen -elaborate -snapshot origen -access +rw -timescale 1ns/1ns -incdir #{Pathname.new(rtl_top).dirname}"
140
+ puts
141
+ puts 'Copy the following directory (produced by irun) to simulation/<target>/cadence/. within your Origen application:'
142
+ puts
143
+ puts ' INCA_libs'
144
+ puts
145
+ puts '-----------------------------------------------------------'
146
+ puts 'Synopsys VCS'
147
+ puts '-----------------------------------------------------------'
148
+ puts
149
+ puts 'Add the following to your build script (AND REMOVE ANY OTHER TESTBENCH!):'
150
+ puts
151
+ puts " #{output_directory}/origen.v \\"
152
+ puts " #{output_directory}/brdige.c \\"
153
+ puts " #{output_directory}/client.c \\"
154
+ puts ' -CFLAGS "-std=c99" \\'
155
+ puts ' +vpi \\'
156
+ puts " -use_vpiobj #{output_directory}/origen.c \\"
157
+ puts ' +define+ORIGEN_VPD=1 \\'
158
+ puts ' -debug_access+all \\'
159
+ puts ' -PP \\'
160
+ puts ' -timescale=1ns/1ns'
161
+ puts
162
+ puts 'Here is an example which may work for the file you just parsed (add additional -incdir options at the end if required):'
163
+ puts
164
+ puts " #{ENV['ORIGEN_SIM_VCS'] || 'vcs'} #{rtl_top} #{output_directory}/origen.v #{output_directory}/bridge.c #{output_directory}/client.c -CFLAGS \"-std=c99\" +vpi -use_vpiobj #{output_directory}/origen.c -timescale=1ns/1ns +define+ORIGEN_VPD=1 +incdir+#{Pathname.new(rtl_top).dirname} -debug_access+all -PP"
165
+ puts
166
+ puts 'Copy the following files (produced by vcs) to simulation/<target>/synopsys/. within your Origen application:'
167
+ puts
168
+ puts ' simv'
169
+ puts ' simv.daidir'
170
+ puts
171
+ puts '-----------------------------------------------------------'
172
+ puts 'Icarus Verilog'
173
+ puts '-----------------------------------------------------------'
174
+ puts
175
+ puts 'Compile the VPI extension using the following command:'
176
+ puts
177
+ puts " cd #{output_directory} && #{ENV['ORIGEN_SIM_IVERILOG_VPI'] || 'iverilog-vpi'} *.c --name=origen && cd #{Pathname.pwd}"
178
+ puts
179
+ puts 'Add the following to your build script (AND REMOVE ANY OTHER TESTBENCH!):'
180
+ puts
181
+ puts " #{output_directory}/origen.v \\"
182
+ puts ' -o origen.vvp \\'
183
+ puts ' -DORIGEN_VCD'
184
+ puts
185
+ puts 'Here is an example which may work for the file you just parsed (add additional source dirs with more -I options at the end if required):'
186
+ puts
187
+ puts " #{ENV['ORIGEN_SIM_IVERILOG'] || 'iverilog'} #{rtl_top} #{output_directory}/origen.v -o origen.vvp -DORIGEN_VCD -I #{Pathname.new(rtl_top).dirname}"
188
+ puts
189
+ puts 'Copy the following files (produced by iverilog) to simulation/<target>/icarus/. within your Origen application:'
190
+ puts
191
+ puts " #{output_directory}/origen.vpi"
192
+ puts ' origen.vvp'
193
+ puts
194
+ puts
195
+ end
@@ -0,0 +1,21 @@
1
+ require 'thread'
2
+ module OrigenSim
3
+ class Heartbeat < Thread
4
+ attr_reader :socket
5
+
6
+ def initialize(socket)
7
+ @socket = socket
8
+ @continue = true
9
+ super do
10
+ while @continue
11
+ socket.write("OK\n")
12
+ sleep 5
13
+ end
14
+ end
15
+ end
16
+
17
+ def stop
18
+ @continue = false
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ require 'origen/application/runner'
2
+ module Origen
3
+ class Application
4
+ class Runner
5
+ # When multiple patterns are requested via the command line with the LSF option,
6
+ # Origen will split it into separate jobs for each pattern. However, if the --flow
7
+ # option is also supplied in that case, then the user will want all the patterns to
8
+ # execute as a single job on the LSF, this hack to Origen makes that happen.
9
+ alias_method :orig_expand_lists_and_directories, :expand_lists_and_directories
10
+ def expand_lists_and_directories(files, options = {})
11
+ if (options[:lsf] && OrigenSim.flow) && !Origen.running_remotely?
12
+ Array(Array(files).join(' '))
13
+ else
14
+ orig_expand_lists_and_directories(files, options)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,157 @@
1
+ require 'socket'
2
+ require 'io/wait'
3
+ require 'origen_sim/heartbeat'
4
+ module OrigenSim
5
+ # Responsible for managing each individual simulation that is run in an
6
+ # Origen thread e.g. If multiple patterns are run in separate simulations, then one
7
+ # instance of this class will exist for each one.
8
+ #
9
+ # It is primarily responsible for all communications with the simulation and capturing
10
+ # log output and errors.
11
+ class Simulation
12
+ attr_reader :view_wave_command, :id
13
+
14
+ attr_accessor :logged_errors, :error_count, :failed_to_start, :completed_cleanly
15
+ attr_accessor :pid, :stderr_logged_errors
16
+ # Returns the communication socket used for sending commands to the Origen VPI running
17
+ # in the simulation process
18
+ attr_reader :socket
19
+
20
+ def initialize(id, view_wave_command)
21
+ @id = id
22
+ @view_wave_command = view_wave_command
23
+ @completed_cleanly = false
24
+ @failed_to_start = false
25
+ @logged_errors = false
26
+ @stderr_logged_errors = false
27
+ @error_count = 0
28
+ @socket_ids = {}
29
+
30
+ @server = UNIXServer.new(socket_id) # Socket used to send Origen -> Verilog commands
31
+ @server_stdout = UNIXServer.new(socket_id(:stdout))
32
+ @server_stderr = UNIXServer.new(socket_id(:stderr))
33
+ @server_heartbeat = UNIXServer.new(socket_id(:heartbeat))
34
+ end
35
+
36
+ def failed?(in_progress = false)
37
+ failed = stderr_logged_errors || logged_errors || failed_to_start || error_count > 0
38
+ if in_progress
39
+ failed
40
+ else
41
+ failed || !completed_cleanly
42
+ end
43
+ end
44
+
45
+ def log_results(in_progress = false)
46
+ if failed?(in_progress)
47
+ if failed_to_start
48
+ Origen.log.error 'The simulation failed to start!'
49
+ else
50
+ if in_progress
51
+ Origen.log.error "The simulation has #{error_count} error#{error_count > 1 ? 's' : ''}!" if error_count > 0
52
+ else
53
+ Origen.log.error "The simulation failed with #{error_count} errors!" if error_count > 0
54
+ end
55
+ Origen.log.error 'The simulation log reported errors!' if logged_errors
56
+ Origen.log.error 'The simulation stderr reported errors!' if stderr_logged_errors
57
+ Origen.log.error 'The simulation exited early!' unless completed_cleanly || in_progress
58
+ end
59
+ else
60
+ if in_progress
61
+ Origen.log.success 'The simulation is passing!'
62
+ else
63
+ Origen.log.success 'The simulation passed!'
64
+ end
65
+ end
66
+ end
67
+
68
+ # Provide a heartbeat to let the parallel Ruby process in charge of the simulator
69
+ # know that the master Origen process is still alive. If the Origen process crashes and leaves
70
+ # the simulator running, the child process will automatically reap it after a couple of missed
71
+ # heartbeats.
72
+ def start_heartbeat
73
+ @heartbeat = @server_heartbeat.accept
74
+ @pid = @heartbeat.gets.chomp.to_i
75
+ @heartbeat_thread = Heartbeat.new(@heartbeat)
76
+ end
77
+
78
+ def stop_heartbeat
79
+ @heartbeat_thread.stop
80
+ end
81
+
82
+ # Open the communication channels with the simulator
83
+ def open
84
+ start_heartbeat
85
+ @stdout = @server_stdout.accept
86
+ @stderr = @server_stderr.accept
87
+ @socket = @server.accept
88
+ @opened = true
89
+ end
90
+
91
+ # Close all communication channels with the simulator
92
+ def close
93
+ return unless @opened
94
+ stop_heartbeat
95
+ @heartbeat.close
96
+ @socket.close
97
+ @stderr.close
98
+ @stdout.close
99
+ File.unlink(socket_id(:heartbeat)) if File.exist?(socket_id(:heartbeat))
100
+ File.unlink(socket_id) if File.exist?(socket_id)
101
+ File.unlink(socket_id(:stderr)) if File.exist?(socket_id(:stderr))
102
+ File.unlink(socket_id(:stdout)) if File.exist?(socket_id(:stdout))
103
+ end
104
+
105
+ def read_sim_output
106
+ while @stdout.ready?
107
+ line = @stdout.gets.chomp
108
+ if OrigenSim.error_strings.any? { |s| line =~ /#{s}/ } &&
109
+ !OrigenSim.error_string_exceptions.any? { |s| line =~ /#{s}/ }
110
+ @logged_errors = true
111
+ Origen.log.error "(STDOUT): #{line}"
112
+ else
113
+ if OrigenSim.verbose? ||
114
+ OrigenSim.log_strings.any? { |s| line =~ /#{s}/ }
115
+ Origen.log.info line
116
+ else
117
+ Origen.log.debug line
118
+ end
119
+ end
120
+ end
121
+ while @stderr.ready?
122
+ line = @stderr.gets.chomp
123
+ if OrigenSim.fail_on_stderr && !line.empty? &&
124
+ !OrigenSim.stderr_string_exceptions.any? { |s| line =~ /#{s}/ }
125
+ # We're failing on stderr, so print its results and log as errors if its not an exception.
126
+ @stderr_logged_errors = true
127
+ Origen.log.error "(STDERR): #{line}"
128
+ elsif OrigenSim.verbose?
129
+ # We're not failing on stderr, or the string in stderr is an exception.
130
+ # Print the string as regular output if verbose is set, otherwise just ignore.
131
+ Origen.log.info line
132
+ end
133
+ end
134
+ end
135
+
136
+ # Returns true if the simulation is running
137
+ def running?
138
+ return false unless pid
139
+ begin
140
+ Process.getpgid(pid)
141
+ true
142
+ rescue Errno::ESRCH
143
+ false
144
+ end
145
+ end
146
+
147
+ def socket_id(type = nil)
148
+ @socket_ids[type] ||= "/tmp/#{socket_number}#{type}.sock"
149
+ end
150
+
151
+ private
152
+
153
+ def socket_number
154
+ @socket_number ||= (Process.pid.to_s + Time.now.to_f.to_s).sub('.', '')
155
+ end
156
+ end
157
+ end
@@ -1,5 +1,4 @@
1
- require 'socket'
2
- require 'io/wait'
1
+ require 'origen_sim/simulation'
3
2
  module OrigenSim
4
3
  # Responsible for managing and communicating with the simulator
5
4
  # process, a single instance of this class is instantiated as
@@ -9,13 +8,17 @@ module OrigenSim
9
8
 
10
9
  VENDORS = [:icarus, :cadence, :synopsys, :generic]
11
10
 
12
- attr_reader :socket, :failed, :configuration, :stderr, :stdout, :heartbeat
11
+ attr_reader :configuration
13
12
  alias_method :config, :configuration
14
- # Returns the PID of the simulator process
15
- attr_reader :pid
13
+ # The instance of OrigenSim::Simulation for the current simulation
14
+ attr_reader :simulation
15
+ # Returns an array containing all instances of OrigenSim::Simulation that were created
16
+ # in the order that they were created
17
+ attr_reader :simulations
16
18
 
17
19
  def initialize
18
- @socket_ids = {}
20
+ @simulations = []
21
+ @simulation_open = false
19
22
  end
20
23
 
21
24
  # When set to true the simulator will log all messages it receives, note that
@@ -140,7 +143,7 @@ module OrigenSim
140
143
  end
141
144
  end
142
145
 
143
- def wave_dir
146
+ def wave_dir(subdir = nil)
144
147
  @wave_dir ||= begin
145
148
  d = "#{Origen.root}/waves/#{id}"
146
149
  FileUtils.mkdir_p(d)
@@ -198,17 +201,17 @@ module OrigenSim
198
201
  cmd += " -M#{compiled_dir} -morigen #{compiled_dir}/origen.vvp +socket+#{socket_id}"
199
202
 
200
203
  when :cadence
201
- input_file = "#{tmp_dir}/#{id}.tcl"
204
+ input_file = "#{tmp_dir}/#{wave_file_basename}.tcl"
202
205
  if !File.exist?(input_file) || config_changed?
203
206
  Origen.app.runner.launch action: :compile,
204
207
  files: "#{Origen.root!}/templates/probe.tcl.erb",
205
208
  output: tmp_dir,
206
209
  check_for_changes: false,
207
210
  quiet: true,
208
- options: { dir: wave_dir, force: config[:force], setup: config[:setup], depth: :all },
209
- output_file_name: "#{id}.tcl"
211
+ options: { dir: wave_dir, wave_file: wave_file_basename, force: config[:force], setup: config[:setup], depth: :all },
212
+ output_file_name: "#{wave_file_basename}.tcl"
210
213
  end
211
- input_file_fast = "#{tmp_dir}/#{id}_fast.tcl"
214
+ input_file_fast = "#{tmp_dir}/#{wave_file_basename}_fast.tcl"
212
215
  if !File.exist?(input_file_fast) || config_changed?
213
216
  fast_probe_depth = config[:fast_probe_depth] || 1
214
217
  Origen.app.runner.launch action: :compile,
@@ -216,8 +219,8 @@ module OrigenSim
216
219
  output: tmp_dir,
217
220
  check_for_changes: false,
218
221
  quiet: true,
219
- options: { dir: wave_dir, force: config[:force], setup: config[:setup], depth: fast_probe_depth },
220
- output_file_name: "#{id}_fast.tcl"
222
+ options: { dir: wave_dir, wave_file: wave_file_basename, force: config[:force], setup: config[:setup], depth: fast_probe_depth },
223
+ output_file_name: "#{wave_file_basename}_fast.tcl"
221
224
  end
222
225
  save_config_signature
223
226
  wave_dir # Ensure this exists since it won't be referenced above if the input file is already generated
@@ -228,7 +231,7 @@ module OrigenSim
228
231
  cmd += " -nclibdirpath #{compiled_dir}"
229
232
 
230
233
  when :synopsys
231
- cmd = "#{compiled_dir}/simv +socket+#{socket_id} -vpd_file origen.vpd"
234
+ cmd = "#{compiled_dir}/simv +socket+#{socket_id} -vpd_file #{wave_file_basename}.vpd"
232
235
 
233
236
  when :generic
234
237
  # Generic tester requires that a generic_run_command option/block be provided.
@@ -269,6 +272,18 @@ module OrigenSim
269
272
  cmd
270
273
  end
271
274
 
275
+ def wave_file_basename
276
+ if OrigenSim.flow
277
+ OrigenSim.flow.to_s
278
+ else
279
+ if Origen.app.current_job
280
+ @last_wafe_file_basename = Pathname.new(Origen.app.current_job.output_file).basename('.*').to_s
281
+ else
282
+ @last_wafe_file_basename
283
+ end
284
+ end
285
+ end
286
+
272
287
  def view_wave_command
273
288
  cmd = nil
274
289
  case config[:vendor]
@@ -277,7 +292,7 @@ module OrigenSim
277
292
  cmd = "cd #{edir} && "
278
293
  cmd += configuration[:gtkwave] || 'gtkwave'
279
294
  dir = Pathname.new(wave_dir).relative_path_from(edir.expand_path)
280
- cmd += " #{dir}/origen.vcd "
295
+ cmd += " #{dir}/#{wave_file_basename}/dump.vcd "
281
296
  f = Pathname.new(wave_config_file).relative_path_from(edir.expand_path)
282
297
  cmd += " --save #{f} &"
283
298
 
@@ -286,7 +301,7 @@ module OrigenSim
286
301
  cmd = "cd #{edir} && "
287
302
  cmd += configuration[:simvision] || 'simvision'
288
303
  dir = Pathname.new(wave_dir).relative_path_from(edir.expand_path)
289
- cmd += " #{dir}/#{id}.dsn #{dir}/#{id}.trn"
304
+ cmd += " #{dir}/#{wave_file_basename}/#{wave_file_basename}.dsn #{dir}/#{wave_file_basename}/#{wave_file_basename}.trn"
290
305
  f = Pathname.new(wave_config_file).relative_path_from(edir.expand_path)
291
306
  cmd += " -input #{f} &"
292
307
 
@@ -295,7 +310,7 @@ module OrigenSim
295
310
  cmd = "cd #{edir} && "
296
311
  cmd += configuration[:dve] || 'dve'
297
312
  dir = Pathname.new(wave_dir).relative_path_from(edir.expand_path)
298
- cmd += " -vpd #{dir}/origen.vpd"
313
+ cmd += " -vpd #{dir}/#{wave_file_basename}.vpd"
299
314
  f = Pathname.new(wave_config_file).relative_path_from(edir.expand_path)
300
315
  cmd += " -session #{f}"
301
316
  cmd += ' &'
@@ -320,31 +335,29 @@ module OrigenSim
320
335
 
321
336
  def run_dir
322
337
  case config[:vendor]
323
- when :icarus, :synopsys
338
+ when :icarus
339
+ d = File.join(wave_dir, wave_file_basename)
340
+ FileUtils.mkdir_p(d)
341
+ d
342
+ when :synopsys
324
343
  wave_dir
325
344
  else
326
345
  tmp_dir
327
346
  end
328
347
  end
329
348
 
349
+ def simulation_open?
350
+ @simulation_open
351
+ end
352
+
330
353
  # Starts up the simulator process
331
354
  def start
355
+ @simulation_open = true
356
+ @simulation = Simulation.new(wave_file_basename, view_wave_command)
357
+ simulations << @simulation
358
+
332
359
  fetch_simulation_objects
333
360
 
334
- # Socket used for Origen -> Verilog commands
335
- server = UNIXServer.new(socket_id)
336
- # Socket used to capture stdout from the simulator
337
- stdout_socket_id = socket_id(:stdout)
338
- # Socket used to capture stderr from the simulator
339
- stderr_socket_id = socket_id(:stderr)
340
- # Socket used to provide a heartbeat to let the Ruby process in charge of the simulator
341
- # know that the mast Origen process is still alive. If the Origen process crashes and leaves
342
- # the simulator running, the child process will automatically reap it after a couple of missed
343
- # heartbeats
344
- heartbeat_socket_id = socket_id(:heartbeat)
345
- server_stdout = UNIXServer.new(stdout_socket_id)
346
- server_stderr = UNIXServer.new(stderr_socket_id)
347
- server_heartbeat = UNIXServer.new(heartbeat_socket_id)
348
361
  cmd = run_cmd + ' & echo \$!'
349
362
 
350
363
  launch_simulator = %(
@@ -355,9 +368,19 @@ module OrigenSim
355
368
 
356
369
  pid = nil
357
370
 
358
- stdout_socket = UNIXSocket.new('#{stdout_socket_id}')
359
- stderr_socket = UNIXSocket.new('#{stderr_socket_id}')
360
- heartbeat = UNIXSocket.new('#{heartbeat_socket_id}')
371
+ def kill_simulation(pid)
372
+ begin
373
+ # If the process already finished, then we will see an Errno exception.
374
+ # It does not harm anything, but looks ugly, so catch it here and ignore.
375
+ Process.kill('KILL', pid)
376
+ rescue Errno::ESRCH => e
377
+ end
378
+ exit!
379
+ end
380
+
381
+ stdout_socket = UNIXSocket.new('#{simulation.socket_id(:stdout)}')
382
+ stderr_socket = UNIXSocket.new('#{simulation.socket_id(:stderr)}')
383
+ heartbeat = UNIXSocket.new('#{simulation.socket_id(:heartbeat)}')
361
384
 
362
385
  begin
363
386
 
@@ -372,6 +395,14 @@ module OrigenSim
372
395
  missed_heartbeats = 0
373
396
  loop do
374
397
  sleep 5
398
+
399
+ # If the socket read hangs, count that as a reason to shutdown
400
+ socket_read = false
401
+ Thread.new do
402
+ sleep 1
403
+ kill_simulation(pid) unless socket_read
404
+ end
405
+
375
406
  if heartbeat.ready?
376
407
  while heartbeat.ready? do
377
408
  heartbeat.gets
@@ -380,9 +411,9 @@ module OrigenSim
380
411
  else
381
412
  missed_heartbeats += 1
382
413
  end
414
+ socket_read = true
383
415
  if missed_heartbeats > 1
384
- Process.kill('KILL', pid)
385
- exit!(1)
416
+ kill_simulation(pid)
386
417
  end
387
418
  end
388
419
  end
@@ -404,14 +435,7 @@ module OrigenSim
404
435
 
405
436
  ensure
406
437
  # Make sure this process never finishes and leaves the simulator running
407
- begin
408
- # If the process already finished, then we will see an Errno exception.
409
- # It does not harm anything, but looks ugly, so catch it here and ignore.
410
- Process.kill('KILL', pid) if pid
411
- 0
412
- rescue Errno::ESRCH => e
413
- 0
414
- end
438
+ kill_simulation(pid) if pid
415
439
  end
416
440
  )
417
441
 
@@ -419,34 +443,19 @@ module OrigenSim
419
443
  Process.detach(simulator_parent_process)
420
444
 
421
445
  timeout_connection(config[:startup_timeout] || 60) do
422
- @heartbeat = server_heartbeat.accept
423
- @pid = heartbeat.gets.chomp.to_i
424
-
425
- # Send a heartbeat to the child process running the simulator every 5 seconds
426
- Thread.new do
427
- loop do
428
- heartbeat.write("OK\n")
429
- sleep 5
430
- end
431
- end
446
+ simulation.open # This will block until the simulation process responds
432
447
 
433
- @stdout = server_stdout.accept
434
- @stderr = server_stderr.accept
435
- @socket = server.accept
436
- @connection_established = true
448
+ @connection_established = true # Cancels timeout_connection
437
449
  if @connection_timed_out
438
- @failed_to_start = true
439
- Origen.log.error 'Simulator failed to respond'
440
- @failed = true
441
- exit
450
+ simulation.failed_to_start = true
451
+ exit # Assume it is not worth trying another pattern in this case, some kind of environment/config issue
442
452
  end
443
453
  end
444
454
  data = get
445
455
  unless data.strip == 'READY!'
446
- @failed_to_start = true
447
- fail "The simulator didn't start properly!"
456
+ simulation.failed_to_start = true
457
+ exit # Assume it is not worth trying another pattern in this case, some kind of environment/config issue
448
458
  end
449
- @enabled = true
450
459
  # Tick the simulation on, this seems to be required since any VPI puts operations before
451
460
  # the simulation has started are not applied.
452
461
  # Note that this is not setting a tester timeset, so the application will still have to
@@ -456,64 +465,64 @@ module OrigenSim
456
465
  Origen.listeners_for(:simulation_startup).each(&:simulation_startup)
457
466
  end
458
467
 
459
- # Returns true if the simulator process is running
460
- def running?
461
- return false unless pid
462
- begin
463
- Process.getpgid(pid)
464
- true
465
- rescue Errno::ESRCH
466
- false
467
- end
468
- end
469
-
470
468
  # Send the given message string to the simulator
471
469
  def put(msg)
472
- socket.write(msg + "\n") if socket
470
+ simulation.socket.write(msg + "\n")
473
471
  end
474
472
 
475
473
  # Get a message from the simulator, will block until one
476
474
  # is received
477
475
  def get
478
- socket.readline
476
+ simulation.socket.readline
479
477
  end
480
478
 
481
- # This will be called at the end of every pattern, make
482
- # sure the simulator is not running behind before potentially
483
- # moving onto another pattern
484
- def pattern_generated(path)
485
- sync_up if simulation_tester?
486
- @simulation_completed_cleanly = true
479
+ # At the start of a test program flow generation/simulation
480
+ def on_flow_start(options)
481
+ if simulation_tester? && options[:top_level]
482
+ OrigenSim.flow = Origen.interface.flow.name
483
+ start
484
+ @pattern_count = 0
485
+ end
486
+ end
487
+
488
+ # At the end of a test program flow generation/simulation
489
+ def on_flow_end(options)
490
+ if simulation_tester? && options[:top_level]
491
+ stop
492
+ end
487
493
  end
488
494
 
489
495
  # Called before every pattern is generated, but we only use it the
490
496
  # first time it is called to kick off the simulator process if the
491
497
  # current tester is an OrigenSim::Tester
492
498
  def before_pattern(name)
493
- @simulation_completed_cleanly = false
494
499
  if simulation_tester?
495
- unless @enabled
496
- # When running pattern back-to-back, only want to launch the simulator the
497
- # first time
498
- unless socket
499
- start
500
- end
500
+ if OrigenSim.flow || !simulation
501
+ # When running patterns back-to-back, only want to launch the simulator the first time
502
+ start unless simulation
503
+ else
504
+ stop
505
+ start
501
506
  end
502
507
  # Set the current pattern name in the simulation
503
508
  put("a^#{name.sub(/\..*/, '')}")
504
509
  @pattern_count ||= 0
505
- if @pattern_count > 0
506
- c = error_count
507
- if c > 0
508
- Origen.log.error "The simulation currently has #{c} error(s)!"
509
- else
510
- Origen.log.success 'There are no simulation errors yet!'
511
- end
510
+ # If running a flow, give the user some feedback about pass/fail status after
511
+ # each individual pattern has completed
512
+ if @pattern_count > 0 && OrigenSim.flow
513
+ simulation.log_results(true)
512
514
  end
513
515
  @pattern_count += 1
514
516
  end
515
517
  end
516
518
 
519
+ # This will be called at the end of every pattern, make
520
+ # sure the simulator is not running behind before potentially
521
+ # moving onto another pattern
522
+ def pattern_generated(path)
523
+ sync_up if simulation_tester?
524
+ end
525
+
517
526
  def write_comment(comment)
518
527
  # Not sure what the limiting factor here is, the comment memory in the test bench should
519
528
  # be able to handle 1024 / 8 length strings, but any bigger than this hangs the simulation
@@ -590,7 +599,7 @@ module OrigenSim
590
599
 
591
600
  def cycle(number_of_cycles)
592
601
  put("3^#{number_of_cycles}")
593
- read_sim_output
602
+ simulation.read_sim_output
594
603
  end
595
604
 
596
605
  # Blocks the Origen process until the simulator indicates that it has
@@ -601,37 +610,12 @@ module OrigenSim
601
610
  unless data.strip == 'OK!'
602
611
  fail 'Origen and the simulator are out of sync!'
603
612
  end
604
- read_sim_output
613
+ simulation.read_sim_output
605
614
  end
606
615
 
607
- def read_sim_output
608
- while stdout.ready?
609
- line = stdout.gets.chomp
610
- if OrigenSim.error_strings.any? { |s| line =~ /#{s}/ } &&
611
- !OrigenSim.error_string_exceptions.any? { |s| line =~ /#{s}/ }
612
- @simulator_logged_errors = true
613
- Origen.log.error "(STDOUT): #{line}"
614
- else
615
- if OrigenSim.verbose? ||
616
- OrigenSim.log_strings.any? { |s| line =~ /#{s}/ }
617
- Origen.log.info line
618
- else
619
- Origen.log.debug line
620
- end
621
- end
622
- end
623
- while stderr.ready?
624
- line = stderr.gets.chomp
625
- if OrigenSim.fail_on_stderr && !OrigenSim.stderr_string_exceptions.any? { |s| line =~ /#{s}/ }
626
- # We're failing on stderr, so print its results and log as errors if its not an exception.
627
- @stderr_logged_errors = true
628
- Origen.log.error "(STDERR): #{line}"
629
- elsif OrigenSim.verbose?
630
- # We're not failing on stderr, or the string in stderr is an exception.
631
- # Print the string as regular output if verbose is set, otherwise just ignore.
632
- Origen.log.info line
633
- end
634
- end
616
+ def error(message)
617
+ simulation.logged_errors = true
618
+ Origen.log.error message
635
619
  end
636
620
 
637
621
  # Returns the current simulation error count
@@ -732,62 +716,71 @@ module OrigenSim
732
716
 
733
717
  # Stop the simulator
734
718
  def stop
719
+ @simulation_open = false
720
+ simulation.read_sim_output
721
+ simulation.error_count = error_count
735
722
  Origen.listeners_for(:simulation_shutdown).each(&:simulation_shutdown)
736
723
  ended = Time.now
737
724
  end_simulation
738
725
  # Give the simulator time to shut down
739
- sleep 0.1 while running?
740
- socket.close if socket
741
- stderr.close if stderr
742
- stdout.close if stdout
743
- heartbeat.close if heartbeat
744
- File.unlink(socket_id) if File.exist?(socket_id)
745
- File.unlink(socket_id(:stderr)) if File.exist?(socket_id(:stderr))
746
- File.unlink(socket_id(:stdout)) if File.exist?(socket_id(:stdout))
747
- File.unlink(socket_id(:heartbeat)) if File.exist?(socket_id(:heartbeat))
726
+ sleep 0.1 while simulation.running?
727
+ simulation.close
728
+ simulation.completed_cleanly = true
729
+ simulation.log_results unless Origen.current_command == 'interactive'
748
730
  end
749
731
 
750
732
  def on_origen_shutdown
751
- if @enabled
733
+ unless simulations.empty?
734
+ failed = false
735
+ # Stop the current simulation, this is done with the rescue wrapper so that the rest
736
+ # of the shutdown continues if we got in here via a CTRL-C, in which case the simulator
737
+ # is probably already dead
738
+ begin
739
+ stop if simulation_open?
740
+ rescue
741
+ simulation.completed_cleanly = false
742
+ end
752
743
  unless @interactive_mode
753
- Origen.log.debug 'Shutting down simulator...'
754
- unless @failed_to_start
755
- c = error_count
756
- if c > 0 || @simulator_logged_errors || @stderr_logged_errors
757
- @failed = true
758
- Origen.log.error "The simulation failed with #{c} errors!" if c > 0
759
- Origen.log.error 'The simulation log reported errors!' if @simulator_logged_errors
760
- Origen.log.error 'The simulation stderr reported errors!' if @stderr_logged_errors
761
- elsif !@simulation_completed_cleanly
762
- @failed = true
763
- Origen.log.error 'The simulation exited early!'
744
+ if simulations.size == 1
745
+ failed = simulation.failed?
746
+ else
747
+ failed_simulation_count = simulations.count(&:failed?)
748
+ if failed_simulation_count > 0
749
+ Origen.log.error "#{failed_simulation_count} of #{simulations.size} simulations failed!"
750
+ failed = true
764
751
  end
765
752
  end
766
- end
767
- stop
768
- unless @interactive_mode
769
753
  if failed
770
754
  Origen.app.stats.report_fail
771
755
  else
772
756
  Origen.app.stats.report_pass
773
757
  end
774
758
  end
775
- if view_wave_command
776
- puts
759
+ puts
760
+ if simulations.size == 1
777
761
  puts 'To view the simulation run the following command:'
778
762
  puts
779
- puts " #{view_wave_command}"
763
+ puts " #{simulation.view_wave_command}"
764
+ else
765
+ puts 'To view the simulations run the following commands:'
780
766
  puts
767
+ simulations.each do |simulation|
768
+ if simulation.failed?
769
+ puts " #{simulation.view_wave_command}".red
770
+ else
771
+ puts " #{simulation.view_wave_command}"
772
+ end
773
+ end
774
+ end
775
+ puts
776
+ unless @interactive_mode
777
+ failed ? exit(1) : exit(0)
781
778
  end
782
779
  end
783
780
  end
784
781
 
785
- def socket_id(type = nil)
786
- @socket_ids[type] ||= "/tmp/#{socket_number}#{type}.sock"
787
- end
788
-
789
- def socket_number
790
- @socket_number ||= (Process.pid.to_s + Time.now.to_f.to_s).sub('.', '')
782
+ def socket_id
783
+ simulation.socket_id
791
784
  end
792
785
 
793
786
  def simulation_tester?
@@ -796,6 +789,7 @@ module OrigenSim
796
789
 
797
790
  def timeout_connection(wait_in_s)
798
791
  @connection_timed_out = false
792
+ @connection_established = false
799
793
  t = Thread.new do
800
794
  sleep wait_in_s
801
795
  # If the Verilog process has not established a connection yet, then make one to
data/lib/origen_sim.rb CHANGED
@@ -4,6 +4,7 @@ require 'origen_testers'
4
4
  require 'origen_sim/origen_testers/api'
5
5
  require 'origen_sim/origen/pins/pin'
6
6
  require 'origen_sim/origen/top_level'
7
+ require 'origen_sim/origen/application/runner'
7
8
  module OrigenSim
8
9
  # THIS FILE SHOULD ONLY BE USED TO LOAD RUNTIME DEPENDENCIES
9
10
  # If this plugin has any development dependencies (e.g. dummy DUT or other models that are only used
@@ -46,7 +47,15 @@ module OrigenSim
46
47
  end
47
48
 
48
49
  def self.verbose?
49
- !!(@verbose || Origen.debugger_enabled?)
50
+ !!(@verbose || Origen.debugger_enabled? || Origen.running_remotely?)
51
+ end
52
+
53
+ def self.flow=(val)
54
+ @flow = val
55
+ end
56
+
57
+ def self.flow
58
+ @flow
50
59
  end
51
60
 
52
61
  def self.error_strings
@@ -100,5 +109,9 @@ module OrigenSim
100
109
  def self.fail_on_stderr
101
110
  defined?(@fail_on_stderr) ? @fail_on_stderr : true
102
111
  end
112
+
113
+ def self.error(message)
114
+ simulator.error(message)
115
+ end
103
116
  end
104
117
  OrigenSim.__instantiate_simulator__
data/pattern/test.rb CHANGED
@@ -45,12 +45,12 @@ Pattern.create do
45
45
 
46
46
  if tester.sim?
47
47
  sim = tester.simulator
48
- capture_value = sim.peek("origen.pins.tdo.memory").to_i
48
+ capture_value = sim.peek("origen.pins.tdo.memory").to_i[31..0]
49
49
  unless capture_value == 0x11662244 # 0x2244_6688 reversed
50
50
  if capture_value
51
- fail "Captured #{capture_value.to_hex} instead of 0x11662244!"
51
+ OrigenSim.error "Captured #{capture_value.to_hex} instead of 0x11662244!"
52
52
  else
53
- fail "Nothing captured instead of 0x11662244!"
53
+ OrigenSim.error "Nothing captured instead of 0x11662244!"
54
54
  end
55
55
  end
56
56
 
@@ -58,7 +58,7 @@ Pattern.create do
58
58
  dut.cmd.write(0) # Make Origen forget the actual value
59
59
  dut.cmd.sync
60
60
  unless dut.cmd.data == 0x2244_6688
61
- fail "CMD register did not sync from simulation"
61
+ OrigenSim.error "CMD register did not sync from simulation"
62
62
  end
63
63
 
64
64
  ss "Test sync of a register via a parallel interface"
@@ -68,7 +68,7 @@ Pattern.create do
68
68
  dut.pins(:dout).dont_care
69
69
  dut.parallel_read.sync
70
70
  unless dut.parallel_read.data == 0x7707_7077
71
- fail "PARALLEL_READ register did not sync from simulation"
71
+ OrigenSim.error "PARALLEL_READ register did not sync from simulation"
72
72
  end
73
73
  end
74
74
 
data/pattern/test2.rb ADDED
@@ -0,0 +1 @@
1
+ pattern/test.rb
data/program/p1.rb CHANGED
@@ -2,9 +2,9 @@ Flow.create do
2
2
 
3
3
  test :test
4
4
 
5
- test :test
5
+ test :test2
6
6
 
7
7
  test :test
8
8
 
9
- test :test
9
+ test :test2
10
10
  end
data/program/p2.rb ADDED
@@ -0,0 +1 @@
1
+ program/p1.rb
@@ -1,4 +1,4 @@
1
- database -open waves -into <%= options[:dir] %> -default -event
1
+ database -open waves -into <%= options[:dir] %>/<%= options[:wave_file] %> -default -event
2
2
  probe -create -shm origen -depth <%= options[:depth] %> -database waves
3
3
  #probe -create -assertions -transaction origen -depth all -database waves
4
4
 
@@ -157,7 +157,7 @@ module origen;
157
157
  //$display("********************************");
158
158
  //$display("Creating origen.vcd...");
159
159
  //$display("********************************");
160
- $dumpfile("origen.vcd");
160
+ //$dumpfile("origen.vcd");
161
161
  $dumpvars(0,origen);
162
162
  end
163
163
  `endif
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.9.0
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stephen McGinty
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-06-01 00:00:00.000000000 Z
11
+ date: 2018-06-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: origen
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: 0.3.1
47
+ version: '0.4'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: 0.3.1
54
+ version: '0.4'
55
55
  description:
56
56
  email:
57
57
  - stephen.f.mcginty@gmail.com
@@ -81,15 +81,20 @@ files:
81
81
  - lib/origen_sim/commands/pack.rb
82
82
  - lib/origen_sim/flow.rb
83
83
  - lib/origen_sim/generator.rb
84
+ - lib/origen_sim/heartbeat.rb
85
+ - lib/origen_sim/origen/application/runner.rb
84
86
  - lib/origen_sim/origen/pins/pin.rb
85
87
  - lib/origen_sim/origen/top_level.rb
86
88
  - lib/origen_sim/origen_testers/api.rb
89
+ - lib/origen_sim/simulation.rb
87
90
  - lib/origen_sim/simulator.rb
88
91
  - lib/origen_sim/tester.rb
89
92
  - lib/origen_sim_dev/dut.rb
90
93
  - lib/tasks/origen_sim.rake
91
94
  - pattern/test.rb
95
+ - pattern/test2.rb
92
96
  - program/p1.rb
97
+ - program/p2.rb
93
98
  - templates/empty.gtkw
94
99
  - templates/empty.svcf
95
100
  - templates/empty.tcl
@@ -118,7 +123,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
118
123
  version: 1.8.11
119
124
  requirements: []
120
125
  rubyforge_project:
121
- rubygems_version: 2.6.7
126
+ rubygems_version: 2.6.14.1
122
127
  signing_key:
123
128
  specification_version: 4
124
129
  summary: Plugin that provides a testbench environment to simulate Origen test patterns