origen 0.42.2 → 0.43.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d4444530a8b096837de963c5e90556fe59315d9dd4525e267e5cecc0ef868fa7
4
- data.tar.gz: 54805b892b9cbda932d23f5cefeef2105d517f13f2edc6be88b8532668a3ab32
3
+ metadata.gz: 50ff914ed84d58eef72d7c1eee3919a420d0a4af50bd9fe01fbf4c79f334578b
4
+ data.tar.gz: b51d183c27e9cb027f520a21f7bae2f8a21cd41d1158dfc8ec41feecb55409fd
5
5
  SHA512:
6
- metadata.gz: 2b6e77cc6050ac0c6ce00e683dd165673519eeb26743737e44758f6f20063ef53d833d1db873abcd3ccc253e96a8c6de6c97af478af111062f36cdd0a3288ef5
7
- data.tar.gz: 1016d2358c181d54af3c731611be99a88fb3051960b626effd024fe37ff6c9ecfd12ef7085e8f7aa14855995b75d45c7ae5a85083bda4560b17d091ded60d636
6
+ metadata.gz: 8b227567f13516ee3cb2aeef1ea5b423febcfb3cfe2443f61a0e79857032cd301df77753cede06d88bd2ce2d1eea9720b48e60fb3b235946cf1121ede63f3f22
7
+ data.tar.gz: ef83425ec57f409158281bd045c9847dc5b97cbed7a89e99feb18a7037581309cfd7f7e3ae846e2b5626991f07cb310ade1cf4c2ce479337e38b80db576d6921
data/config/version.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module Origen
2
2
  MAJOR = 0
3
- MINOR = 42
4
- BUGFIX = 2
3
+ MINOR = 43
4
+ BUGFIX = 0
5
5
  DEV = nil
6
6
 
7
7
  VERSION = [MAJOR, MINOR, BUGFIX].join(".") + (DEV ? ".pre#{DEV}" : '')
@@ -46,7 +46,9 @@ module Origen
46
46
  Origen.log.info 'Monitor status of remote jobs via:'
47
47
  Origen.log.info ' origen l'
48
48
  else
49
- Origen.log.info '*' * 70 unless options[:quiet]
49
+ unless tester && tester.try(:sim?)
50
+ Origen.log.info '*' * 70 unless options[:quiet]
51
+ end
50
52
  Origen.app.listeners_for(:before_generate).each do |listener|
51
53
  if listener.class.instance_method(:before_generate).arity == 0
52
54
  listener.before_generate
@@ -104,7 +106,7 @@ module Origen
104
106
  end
105
107
  end
106
108
 
107
- unless options[:quiet]
109
+ unless options[:quiet] || (tester && tester.try(:sim?))
108
110
  Origen.log.info '*' * 70
109
111
  stats.print_summary unless options[:action] == :merge
110
112
  end
@@ -97,12 +97,7 @@ Origen.lsf.current_command = @command
97
97
 
98
98
  if ARGV.delete('-d') || ARGV.delete('--debug')
99
99
  begin
100
- if RUBY_VERSION >= '2.0.0'
101
- require 'byebug'
102
- else
103
- require 'rubygems'
104
- require 'ruby-debug'
105
- end
100
+ require 'byebug'
106
101
  rescue LoadError
107
102
  def debugger
108
103
  caller[0] =~ /.*\/(\w+\.rb):(\d+).*/
@@ -15,7 +15,10 @@ module Origen
15
15
  # This will also take care of recursively expanding any embedded
16
16
  # list references.
17
17
  def expand_list(files, options = {})
18
- [files].flatten.map do |file|
18
+ options = {
19
+ preserve_duplicates: tester && tester.try(:sim?)
20
+ }.merge(options)
21
+ list_of_files = [files].flatten.map do |file|
19
22
  f = file.strip
20
23
  # Takes care of blank or comment lines in a list file
21
24
  if f.empty? || f =~ /^\s*#/
@@ -28,7 +31,12 @@ module Origen
28
31
  else
29
32
  f
30
33
  end
31
- end.flatten.compact.uniq
34
+ end.flatten.compact
35
+ if options[:preserve_duplicates]
36
+ list_of_files
37
+ else
38
+ list_of_files.uniq
39
+ end
32
40
  end
33
41
 
34
42
  # Returns the contents of the given list file in an array, if it
@@ -11,6 +11,8 @@ module Origen
11
11
  autoload :Comparator, 'origen/generator/comparator'
12
12
  autoload :Renderer, 'origen/generator/renderer'
13
13
 
14
+ class AbortError < StandardError; end
15
+
14
16
  def pattern
15
17
  @pattern ||= Pattern.new
16
18
  end
@@ -31,7 +31,9 @@ module Origen
31
31
  end
32
32
  interface.close(flow: true, sub_flow: true)
33
33
  else
34
- Origen.log.info "Generating... #{Origen.file_handler.current_file.basename}"
34
+ unless tester.try(:sim?)
35
+ Origen.log.info "Generating... #{Origen.file_handler.current_file.basename}"
36
+ end
35
37
  interface = Origen.reset_interface(options)
36
38
  Origen.interface.set_top_level_flow
37
39
  Origen.interface.flow_generator.set_flow_description(Origen.interface.consume_comments)
@@ -165,19 +165,22 @@ module Origen
165
165
  end
166
166
  end
167
167
  rescue Exception => e
168
- if @options[:continue] || Origen.running_remotely?
169
- Origen.log.error "FAILED - #{@requested_pattern} (for target #{Origen.target.name})"
170
- Origen.log.error e.message
171
- e.backtrace.each do |l|
172
- Origen.log.error l
173
- end
174
- if @options[:compile]
175
- Origen.app.stats.failed_files += 1
168
+ # Whoever has aborted the job is responsible for cleaning it up
169
+ unless e.is_a?(Origen::Generator::AbortError)
170
+ if @options[:continue] || Origen.running_remotely?
171
+ Origen.log.error "FAILED - #{@requested_pattern} (for target #{Origen.target.name})"
172
+ Origen.log.error e.message
173
+ e.backtrace.each do |l|
174
+ Origen.log.error l
175
+ end
176
+ if @options[:compile]
177
+ Origen.app.stats.failed_files += 1
178
+ else
179
+ Origen.app.stats.failed_patterns += 1
180
+ end
176
181
  else
177
- Origen.app.stats.failed_patterns += 1
182
+ raise
178
183
  end
179
- else
180
- raise
181
184
  end
182
185
  end
183
186
  Origen.log.stop_job
@@ -372,9 +372,7 @@ module Origen
372
372
  unless job.test?
373
373
  File.delete(job.output_pattern) if File.exist?(job.output_pattern)
374
374
 
375
- if options[:inhibit]
376
- log.info "Generating... #{job.output_pattern_directory}/#{job.output_pattern_filename}".ljust(50)
377
- else
375
+ unless tester.try(:sim?)
378
376
  log.info "Generating... #{job.output_pattern_directory}/#{job.output_pattern_filename}".ljust(50)
379
377
  end
380
378
  end
@@ -468,11 +466,13 @@ module Origen
468
466
  end
469
467
  end
470
468
 
471
- log.info ' '
472
- log.info "Pattern vectors: #{stats.number_of_vectors_for(job.output_pattern).to_s.ljust(10)}"
473
- log.info 'Execution time'.ljust(15) + ': %.6f' % stats.execution_time_for(job.output_pattern)
474
- log.info '----------------------------------------------------------------------'
475
- check_for_changes(job.output_pattern, job.reference_pattern) unless tester.try(:disable_pattern_diffs)
469
+ unless tester.try(:sim?)
470
+ log.info ' '
471
+ log.info "Pattern vectors: #{stats.number_of_vectors_for(job.output_pattern).to_s.ljust(10)}"
472
+ log.info 'Execution time'.ljust(15) + ': %.6f' % stats.execution_time_for(job.output_pattern)
473
+ log.info '----------------------------------------------------------------------'
474
+ check_for_changes(job.output_pattern, job.reference_pattern) unless tester.try(:disable_pattern_diffs)
475
+ end
476
476
  stats.record_pattern_completion(job.output_pattern)
477
477
  end
478
478
 
data/lib/origen/log.rb CHANGED
@@ -17,6 +17,7 @@ module Origen
17
17
  @log_time_0 = @t0 = Time.new
18
18
  self.level = :normal
19
19
  @custom_logs = {}
20
+ @interceptors = {}
20
21
  end
21
22
 
22
23
  def console_only?(options = {})
@@ -79,57 +80,94 @@ module Origen
79
80
  @level
80
81
  end
81
82
 
83
+ # @api private
84
+ #
85
+ # @example of an interceptor:
86
+ #
87
+ # # An interceptor ID is returned, this should be given to stop_intercepting
88
+ # @log_intercept_id = Origen.log.start_intercepting do |msg, type, options, original|
89
+ # if some_condition_is_true?
90
+ # # Handling it ourselves
91
+ # my_method(msg, type)
92
+ # else
93
+ # # Call the original Origen.log method (or the next interceptor in line)
94
+ # original.call(msg, type, options)
95
+ # end
96
+ # end
97
+ def start_intercepting(&block)
98
+ id = block.object_id
99
+ @interceptors[id] = block
100
+ id
101
+ end
102
+
103
+ # @api private
104
+ def stop_intercepting(id)
105
+ @interceptors.delete(id)
106
+ end
107
+
82
108
  def debug(string = '', options = {})
83
109
  string, options = sanitize_args(string, options)
84
- msg = format_msg('DEBUG', string)
85
- log_files(:debug, msg) unless console_only?(options)
86
- console.debug msg
87
- nil
110
+ intercept(string, :debug, options) do |msg, type, options|
111
+ msg = format_msg('DEBUG', msg)
112
+ log_files(:debug, msg) unless console_only?(options)
113
+ console.debug msg
114
+ nil
115
+ end
88
116
  end
89
117
 
90
- def info(string = '', msg_type = nil)
118
+ def info(string = '', options = {})
91
119
  string, options = sanitize_args(string, options)
92
- msg = format_msg('INFO', string)
93
- log_files(:info, msg) unless console_only?(options)
94
- console.info msg
95
- nil
120
+ intercept(string, :info, options) do |msg, type, options|
121
+ msg = format_msg('INFO', msg)
122
+ log_files(:info, msg) unless console_only?(options)
123
+ console.info msg
124
+ nil
125
+ end
96
126
  end
97
127
  # Legacy methods
98
128
  alias_method :lputs, :info
99
129
  alias_method :lprint, :info
100
130
 
101
- def success(string = '', msg_type = nil)
131
+ def success(string = '', options = {})
102
132
  string, options = sanitize_args(string, options)
103
- msg = format_msg('SUCCESS', string)
104
- log_files(:info, msg) unless console_only?(options)
105
- console.info color_unless_remote(msg, :green)
106
- nil
133
+ intercept(string, :success, options) do |msg, type, options|
134
+ msg = format_msg('SUCCESS', msg)
135
+ log_files(:info, msg) unless console_only?(options)
136
+ console.info color_unless_remote(msg, :green)
137
+ nil
138
+ end
107
139
  end
108
140
 
109
- def deprecate(string = '', msg_type = nil)
141
+ def deprecate(string = '', options = {})
110
142
  string, options = sanitize_args(string, options)
111
- msg = format_msg('DEPRECATED', string)
112
- log_files(:warn, msg) unless console_only?(options)
113
- console.warn color_unless_remote(msg, :yellow)
114
- nil
143
+ intercept(string, :deprecate, options) do |msg, type, options|
144
+ msg = format_msg('DEPRECATED', msg)
145
+ log_files(:warn, msg) unless console_only?(options)
146
+ console.warn color_unless_remote(msg, :yellow)
147
+ nil
148
+ end
115
149
  end
116
150
  alias_method :deprecated, :deprecate
117
151
 
118
- def warn(string = '', msg_type = nil)
152
+ def warn(string = '', options = {})
119
153
  string, options = sanitize_args(string, options)
120
- msg = format_msg('WARNING', string)
121
- log_files(:warn, msg) unless console_only?(options)
122
- console.warn color_unless_remote(msg, :yellow)
123
- nil
154
+ intercept(string, :warn, options) do |msg, type, options|
155
+ msg = format_msg('WARNING', msg)
156
+ log_files(:warn, msg) unless console_only?(options)
157
+ console.warn color_unless_remote(msg, :yellow)
158
+ nil
159
+ end
124
160
  end
125
161
  alias_method :warning, :warn
126
162
 
127
- def error(string = '', msg_type = nil)
163
+ def error(string = '', options = {})
128
164
  string, options = sanitize_args(string, options)
129
- msg = format_msg('ERROR', string)
130
- log_files(:error, msg) unless console_only?(options)
131
- console.error color_unless_remote(msg, :red)
132
- nil
165
+ intercept(string, :error, options) do |msg, type, options|
166
+ msg = format_msg('ERROR', msg)
167
+ log_files(:error, msg) unless console_only?(options)
168
+ console.error color_unless_remote(msg, :red)
169
+ nil
170
+ end
133
171
  end
134
172
 
135
173
  # Made these all class methods so that they can be read without
@@ -154,22 +192,25 @@ module Origen
154
192
  level == :verbose
155
193
  end
156
194
 
157
- # Used to force logger to write any buffered output under an earlier implementation, now does nothing
195
+ # Force the logger to write any buffered output to the log files
158
196
  def flush
159
- # No such API provided by the underlying logger, method kept around for compatibility with application
160
- # code which was built for a previous version of this logger where flushing was required
197
+ @open_logs.each do |logger, file|
198
+ file.flush
199
+ end
200
+ nil
161
201
  end
162
202
 
163
203
  # Mainly intended for testing the logger, this will return the log level to the default (:normal)
164
204
  # and close all log files, such that any further logging will be done to a new file(s)
165
205
  def reset
166
206
  self.level = :normal
167
- @last_file.close if @last_file
207
+ flush
208
+ close_log(@last_file)
168
209
  @last_file = nil
169
- @job_file.close if @job_file
210
+ close_log(@job_file)
170
211
  @job_file = nil
171
212
  @custom_logs.each do |name, log|
172
- log.close
213
+ close_log(log)
173
214
  end
174
215
  @custom_logs = {}
175
216
  end
@@ -184,7 +225,16 @@ module Origen
184
225
  dir = File.join(dir, env)
185
226
  end
186
227
  FileUtils.mkdir_p dir unless File.exist?(dir)
228
+ @@job_file_paths = {} unless defined?(@@job_file_paths)
229
+ # Make sure the log name is unique in this run, duplication and overwrite can occur in cases where
230
+ # a pattern is run multiple times during a simulation
187
231
  @job_file_path = File.join(dir, "#{name}.txt")
232
+ if n = @@job_file_paths[@job_file_path]
233
+ @@job_file_paths[@job_file_path] += 1
234
+ @job_file_path = File.join(dir, "#{name}_#{n}.txt")
235
+ else
236
+ @@job_file_paths[@job_file_path] = 1
237
+ end
188
238
  FileUtils.rm_f(@job_file_path) if File.exist?(@job_file_path)
189
239
  @job_file = open_log(@job_file_path)
190
240
  end
@@ -192,8 +242,13 @@ module Origen
192
242
  # @api private
193
243
  def stop_job
194
244
  if @job_file
195
- Origen.log.info "Log file written to: #{@job_file_path}"
196
- @job_file.close
245
+ if tester && tester.respond_to?(:log_file_written)
246
+ tester.log_file_written @job_file_path
247
+ else
248
+ Origen.log.info "Log file written to: #{@job_file_path}"
249
+ end
250
+ flush
251
+ close_log(@job_file)
197
252
  @job_file = nil
198
253
  end
199
254
  end
@@ -218,6 +273,24 @@ module Origen
218
273
 
219
274
  private
220
275
 
276
+ def intercept(msg, type, options, &block)
277
+ if @interceptors.size > 0
278
+ call_interceptor(@interceptors.values, msg, type, options, &block)
279
+ else
280
+ yield(msg, type, options)
281
+ end
282
+ end
283
+
284
+ def call_interceptor(interceptors, msg, type, options, &original)
285
+ interceptor = interceptors.shift
286
+ if interceptors.empty?
287
+ func = -> (msg, type, options) { original.call(msg, type, options) }
288
+ else
289
+ func = -> (msg, type, options) { call_interceptor(interceptors, msg, type, options, &original) }
290
+ end
291
+ interceptor.call(msg, type, options, func)
292
+ end
293
+
221
294
  def sanitize_args(*args)
222
295
  message = ''
223
296
  options = {}
@@ -266,13 +339,25 @@ module Origen
266
339
  end
267
340
 
268
341
  def open_log(file)
342
+ @open_logs ||= {}
343
+ unless file.class == IO
344
+ file = File.open(file, 'w+')
345
+ end
269
346
  l = Logger.new(file)
270
347
  l.formatter = proc do |severity, dateime, progname, msg|
271
348
  msg
272
349
  end
350
+ @open_logs[l] = file
273
351
  l
274
352
  end
275
353
 
354
+ def close_log(logger)
355
+ if logger
356
+ @open_logs.delete(logger)
357
+ logger.close
358
+ end
359
+ end
360
+
276
361
  def relog(msg)
277
362
  if msg =~ /^\[(\w+)\] .*/
278
363
  method = Regexp.last_match(1).downcase
@@ -56,6 +56,14 @@ module Origen
56
56
  attr_accessor :description
57
57
  attr_accessor :notes
58
58
 
59
+ # Returns a hash containing any meta data associated with the current pin state
60
+ #
61
+ # my_pin.read!(1, meta: { position: 10 })
62
+ # my_pin.state_meta # => { position: 10 }
63
+ # my_pin.dont_care
64
+ # my_pin.state_meta # => {}
65
+ attr_reader :state_meta
66
+
59
67
  # Should be instantiated through the HasPins macros
60
68
  def initialize(id, owner, options = {}) # :nodoc:
61
69
  options = {
@@ -89,6 +97,7 @@ module Origen
89
97
  @clock = nil
90
98
  @meta = options[:meta] || {}
91
99
  @dib_meta = options[:dib_meta] || {}
100
+ @state_meta = {}
92
101
  @_saved_state = []
93
102
  @_saved_value = []
94
103
  @_saved_suspend = []
@@ -638,6 +647,11 @@ module Origen
638
647
  @repeat_previous
639
648
  end
640
649
 
650
+ def set_state_with_options(state, options = {})
651
+ @state_meta = options[:meta] || {}
652
+ set_state(state)
653
+ end
654
+
641
655
  def set_state(state)
642
656
  invalidate_vector_cache
643
657
  @repeat_previous = false
@@ -690,76 +704,77 @@ module Origen
690
704
 
691
705
  def state=(value)
692
706
  invalidate_vector_cache
707
+ @state_meta = {}
693
708
  @state = value
694
709
  end
695
710
 
696
711
  # Set the pin to drive a 1 on future cycles
697
- def drive_hi
698
- set_state(:drive)
712
+ def drive_hi(options = {})
713
+ set_state_with_options(:drive, options)
699
714
  set_value(1)
700
715
  end
701
716
  alias_method :write_hi, :drive_hi
702
717
 
703
- def drive_hi!
704
- drive_hi
718
+ def drive_hi!(options = {})
719
+ drive_hi(options)
705
720
  cycle
706
721
  end
707
722
  alias_method :write_hi!, :drive_hi!
708
723
 
709
724
  # Set the pin to drive a high voltage on future cycles (if the tester supports it).
710
725
  # For example on a J750 high-voltage channel the pin state would be set to "2"
711
- def drive_very_hi
712
- set_state(:drive_very_hi)
726
+ def drive_very_hi(options = {})
727
+ set_state_with_options(:drive_very_hi, options)
713
728
  set_value(1)
714
729
  end
715
730
 
716
- def drive_very_hi!
717
- drive_very_hi
731
+ def drive_very_hi!(options = {})
732
+ drive_very_hi(options)
718
733
  cycle
719
734
  end
720
735
 
721
736
  # Set the pin to drive a 0 on future cycles
722
- def drive_lo
723
- set_state(:drive)
737
+ def drive_lo(options = {})
738
+ set_state_with_options(:drive, options)
724
739
  set_value(0)
725
740
  end
726
741
  alias_method :write_lo, :drive_lo
727
742
 
728
- def drive_lo!
729
- drive_lo
743
+ def drive_lo!(options = {})
744
+ drive_lo(options)
730
745
  cycle
731
746
  end
732
747
  alias_method :write_lo!, :drive_lo!
733
748
 
734
- def drive_mem
735
- set_state(:drive_mem)
749
+ def drive_mem(options = {})
750
+ set_state_with_options(:drive_mem, options)
736
751
  end
737
752
 
738
- def drive_mem!
739
- drive_mem
753
+ def drive_mem!(options = {})
754
+ drive_mem(options)
740
755
  cycle
741
756
  end
742
757
 
743
- def expect_mem
744
- set_state(:expect_mem)
758
+ def expect_mem(options = {})
759
+ set_state_with_options(:expect_mem, options)
745
760
  end
746
761
 
747
- def expect_mem!
748
- expect_mem
762
+ def expect_mem!(options = {})
763
+ expect_mem(options)
749
764
  cycle
750
765
  end
751
766
 
752
767
  # Set the pin to expect a 1 on future cycles
753
- def assert_hi(_options = {})
754
- set_state(:compare)
768
+ def assert_hi(options = {})
769
+ set_state_with_options(:compare, options)
755
770
  set_value(1)
756
771
  end
757
772
  alias_method :expect_hi, :assert_hi
758
773
  alias_method :compare_hi, :assert_hi
759
774
  alias_method :read_hi, :assert_hi
760
775
 
761
- def assert_hi!
762
- assert_hi
776
+ def assert_hi!(options = {})
777
+ assert_hi(options)
763
778
  cycle
764
779
  end
765
780
  alias_method :expect_hi!, :assert_hi!
@@ -767,8 +782,8 @@ module Origen
767
782
  alias_method :read_hi!, :assert_hi!
768
783
 
769
784
  # Set the pin to expect a 0 on future cycles
770
- def assert_lo(_options = {})
771
- set_state(:compare)
785
+ def assert_lo(options = {})
786
+ set_state_with_options(:compare, options)
772
787
  set_value(0)
773
788
  # Planning to add the active load logic to the tester instead...
774
789
  # options = { :active => false #if active true means to take tester active load capability into account
@@ -783,8 +798,8 @@ module Origen
783
798
  alias_method :compare_lo, :assert_lo
784
799
  alias_method :read_lo, :assert_lo
785
800
 
786
- def assert_lo!
787
- assert_lo
801
+ def assert_lo!(options = {})
802
+ assert_lo(options)
788
803
  cycle
789
804
  end
790
805
  alias_method :expect_lo!, :assert_lo!
@@ -792,12 +807,12 @@ module Origen
792
807
  alias_method :read_lo!, :assert_lo!
793
808
 
794
809
  # Set the pin to X on future cycles
795
- def dont_care
796
- set_state(:dont_care)
810
+ def dont_care(options = {})
811
+ set_state_with_options(:dont_care, options)
797
812
  end
798
813
 
799
- def dont_care!
800
- dont_care
814
+ def dont_care!(options = {})
815
+ dont_care(options)
801
816
  cycle
802
817
  end
803
818
 
@@ -807,14 +822,14 @@ module Origen
807
822
  # [0,1,1,0].each do |level|
808
823
  # $pin(:d_in).drive(level)
809
824
  # end
810
- def drive(value)
811
- set_state(:drive)
825
+ def drive(value, options = {})
826
+ set_state_with_options(:drive, options)
812
827
  set_value(value)
813
828
  end
814
829
  alias_method :write, :drive
815
830
 
816
- def drive!(value)
817
- drive(value)
831
+ def drive!(value, options = {})
832
+ drive(value, options)
818
833
  cycle
819
834
  end
820
835
  alias_method :write!, :drive!
@@ -825,8 +840,8 @@ module Origen
825
840
  # [0,1,1,0].each do |level|
826
841
  # $pin(:d_in).assert(level)
827
842
  # end
828
- def assert(value, _options = {})
829
- set_state(:compare)
843
+ def assert(value, options = {})
844
+ set_state_with_options(:compare, options)
830
845
  set_value(value)
831
846
  end
832
847
  alias_method :compare, :assert
@@ -841,15 +856,15 @@ module Origen
841
856
  alias_method :expect!, :assert!
842
857
  alias_method :read!, :assert!
843
858
 
844
- def assert_midband
845
- set_state(:compare_midband)
859
+ def assert_midband(options = {})
860
+ set_state_with_options(:compare_midband, options)
846
861
  end
847
862
  alias_method :compare_midband, :assert_midband
848
863
  alias_method :expect_midband, :assert_midband
849
864
  alias_method :read_midband, :assert_midband
850
865
 
851
- def assert_midband!
852
- assert_midband
866
+ def assert_midband!(options = {})
867
+ assert_midband(options)
853
868
  cycle
854
869
  end
855
870
  alias_method :compare_midband!, :assert_midband!
@@ -909,14 +924,14 @@ module Origen
909
924
  end
910
925
 
911
926
  # Mark the (data) from the pin to be captured
912
- def capture
913
- set_state(:capture)
927
+ def capture(options = {})
928
+ set_state_with_options(:capture, options)
914
929
  end
915
930
  alias_method :store, :capture
916
931
 
917
932
  # Mark the (data) from the pin to be captured and trigger a cycle
918
- def capture!
919
- capture
933
+ def capture!(options = {})
934
+ capture(options)
920
935
  cycle
921
936
  end
922
937
  alias_method :store!, :capture!
@@ -919,7 +919,7 @@ module Origen
919
919
  else
920
920
  fail "Unknown operation (#{operation}), must be :read or :write"
921
921
  end
922
- make_hex_like(str, size / 4)
922
+ make_hex_like(str, (size / 4.0).ceil)
923
923
  end
924
924
 
925
925
  # Shifts the data in the collection left by one place. The data held
@@ -972,11 +972,11 @@ module Origen
972
972
 
973
973
  # Converts a binary-like representation of a data value into a hex-like version.
974
974
  # e.g. input => 010S0011SSSS0110 (where S, X or V represent store, don't care or overlay)
975
- # output => (010s)3S6 (i.e. nibbles that are not all of the same type are expanded)
975
+ # output => [010s]3S6 (i.e. nibbles that are not all of the same type are expanded)
976
976
  def make_hex_like(regval, size_in_nibbles)
977
977
  outstr = ''
978
- regex = '^'
979
- size_in_nibbles.times { regex += '(....)' }
978
+ regex = '^(.?.?.?.)'
979
+ (size_in_nibbles - 1).times { regex += '(....)' }
980
980
  regex += '$'
981
981
  Regexp.new(regex) =~ regval
982
982
 
@@ -993,7 +993,7 @@ module Origen
993
993
  outstr += nibble[0, 1] # .to_s
994
994
  # Otherwise present this nibble in 'binary' format
995
995
  else
996
- outstr += "(#{nibble.downcase})"
996
+ outstr += "[#{nibble.downcase}]"
997
997
  end
998
998
  # Otherwise if all 1s and 0s...
999
999
  else
@@ -796,7 +796,13 @@ module Origen
796
796
  object = writer
797
797
  (Origen.top_level || owner).write_register_missing!(self) unless object
798
798
  end
799
- object.send(operation, self, options)
799
+ if tester && tester.respond_to?(operation)
800
+ tester.send(operation, self, options) do
801
+ object.send(operation, self, options)
802
+ end
803
+ else
804
+ object.send(operation, self, options)
805
+ end
800
806
  self
801
807
  end
802
808
 
@@ -8,7 +8,7 @@ Gem::Specification.new do |s|
8
8
  s.required_rubygems_version = Gem::Requirement.new(">= 1.8.11".freeze) if s.respond_to? :required_rubygems_version=
9
9
  s.require_paths = ["lib".freeze]
10
10
  s.authors = ["Stephen McGinty".freeze]
11
- s.date = "2019-02-15"
11
+ s.date = "2018-12-19"
12
12
  s.email = ["stephen.f.mcginty@gmail.com".freeze]
13
13
  s.files = ["bin/boot.rb".freeze, "bin/fix_my_workspace".freeze, "config/application.rb".freeze, "config/boot.rb".freeze, "config/commands.rb".freeze, "config/shared_commands.rb".freeze, "config/version.rb".freeze, "lib/origen_app_generators.rb".freeze, "lib/origen_app_generators/application.rb".freeze, "lib/origen_app_generators/base.rb".freeze, "lib/origen_app_generators/empty_application.rb".freeze, "lib/origen_app_generators/empty_plugin.rb".freeze, "lib/origen_app_generators/new.rb".freeze, "lib/origen_app_generators/origen_infrastructure/app_generator_plugin.rb".freeze, "lib/origen_app_generators/plugin.rb".freeze, "lib/origen_app_generators/sub_block_parser.rb".freeze, "lib/origen_app_generators/test_engineering/stand_alone_application.rb".freeze, "lib/origen_app_generators/test_engineering/test_block.rb".freeze, "lib/tasks/app_generators.rake".freeze, "lib/tasks/new_app_tests.rake".freeze, "templates/app_generators".freeze, "templates/app_generators/application".freeze, "templates/app_generators/application/.gitignore".freeze, "templates/app_generators/application/.irbrc".freeze, "templates/app_generators/application/.rspec".freeze, "templates/app_generators/application/.travis.yml".freeze, "templates/app_generators/application/Gemfile".freeze, "templates/app_generators/application/Rakefile".freeze, "templates/app_generators/application/config".freeze, "templates/app_generators/application/config/application.rb".freeze, "templates/app_generators/application/config/boot.rb".freeze, "templates/app_generators/application/config/commands.rb".freeze, "templates/app_generators/application/config/maillist_dev.txt".freeze, "templates/app_generators/application/config/maillist_prod.txt".freeze, "templates/app_generators/application/config/version.rb".freeze, "templates/app_generators/application/doc".freeze, "templates/app_generators/application/doc/history".freeze, "templates/app_generators/application/dot_keep".freeze, "templates/app_generators/application/lib".freeze, "templates/app_generators/application/lib/app.rake".freeze, "templates/app_generators/application/lib/module.rb".freeze, "templates/app_generators/application/lib/top_level.rb".freeze, "templates/app_generators/application/origen_core_session".freeze, "templates/app_generators/application/spec".freeze, "templates/app_generators/application/spec/spec_helper.rb".freeze, "templates/app_generators/application/target".freeze, "templates/app_generators/application/target/debug.rb".freeze, "templates/app_generators/application/target/default.rb".freeze, "templates/app_generators/application/target/production.rb".freeze, "templates/app_generators/application/templates".freeze, "templates/app_generators/application/templates/web".freeze, "templates/app_generators/application/templates/web/index.md.erb".freeze, "templates/app_generators/application/templates/web/layouts".freeze, "templates/app_generators/application/templates/web/layouts/_basic.html.erb".freeze, "templates/app_generators/application/templates/web/partials".freeze, "templates/app_generators/application/templates/web/partials/_navbar.html.erb".freeze, "templates/app_generators/application/templates/web/release_notes.md.erb".freeze, "templates/app_generators/new".freeze, "templates/app_generators/new/generator.rb".freeze, "templates/app_generators/new/info.md.erb".freeze, "templates/app_generators/origen_infrastructure".freeze, "templates/app_generators/origen_infrastructure/app_generator_plugin".freeze, "templates/app_generators/origen_infrastructure/app_generator_plugin/config".freeze, "templates/app_generators/origen_infrastructure/app_generator_plugin/config/load_generators.rb".freeze, "templates/app_generators/origen_infrastructure/app_generator_plugin/lib".freeze, "templates/app_generators/origen_infrastructure/app_generator_plugin/lib/application.rb".freeze, "templates/app_generators/origen_infrastructure/app_generator_plugin/lib/base.rb".freeze, "templates/app_generators/origen_infrastructure/app_generator_plugin/lib/module.rb".freeze, "templates/app_generators/origen_infrastructure/app_generator_plugin/lib/plugin.rb".freeze, "templates/app_generators/plugin".freeze, "templates/app_generators/plugin/Gemfile".freeze, "templates/app_generators/plugin/Rakefile".freeze, "templates/app_generators/plugin/config".freeze, "templates/app_generators/plugin/config/boot.rb".freeze, "templates/app_generators/plugin/gemspec.rb".freeze, "templates/app_generators/plugin/lib".freeze, "templates/app_generators/plugin/lib/README".freeze, "templates/app_generators/plugin/lib_dev".freeze, "templates/app_generators/plugin/lib_dev/README".freeze, "templates/app_generators/plugin/templates".freeze, "templates/app_generators/plugin/templates/web".freeze, "templates/app_generators/plugin/templates/web/index.md.erb".freeze, "templates/app_generators/plugin/templates/web/partials".freeze, "templates/app_generators/plugin/templates/web/partials/_navbar_external.html.erb".freeze, "templates/app_generators/plugin/templates/web/partials/_navbar_internal.html.erb".freeze, "templates/app_generators/test_engineering".freeze, "templates/app_generators/test_engineering/stand_alone_application".freeze, "templates/app_generators/test_engineering/stand_alone_application/Gemfile".freeze, "templates/app_generators/test_engineering/stand_alone_application/environment".freeze, "templates/app_generators/test_engineering/stand_alone_application/environment/j750.rb".freeze, "templates/app_generators/test_engineering/stand_alone_application/environment/jlink.rb".freeze, "templates/app_generators/test_engineering/stand_alone_application/environment/uflex.rb".freeze, "templates/app_generators/test_engineering/stand_alone_application/environment/v93k.rb".freeze, "templates/app_generators/test_engineering/stand_alone_application/lib".freeze, "templates/app_generators/test_engineering/stand_alone_application/lib/ip_block.rb".freeze, "templates/app_generators/test_engineering/stand_alone_application/lib/ip_block_controller.rb".freeze, "templates/app_generators/test_engineering/stand_alone_application/lib/top_level.rb".freeze, "templates/app_generators/test_engineering/stand_alone_application/lib/top_level_controller.rb".freeze, "templates/app_generators/test_engineering/stand_alone_application/pattern".freeze, "templates/app_generators/test_engineering/stand_alone_application/pattern/example.rb".freeze, "templates/app_generators/test_engineering/stand_alone_application/target".freeze, "templates/app_generators/test_engineering/stand_alone_application/target/top_level.rb".freeze, "templates/app_generators/test_engineering/test_block".freeze, "templates/app_generators/test_engineering/test_block/environment".freeze, "templates/app_generators/test_engineering/test_block/environment/j750.rb".freeze, "templates/app_generators/test_engineering/test_block/environment/ultraflex.rb".freeze, "templates/app_generators/test_engineering/test_block/environment/v93k.rb".freeze, "templates/app_generators/test_engineering/test_block/lib".freeze, "templates/app_generators/test_engineering/test_block/lib/controller.rb".freeze, "templates/app_generators/test_engineering/test_block/lib/interface.rb".freeze, "templates/app_generators/test_engineering/test_block/lib/model.rb".freeze, "templates/app_generators/test_engineering/test_block/lib_dev".freeze, "templates/app_generators/test_engineering/test_block/lib_dev/dut.rb".freeze, "templates/app_generators/test_engineering/test_block/lib_dev/dut_controller.rb".freeze, "templates/app_generators/test_engineering/test_block/pattern".freeze, "templates/app_generators/test_engineering/test_block/pattern/example.rb".freeze, "templates/app_generators/test_engineering/test_block/program".freeze, "templates/app_generators/test_engineering/test_block/program/prb1.rb".freeze, "templates/app_generators/test_engineering/test_block/target".freeze, "templates/app_generators/test_engineering/test_block/target/default.rb".freeze]
14
14
  s.homepage = "http://origen-sdk.org/origen_app_generators".freeze
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: origen
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.42.2
4
+ version: 0.43.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: 2019-03-01 00:00:00.000000000 Z
11
+ date: 2019-03-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport