origen_sim 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3fa5d90e78e17efb1942f6da11e1af57944e4ae1
4
+ data.tar.gz: 5ef919794ccbe8c54762dc87b1f461821ecdb031
5
+ SHA512:
6
+ metadata.gz: ba5ee81d6b23bc3ca5c910cf12c491938e87fb7cd1140142744cc4610f1058ac09c7196e9161291c852aaa3eb7e5516fdf5940463b4e7fb6a839e580bf1df022
7
+ data.tar.gz: 8fccdf6043048f57802489a64631bb1e8c6b757cba3c909690dd4e96582b71cca2b96a85f87f168f63c9aceff60ae62dfab5976af42ae4543b890b809dbed2e1
@@ -0,0 +1,109 @@
1
+ require 'origen'
2
+ class OrigenSimApplication < Origen::Application
3
+
4
+ # See http://origen-sdk.org/origen/api/Origen/Application/Configuration.html
5
+ # for a full list of the configuration options available
6
+
7
+ # These attributes should never be changed, the duplication here will be resolved in future
8
+ # by condensing these attributes that do similar things
9
+ self.name = "origen_sim"
10
+ self.namespace = "OrigenSim"
11
+ config.name = "origen_sim"
12
+ config.initials = "OrigenSim"
13
+ config.rc_url = "git@github.com:Origen-SDK/origen_sim.git"
14
+ config.release_externally = true
15
+
16
+ # To enable deployment of your documentation to a web server (via the 'origen web'
17
+ # command) fill in these attributes.
18
+ config.web_directory = "git@github.com:Origen-SDK/Origen-SDK.github.io.git/sim"
19
+ config.web_domain = "http://origen-sdk.org/sim"
20
+
21
+ # When false Origen will be less strict about checking for some common coding errors,
22
+ # it is recommended that you leave this to true for better feedback and easier debug.
23
+ # This will be the default setting in Origen v3.
24
+ config.strict_errors = true
25
+
26
+ config.shared = {
27
+ #:patterns => "pattern",
28
+ #:templates => "templates",
29
+ #:programs => "program",
30
+ :command_launcher => "config/shared_commands.rb"
31
+ }
32
+
33
+ # See: http://origen-sdk.org/origen/latest/guides/utilities/lint/
34
+ config.lint_test = {
35
+ # Require the lint tests to pass before allowing a release to proceed
36
+ run_on_tag: true,
37
+ # Auto correct violations where possible whenever 'origen lint' is run
38
+ auto_correct: true,
39
+ # Limit the testing for large legacy applications
40
+ #level: :easy,
41
+ # Run on these directories/files by default
42
+ #files: ["lib", "config/application.rb"],
43
+ }
44
+
45
+ config.semantically_version = true
46
+
47
+ # An example of how to set application specific LSF parameters
48
+ #config.lsf.project = "msg.te"
49
+
50
+ # An example of how to specify a prefix to add to all generated patterns
51
+ #config.pattern_prefix = "nvm"
52
+
53
+ # An example of how to add header comments to all generated patterns
54
+ #config.pattern_header do
55
+ # cc "This is a pattern created by the example origen application"
56
+ #end
57
+
58
+ # By default all generated output will end up in ./output.
59
+ # Here you can specify an alternative directory entirely, or make it dynamic such that
60
+ # the output ends up in a setup specific directory.
61
+ #config.output_directory do
62
+ # "#{Origen.root}/output/#{$dut.class}"
63
+ #end
64
+
65
+ # Similarly for the reference files, generally you want to setup the reference directory
66
+ # structure to mirror that of your output directory structure.
67
+ #config.reference_directory do
68
+ # "#{Origen.root}/.ref/#{$dut.class}"
69
+ #end
70
+
71
+ # This will automatically deploy your documentation after every tag
72
+ #def after_release_email(tag, note, type, selector, options)
73
+ # command = "origen web compile --remote --api"
74
+ # Dir.chdir Origen.root do
75
+ # system command
76
+ # end
77
+ #end
78
+
79
+ # Ensure that all tests pass before allowing a release to continue
80
+ #def validate_release
81
+ # if !system("origen specs") || !system("origen examples")
82
+ # puts "Sorry but you can't release with failing tests, please fix them and try again."
83
+ # exit 1
84
+ # else
85
+ # puts "All tests passing, proceeding with release process!"
86
+ # end
87
+ #end
88
+
89
+ # To enabled source-less pattern generation create a class (for example PatternDispatcher)
90
+ # to generate the pattern. This should return false if the requested pattern has been
91
+ # dispatched, otherwise Origen will proceed with looking up a pattern source as normal.
92
+ #def before_pattern_lookup(requested_pattern)
93
+ # PatternDispatcher.new.dispatch_or_return(requested_pattern)
94
+ #end
95
+
96
+ # If you use pattern iterators you may come across the case where you request a pattern
97
+ # like this:
98
+ # origen g example_pat_b0.atp
99
+ #
100
+ # However it cannot be found by Origen since the pattern name is actually example_pat_bx.atp
101
+ # In the case where the pattern cannot be found Origen will pass the name to this translator
102
+ # if it exists, and here you can make any substitutions to help Origen find the file you
103
+ # want. In this example any instances of _b\d, where \d means a number, are replaced by
104
+ # _bx.
105
+ #config.pattern_name_translator do |name|
106
+ # name.gsub(/_b\d/, "_bx")
107
+ #end
108
+
109
+ end
data/config/boot.rb ADDED
@@ -0,0 +1,24 @@
1
+ # This file is used to boot your plugin when it is running in standalone mode
2
+ # from its own workspace - i.e. when the plugin is being developed.
3
+ #
4
+ # It will not be loaded when the plugin is imported by a 3rd party app - in that
5
+ # case only lib/origen_sim.rb is loaded.
6
+ #
7
+ # Therefore this file can be used to load anything extra that you need to boot
8
+ # the development environment for this app. For example, this is typically used
9
+ # to load some additional test classes to use your plugin APIs so that they can
10
+ # be tested and/or interacted with in the console.
11
+ require "origen_sim"
12
+
13
+ module OrigenSimDev
14
+ # Example of how to explicitly require a file
15
+ # require "origen_sim_dev/my_file"
16
+
17
+ # Load all files in the lib/origen_sim_dev directory.
18
+ # Note that there is no problem from requiring a file twice (Ruby will ignore
19
+ # the second require), so if you have a file that must be required first, then
20
+ # explicitly require it up above and then let this take care of the rest.
21
+ Dir.glob("#{File.dirname(__FILE__)}/../lib/origen_sim_dev/**/*.rb").sort.each do |file|
22
+ require file
23
+ end
24
+ end
@@ -0,0 +1,74 @@
1
+ # This file should be used to extend the origen with application specific commands
2
+
3
+ # Map any command aliases here, for example to allow 'origen ex' to refer to a
4
+ # command called execute you would add a reference as shown below:
5
+ aliases ={
6
+ # "ex" => "execute",
7
+ }
8
+
9
+ # The requested command is passed in here as @command, this checks it against
10
+ # the above alias table and should not be removed.
11
+ @command = aliases[@command] || @command
12
+
13
+ # Now branch to the specific task code
14
+ case @command
15
+
16
+ # Here is an example of how to implement a command, the logic can go straight
17
+ # in here or you can require an external file if preferred.
18
+ when "my_command"
19
+ puts "Doing something..."
20
+ #require "commands/my_command" # Would load file lib/commands/my_command.rb
21
+ # You must always exit upon successfully capturing a command to prevent
22
+ # control flowing back to Origen
23
+ exit 0
24
+
25
+ ## Example of how to make a command to run unit tests, this simply invokes RSpec on
26
+ ## the spec directory
27
+ #when "specs"
28
+ # require "rspec"
29
+ # exit RSpec::Core::Runner.run(['spec'])
30
+
31
+ ## Example of how to make a command to run diff-based tests
32
+ #when "examples", "test"
33
+ # Origen.load_application
34
+ # status = 0
35
+ #
36
+ # # Compiler tests
37
+ # ARGV = %w(templates/example.txt.erb -t debug -r approved)
38
+ # load "origen/commands/compile.rb"
39
+ # # Pattern generator tests
40
+ # #ARGV = %w(some_pattern -t debug -r approved)
41
+ # #load "#{Origen.top}/lib/origen/commands/generate.rb"
42
+ #
43
+ # if Origen.app.stats.changed_files == 0 &&
44
+ # Origen.app.stats.new_files == 0 &&
45
+ # Origen.app.stats.changed_patterns == 0 &&
46
+ # Origen.app.stats.new_patterns == 0
47
+ #
48
+ # Origen.app.stats.report_pass
49
+ # else
50
+ # Origen.app.stats.report_fail
51
+ # status = 1
52
+ # end
53
+ # puts
54
+ # if @command == "test"
55
+ # Origen.app.unload_target!
56
+ # require "rspec"
57
+ # result = RSpec::Core::Runner.run(['spec'])
58
+ # status = status == 1 ? 1 : result
59
+ # end
60
+ # exit status # Exit with a 1 on the event of a failure per std unix result codes
61
+
62
+ # Always leave an else clause to allow control to fall back through to the
63
+ # Origen command handler.
64
+ else
65
+ # You probably want to also add the your commands to the help shown via
66
+ # origen -h, you can do this be assigning the required text to @application_commands
67
+ # before handing control back to Origen. Un-comment the example below to get started.
68
+ # @application_commands = <<-EOT
69
+ # specs Run the specs (tests), -c will enable coverage
70
+ # examples Run the examples (tests), -c will enable coverage
71
+ # test Run both specs and examples, -c will enable coverage
72
+ # EOT
73
+
74
+ end
@@ -0,0 +1,12 @@
1
+ # The requested command is passed in here as @command
2
+ case @command
3
+
4
+ when "origen_sim:build", "sim:build"
5
+ require "origen_sim/commands/build"
6
+ exit 0
7
+ else
8
+ @plugin_commands << <<-EOT
9
+ sim:build Build the simulation object for the current/given target
10
+ EOT
11
+
12
+ end
data/config/version.rb ADDED
@@ -0,0 +1,8 @@
1
+ module OrigenSim
2
+ MAJOR = 0
3
+ MINOR = 5
4
+ BUGFIX = 0
5
+ DEV = nil
6
+
7
+ VERSION = [MAJOR, MINOR, BUGFIX].join(".") + (DEV ? ".pre#{DEV}" : '')
8
+ end
@@ -0,0 +1,105 @@
1
+ require 'optparse'
2
+ require 'origen_sim'
3
+
4
+ options = {}
5
+
6
+ # App options are options that the application can supply to extend this command
7
+ app_options = @application_options || []
8
+ opt_parser = OptionParser.new do |opts|
9
+ opts.banner = <<-EOT
10
+ Compile an RTL design into an object that Origen can simulate.
11
+
12
+ All configuration apart from target selection should be done when instantiating the
13
+ OrigenSim::Tester in an environment file. This encourages the configuration to be
14
+ checked in, enabling repeatable builds in future.
15
+
16
+ Usage: origen origen_sim:build [options]
17
+ EOT
18
+ opts.on('-e', '--environment NAME', String, 'Override the default environment, NAME can be a full path or a fragment of an environment file name') { |e| options[:environment] = e }
19
+ opts.on('-t', '--target NAME', String, 'Override the default target, NAME can be a full path or a fragment of a target file name') { |t| options[:target] = t }
20
+ opts.on('-pl', '--plugin PLUGIN_NAME', String, 'Set current plugin') { |pl_n| options[:current_plugin] = pl_n }
21
+ opts.on('--testrun', 'Displays the commands that will be generated but does not execute them') { options[:testrun] = true }
22
+ opts.on('-i', '--incremental', 'Preserve existing compiled files to do an incremental build instead of starting from scratch') { options[:incremental] = true }
23
+ opts.on('-d', '--debugger', 'Enable the debugger') { options[:debugger] = true }
24
+ app_options.each do |app_option|
25
+ opts.on(*app_option) {}
26
+ end
27
+ opts.separator ''
28
+ opts.on('-h', '--help', 'Show this message') { puts opts; exit 0 }
29
+ end
30
+
31
+ opt_parser.parse! ARGV
32
+ Origen.app.plugins.temporary = options[:current_plugin] if options[:current_plugin]
33
+ Origen.environment.temporary = options[:environment] if options[:environment]
34
+ Origen.target.temporary = options[:target] if options[:target]
35
+ Origen.app.load_target!
36
+
37
+ unless tester.is_a?(OrigenSim::Tester)
38
+ puts 'The target/environment does not instantiate an OrigenSim::Tester instance!'
39
+ exit
40
+ end
41
+
42
+ simulator = OrigenSim.simulator
43
+ config = simulator.configuration
44
+ tmp_dir = simulator.tmp_dir
45
+
46
+ unless options[:testrun]
47
+ FileUtils.rm_rf(tmp_dir) unless options[:incremental]
48
+ FileUtils.mkdir_p(tmp_dir)
49
+ FileUtils.rm_rf(simulator.compiled_dir) unless options[:incremental]
50
+ FileUtils.mkdir_p(simulator.compiled_dir)
51
+ FileUtils.rm_rf(simulator.artifacts_dir)
52
+ FileUtils.mkdir_p(simulator.artifacts_dir)
53
+ Array(config[:artifacts] || config[:artifact]).each do |f|
54
+ FileUtils.cp(f, simulator.artifacts_dir)
55
+ end
56
+
57
+ # Create the testbench for the current Origen target and simulator vendor
58
+ Origen.app.runner.launch action: :compile,
59
+ files: "#{Origen.root!}/templates/rtl_v/origen.v.erb",
60
+ output: tmp_dir,
61
+ check_for_changes: false,
62
+ options: { vendor: config[:vendor], top: config[:rtl_top] }
63
+ end
64
+
65
+ case config[:vendor]
66
+ when :icarus
67
+ # Compile the VPI extension first
68
+ Dir.chdir tmp_dir do
69
+ system "iverilog-vpi #{Origen.root!}/ext/*.c -DICARUS --name=origen"
70
+ system "mv origen.vpi #{simulator.compiled_dir}"
71
+ end
72
+ # Build the object containing the DUT and testbench
73
+ cmd = "iverilog -o #{simulator.compiled_dir}/dut.vvp"
74
+ Array(config[:rtl_dir] || config[:rtl_dirs]).each do |dir|
75
+ cmd += " -I #{dir}"
76
+ end
77
+ Array(config[:rtl_file] || config[:rtl_files]).each do |f|
78
+ cmd += " #{f}"
79
+ end
80
+ cmd += " #{tmp_dir}/origen.v"
81
+
82
+ when :cadence
83
+ cmd = config[:irun] || 'irun'
84
+ Array(config[:rtl_file] || config[:rtl_files]).each do |f|
85
+ cmd += " #{f}"
86
+ end
87
+ Array(config[:lib_file] || config[:lib_files]).each do |f|
88
+ cmd += " -v #{f}"
89
+ end
90
+ Array(config[:rtl_dir] || config[:rtl_dirs]).each do |dir|
91
+ cmd += " -incdir #{dir}"
92
+ end
93
+ cmd += " #{tmp_dir}/origen.v -top origen -timescale 1ns/1ns"
94
+ cmd += " -nclibdirpath #{simulator.compiled_dir}"
95
+ cmd += " #{Origen.root!}/ext/*.c -ccargs \"-std=gnu99\""
96
+ cmd += ' -elaborate -snapshot origen -access +rw'
97
+ cmd += " #{config[:explicit].strip.gsub(/\s+/, ' ')}" if config[:explicit]
98
+ end
99
+
100
+ puts cmd
101
+ unless options[:testrun]
102
+ Dir.chdir tmp_dir do
103
+ system cmd
104
+ end
105
+ end
@@ -0,0 +1,13 @@
1
+ module OrigenSim
2
+ class Flow
3
+ include OrigenTesters::Flow
4
+
5
+ def test(name, options = {})
6
+ pattern = (options[:pattern] || name.try(:pattern) || name).to_s
7
+
8
+ Origen.interface.referenced_patterns << pattern
9
+
10
+ Origen.app.runner.launch action: :generate, files: pattern
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,35 @@
1
+ require 'origen_sim/flow'
2
+ module OrigenSim
3
+ module Generator
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ include OrigenTesters::Interface # adds the interface helpers/Origen hook-up
8
+ end
9
+
10
+ def flow(filename = nil)
11
+ if filename || Origen.file_handler.current_file
12
+ filename ||= Origen.file_handler.current_file.basename('.rb').to_s
13
+ # DH here need to reset the flow!!
14
+ f = filename.to_sym
15
+ return flow_sheets[f] if flow_sheets[f] # will return flow if already existing
16
+ p = OrigenSim::Flow.new
17
+ p.inhibit_output if Origen.interface.resources_mode?
18
+ p.filename = f
19
+ flow_sheets[f] = p
20
+ end
21
+ end
22
+
23
+ def flow_sheets
24
+ @@flow_sheets ||= {}
25
+ end
26
+
27
+ def reset_globals
28
+ @@flow_sheets = nil
29
+ end
30
+
31
+ def sheet_generators
32
+ []
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,93 @@
1
+ require 'origen/pins/pin'
2
+ module Origen
3
+ module Pins
4
+ # Override the Origen pin model so we can hook into all changes to pin states
5
+ class Pin
6
+ # The index number that is used to refer to the pin within the simulation
7
+ attr_accessor :simulation_index
8
+ # When generating a testbench the top-level signal will be tied off to the given
9
+ # logic level if this is set to 0 or 1
10
+ attr_accessor :tie_off
11
+
12
+ alias_method :_orig_initialize, :initialize
13
+ def initialize(id, owner, options = {})
14
+ @tie_off = options[:tie_off]
15
+ _orig_initialize(id, owner, options)
16
+ end
17
+
18
+ def rtl_name
19
+ if primary_group
20
+ (@rtl_name || primary_group.id).to_s
21
+ else
22
+ (@rtl_name || id).to_s
23
+ end
24
+ end
25
+
26
+ alias_method :_orig_set_value, :set_value
27
+ def set_value(val)
28
+ ret = _orig_set_value(val)
29
+ update_simulation if simulation_running?
30
+ ret
31
+ end
32
+
33
+ alias_method :_orig_set_state, :set_state
34
+ def set_state(val)
35
+ ret = _orig_set_state(val)
36
+ update_simulation if simulation_running?
37
+ ret
38
+ end
39
+
40
+ alias_method :_orig_state=, :state=
41
+ def state=(val)
42
+ ret = _orig_state = (val)
43
+ update_simulation if simulation_running?
44
+ ret
45
+ end
46
+
47
+ def simulation_running?
48
+ tester && tester.is_a?(OrigenSim::Tester)
49
+ end
50
+
51
+ def simulator
52
+ OrigenSim.simulator
53
+ end
54
+
55
+ # Returns true if the current pin state is different to that last given to the simulator
56
+ def simulator_needs_update?
57
+ return false if state == :dont_care && @simulator_state == :dont_care
58
+ state != @simulator_state || value != @simulator_value
59
+ end
60
+
61
+ def reset_simulator_state
62
+ @simulator_state = nil
63
+ @simulator_value = nil
64
+ end
65
+
66
+ # Applies the current pin state to the simulation, this is triggered everytime
67
+ # the pin state or value changes
68
+ def update_simulation
69
+ return if tie_off || !simulation_index || !tester.timeset || !simulator_needs_update?
70
+ case state
71
+ when :drive
72
+ @simulator_state = :drive
73
+ @simulator_value = value
74
+ simulator.put("2^#{simulation_index}^#{value}")
75
+ when :compare
76
+ @simulator_state = :compare
77
+ @simulator_value = value
78
+ simulator.put("4^#{simulation_index}^#{value}")
79
+ when :dont_care
80
+ @simulator_state = :dont_care
81
+ simulator.put("5^#{simulation_index}")
82
+ when :capture
83
+ @simulator_state = :capture
84
+ simulator.put("e^#{simulation_index}")
85
+ when :drive_very_high, :drive_mem, :expect_mem, :compare_midband
86
+ fail "Simulation of pin state #{state} is not implemented yet!"
87
+ else
88
+ fail "Simulation of pin state #{state} is not implemented yet!"
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,22 @@
1
+ require 'origen/top_level'
2
+ module Origen
3
+ module TopLevel
4
+ # Like pins, except removes any pins which have their rtl_name
5
+ # attribute set to 'nc'
6
+ def rtl_pins
7
+ @rtl_pins ||= begin
8
+ p = []
9
+ pins.each do |name, pin|
10
+ options = {}
11
+ unless pin.rtl_name.to_s.downcase == 'nc'
12
+ if pin.primary_group
13
+ options[:group] = true
14
+ end
15
+ p << [name, pin, options]
16
+ end
17
+ end
18
+ p
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,11 @@
1
+ require 'origen_testers/api'
2
+ module OrigenTesters
3
+ module API
4
+ # Returns true if the tester is an instance of OrigenSim::Tester,
5
+ # otherwise returns false
6
+ def sim?
7
+ is_a?(OrigenSim::Tester)
8
+ end
9
+ alias_method :simulator?, :sim?
10
+ end
11
+ end