Class: Origen::Pins::Pin

Inherits:
Object show all
Includes:
PinCommon
Defined in:
lib/origen/pins/pin.rb

Direct Known Subclasses

GroundPin, PowerPin

Constant Summary collapse

FUNCTION_SCOPED_ATTRIBUTES =

Any attributes listed here will be looked up for the current function defined by the current mode and configuration context before falling back to a default

[:name, :direction, :option, :group, :ip_block, :meta]
PACKAGE_SCOPED_ATTRIBUTES =

Any attributes listed here will be looked up for the current package context before falling back to a default

[:location, :dib_assignment]
TYPES =

Pin Types

[:analog, :digital]

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from PinCommon

#add_configuration, #add_mode, #add_package, #enabled?, #enabled_in_configuration?, #enabled_in_mode?, #enabled_in_package?, #finalize, #id=, #to_sym

Constructor Details

#initialize(id, owner, options = {}) ⇒ Pin

Should be instantiated through the HasPins macros



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/origen/pins/pin.rb', line 43

def initialize(id, owner, options = {}) # :nodoc:
  options = {
    reset:        :dont_care,
    invert:       false,
    direction:    :io,
    open_drain:   false,
    ext_pullup:   false,
    ext_pulldown: false,
    rtl_name:     nil
  }.merge(options)
  @aliases = {}
  @functions = {}
  @direction = sanitize_direction(options[:direction])
  @invert = options[:invert]
  @reset = options[:reset]
  @id = id
  @name = options[:name]
  @rtl_name = options[:rtl_name]
  @suspend = false
  @order = options[:order]
  @supply = options[:supply]
  @open_drain = options[:open_drain]
  @ext_pullup = options[:ext_pullup]
  @ext_pulldown = options[:ext_pulldown]
  @type = options[:type]
  @dib_assignment = [] # Array to handle multi-site testing
  @size = 1
  @value = 0
  @clock = nil
  on_init(owner, options)
  # Assign the initial state from the method so that any inversion is picked up...
  send(@reset)
end

Instance Attribute Details

#aliasesObject (readonly)

Returns a hash containing the aliases associated with the given pin



26
27
28
# File 'lib/origen/pins/pin.rb', line 26

def aliases
  @aliases
end

#ext_pulldownObject

Boolean on whether pin has external pull-down



36
37
38
# File 'lib/origen/pins/pin.rb', line 36

def ext_pulldown
  @ext_pulldown
end

#ext_pullupObject

Boolean on whether pin has external pull-up



34
35
36
# File 'lib/origen/pins/pin.rb', line 34

def ext_pullup
  @ext_pullup
end

#functionsObject

Returns a hash containing the functions associated with the given pin



28
29
30
# File 'lib/origen/pins/pin.rb', line 28

def functions
  @functions
end

#invertObject

Inverts pin states for drive and compare, can be useful if a timing set change requires clocks to drive low for example when all pattern logic has been set up to drive them high.



19
20
21
# File 'lib/origen/pins/pin.rb', line 19

def invert
  @invert
end

#open_drainObject

Boolean on whether pin is open drain



32
33
34
# File 'lib/origen/pins/pin.rb', line 32

def open_drain
  @open_drain
end

#orderObject

Returns the value of attribute order.



17
18
19
# File 'lib/origen/pins/pin.rb', line 17

def order
  @order
end

#ownerObject (readonly)

Returns the value of attribute owner.



23
24
25
# File 'lib/origen/pins/pin.rb', line 23

def owner
  @owner
end

#repeat_previousObject

Attribute used to generate vectors where the pin state is assigned the repeat_previous opcode, used by Tester#repeat_previous



22
23
24
# File 'lib/origen/pins/pin.rb', line 22

def repeat_previous
  @repeat_previous
end

#rtl_nameObject

Pin RTL name, short term solution for products that do not get full HDL path for pins



40
41
42
# File 'lib/origen/pins/pin.rb', line 40

def rtl_name
  @rtl_name
end

#sizeObject (readonly)

Returns the value of attribute size.



24
25
26
# File 'lib/origen/pins/pin.rb', line 24

def size
  @size
end

#supplyObject

Internal power supply pin is connected to



30
31
32
# File 'lib/origen/pins/pin.rb', line 30

def supply
  @supply
end

#typeObject

Pin type, either :analog or :digital



38
39
40
# File 'lib/origen/pins/pin.rb', line 38

def type
  @type
end

Instance Method Details

#<=>(other_pin) ⇒ Object

When sorting pins do it by ID



78
79
80
# File 'lib/origen/pins/pin.rb', line 78

def <=>(other_pin)
  @id <=> other_pin.id
end

#add_alias(id, options = {}) ⇒ Object

Add an alias to the given pin.

If the options contain a package, mode or configuration reference then the alias will only work under that context.



400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
# File 'lib/origen/pins/pin.rb', line 400

def add_alias(id, options = {})
  obj = options.delete(:obj) || self
  if aliases[id]
    aliases[id][:packages] += resolve_packages(options)
    aliases[id][:modes] += resolve_modes(options)
    aliases[id][:configurations] += resolve_configurations(options)
    aliases[id][:packages].uniq!
    aliases[id][:modes].uniq!
    aliases[id][:configurations].uniq!
  else
    aliases[id] = {
      packages:       resolve_packages(options),
      modes:          resolve_modes(options),
      configurations: resolve_configurations(options)
    }
    Origen.pin_bank.register_alias(id, obj, options)
  end
end

#add_dib_assignment(str, options = {}) ⇒ Object Also known as: add_dib_info, add_channel

Add a Device Interface Board (e.g. probecard at wafer probe or loadboard at final package test) assignment to the pin. Some refer to this as a channel but API name is meant to be generic.



304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
# File 'lib/origen/pins/pin.rb', line 304

def add_dib_assignment(str, options = {})
  options = {
    site: 0
  }.merge(options)
  packages = resolve_packages(options)
  if packages.empty?
    @dib_assignment[options[:site]] = str
    add_alias str.to_s.symbolize, package: :all, mode: :all, configuration: :all
  else
    packages.each do |package_id|
      package_id = package_id.respond_to?(:id) ? package_id.id : package_id
      self.packages[package_id] ||= {}
      self.packages[package_id][:dib_assignment] ||= []
      self.packages[package_id][:dib_assignment][options[:site]] = str
      add_alias str.to_s.symbolize, package: package_id, mode: :all, configuration: :all
    end
  end
end

#add_function(id, options = {}) ⇒ Object

Add a function to the pin.

Examples:

Adding a mode-specific function

pin.add_function :tdi, :direction => :input
pin.add_function :nvm_fail, :mode => :nvmbist, :direction => :output


356
357
358
359
360
361
# File 'lib/origen/pins/pin.rb', line 356

def add_function(id, options = {})
  id = id.to_sym
  add_function_attributes(options.merge(name: id, id: id.to_sym))
  f = FunctionProxy.new(id, self)
  add_alias id, packages: :all, obj: f
end

#add_function_attributes(options = {}) ⇒ Object



363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
# File 'lib/origen/pins/pin.rb', line 363

def add_function_attributes(options = {})
  id = options.delete(:id)
  modes = resolve_modes(options)
  configurations = resolve_configurations(options)
  options[:direction] = sanitize_direction(options[:direction]) if options[:direction]
  if modes.empty?
    modes = [:all]
  end
  if configurations.empty?
    configurations = [:all]
  end
  # Supports newer attribute lookup by function ID
  if id
    functions[:ids] ||= {}
    if functions[:ids][id]
      functions[:ids][id] = functions[:ids][id].merge!(options)
    else
      functions[:ids][id] = options.dup
    end
  end
  # Supports older attribute lookup by mode context
  modes.each do |mode|
    configurations.each do |configuration|
      functions[mode.to_sym] ||= {}
      if functions[mode.to_sym][configuration.to_sym]
        functions[mode.to_sym][configuration.to_sym] = functions[mode.to_sym][configuration.to_sym].merge!(options)
      else
        functions[mode.to_sym][configuration.to_sym] = options
      end
    end
  end
end

#add_location(str, options = {}) ⇒ Object Also known as: add_locn

Add a location identifier to the pin, this is a free format field which can be a pin number or BGA co-ordinate for example.

Examples:

Adding a location by package

$dut.pin(:pin3).add_location "B3", :package => :p1
$dut.pin(:pin3).add_location "B2", :package => :p2


286
287
288
289
290
291
292
293
294
295
296
297
298
299
# File 'lib/origen/pins/pin.rb', line 286

def add_location(str, options = {})
  packages = resolve_packages(options)
  if packages.empty?
    @location = str
    add_alias str.to_s.symbolize, package: :all, mode: :all, configuration: :all
  else
    packages.each do |package_id|
      package_id = package_id.respond_to?(:id) ? package_id.id : package_id
      self.packages[package_id] ||= {}
      self.packages[package_id][:location] = str
      add_alias str.to_s.symbolize, package: package_id, mode: :all, configuration: :all
    end
  end
end

#assert(value, _options = {}) ⇒ Object Also known as: compare, expect

Pass in 0 or 1 to have the pin expect_lo or expect_hi respectively. This is useful when programatically setting the pin state.

Example

[0,1,1,0].each do |level|
    $pin(:d_in).assert(level)
end


653
654
655
656
# File 'lib/origen/pins/pin.rb', line 653

def assert(value, _options = {})
  set_state(:compare)
  set_value(value)
end

#assert!(*args) ⇒ Object Also known as: compare!, expect!



660
661
662
663
# File 'lib/origen/pins/pin.rb', line 660

def assert!(*args)
  assert(*args)
  cycle
end

#assert_hi(_options = {}) ⇒ Object Also known as: expect_hi, compare_hi

Set the pin to expect a 1 on future cycles



584
585
586
587
# File 'lib/origen/pins/pin.rb', line 584

def assert_hi(_options = {})
  set_state(:compare)
  set_value(1)
end

#assert_hi!Object Also known as: expect_hi!, compare_hi!



591
592
593
594
# File 'lib/origen/pins/pin.rb', line 591

def assert_hi!
  assert_hi
  cycle
end

#assert_lo(_options = {}) ⇒ Object Also known as: expect_lo, compare_lo

Set the pin to expect a 0 on future cycles



599
600
601
602
603
604
605
606
607
608
609
610
# File 'lib/origen/pins/pin.rb', line 599

def assert_lo(_options = {})
  set_state(:compare)
  set_value(0)
  # Planning to add the active load logic to the tester instead...
  # options = { :active => false    #if active true means to take tester active load capability into account
  #          }.merge(options)
  # unless state_to_be_inverted?
  #  self.state = ($tester.active_loads || !options[:active]) ? $tester.pin_state(:expect_lo) : $tester.pin_state(:dont_care)
  # else
  #  self.state = ($tester.active_loads || !options[:active]) ? $tester.pin_state(:expect_hi) : $tester.pin_state(:dont_care)
  # end
end

#assert_lo!Object Also known as: expect_lo!, compare_lo!



614
615
616
617
# File 'lib/origen/pins/pin.rb', line 614

def assert_lo!
  assert_lo
  cycle
end

#assert_midbandObject Also known as: compare_midband, expect_midband



667
668
669
# File 'lib/origen/pins/pin.rb', line 667

def assert_midband
  set_state(:compare_midband)
end

#assert_midband!Object Also known as: compare_midband!, expect_midband!



673
674
675
676
# File 'lib/origen/pins/pin.rb', line 673

def assert_midband!
  assert_midband
  cycle
end

#belongs_to_a_pin_group?Boolean

Returns true if the pin belongs to a pin group.

add_pins :jtag, size: 6
add_pin  :done
add_pin_alias :fail, :jtag, pin: 4

pin(:done).belongs_to_a_pin_group?  # => false
pin(:fail).belongs_to_a_pin_group?  # => true

Returns:

  • (Boolean)


461
462
463
# File 'lib/origen/pins/pin.rb', line 461

def belongs_to_a_pin_group?
  !groups.empty?
end

#captureObject Also known as: store

Mark the (data) from the pin to be captured



733
734
735
# File 'lib/origen/pins/pin.rb', line 733

def capture
  set_state(:capture)
end

#capture!Object Also known as: store!

Mark the (data) from the pin to be captured and trigger a cycle



739
740
741
742
# File 'lib/origen/pins/pin.rb', line 739

def capture!
  capture
  cycle
end

#comparing?Boolean

Returns true if the pin is currently in a compare state

Returns:

  • (Boolean)


686
687
688
689
# File 'lib/origen/pins/pin.rb', line 686

def comparing?
  !@suspend &&
    state == :compare
end

#comparing_mem?Boolean

Returns true if the pin is currently in a compare mem state

Returns:

  • (Boolean)


692
693
694
695
# File 'lib/origen/pins/pin.rb', line 692

def comparing_mem?
  !@suspend &&
    state == :expect_mem
end

#comparing_midband?Boolean

Returns true if the pin is currently in a compare state

Returns:

  • (Boolean)


698
699
700
701
# File 'lib/origen/pins/pin.rb', line 698

def comparing_midband?
  !@suspend &&
    state == :compare_midband
end

#cycleObject

:nodoc:



518
519
520
# File 'lib/origen/pins/pin.rb', line 518

def cycle # :nodoc:
  Origen.tester.cycle
end

#delete!Object

Delete this pin (self). Used bang in method name to keep same for pins and pin collections. Pin collections already had a delete method which deletes a pin from the collection. Needed delete! to indicate it is deleting the actual pin or pin group calling the method.



838
839
840
# File 'lib/origen/pins/pin.rb', line 838

def delete!
  owner.delete_pin(self)
end

#describe(options = {}) ⇒ Object



192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
# File 'lib/origen/pins/pin.rb', line 192

def describe(options = {})
  desc = ['********************']
  desc << "Pin id: #{id}"
  func_aliases = []
  unless functions.empty?
    desc << ''
    desc << 'Functions'
    desc << '---------'
    functions.each do |mode, configurations|
      unless mode == :ids
        configurations.each do |configuration, attrs|
          a = ":#{attrs[:name]}".ljust(30)
          func_aliases << attrs[:name]
          unless mode == :all
            a += ":modes => [#{[mode].flatten.map { |id| ':' + id.to_s }.join(', ')}]"
            prev = true
          end
          unless configuration == :all
            a += ' ; ' if prev
            a += ":configurations => [#{[configuration].flatten.map { |id| ':' + id.to_s }.join(', ')}]"
          end
          desc << a
        end
      end
    end
  end
  unless aliases.empty?
    desc << ''
    desc << 'Aliases'
    desc << '-------'
    aliases.each do |name, context|
      unless func_aliases.include?(name)
        a = ":#{name}".ljust(30)
        unless context[:packages].empty? || context[:packages] == [:all]
          a += ":packages => [#{context[:packages].map { |id| ':' + id.to_s }.join(', ')}]"
          prev = true
        end
        unless context[:modes].empty? || context[:modes] == [:all]
          a += ' ; ' if prev
          a += ":modes => [#{context[:modes].map { |id| ':' + id.to_s }.join(', ')}]"
          prev = true
        end
        unless context[:configurations].empty? || context[:configurations] == [:all]
          a += ' ; ' if prev
          a += ":configurations => [#{context[:configurations].map { |id| ':' + id.to_s }.join(', ')}]"
        end
        desc << a
      end
    end
  end
  unless Origen.top_level.modes.empty?
    desc << ''
    desc << 'Modes'
    desc << '-------'
    Origen.top_level.modes.each do |name|
      unless option(mode: name).nil?
        a = ":#{name}".ljust(30) + ":mode => #{option(mode: name)}"
        desc << a
      end
    end
  end
  unless groups.empty?
    desc << ''
    desc << 'Groups'
    desc << '------'
    desc << groups.map { |name, _group| ':' + name.to_s }.join(', ')
  end
  desc << '********************'
  if options[:return]
    desc
  else
    puts desc.join("\n")
  end
end

#direction=(val) ⇒ Object

Sets the default direction of the pin, :input, :output or :io (default). If a function specific direction has been specified that will override this value.



347
348
349
# File 'lib/origen/pins/pin.rb', line 347

def direction=(val)
  @direction = sanitize_direction(val)
end

#disable_clock(options = {}) ⇒ Object



801
802
803
804
# File 'lib/origen/pins/pin.rb', line 801

def disable_clock(options = {})
  @clock.stop_clock(options)
  @clock = nil
end

#dont_careObject

Set the pin to X on future cycles



622
623
624
# File 'lib/origen/pins/pin.rb', line 622

def dont_care
  set_state(:dont_care)
end

#dont_care!Object



626
627
628
629
# File 'lib/origen/pins/pin.rb', line 626

def dont_care!
  dont_care
  cycle
end

#drive(value) ⇒ Object

Pass in 0 or 1 to have the pin drive_lo or drive_hi respectively. This is useful when programatically setting the pin state.

Example

[0,1,1,0].each do |level|
    $pin(:d_in).drive(level)
end


637
638
639
640
# File 'lib/origen/pins/pin.rb', line 637

def drive(value)
  set_state(:drive)
  set_value(value)
end

#drive!(value) ⇒ Object



642
643
644
645
# File 'lib/origen/pins/pin.rb', line 642

def drive!(value)
  drive(value)
  cycle
end

#drive_hiObject

Set the pin to drive a 1 on future cycles



532
533
534
535
# File 'lib/origen/pins/pin.rb', line 532

def drive_hi
  set_state(:drive)
  set_value(1)
end

#drive_hi!Object



537
538
539
540
# File 'lib/origen/pins/pin.rb', line 537

def drive_hi!
  drive_hi
  cycle
end

#drive_loObject

Set the pin to drive a 0 on future cycles



555
556
557
558
# File 'lib/origen/pins/pin.rb', line 555

def drive_lo
  set_state(:drive)
  set_value(0)
end

#drive_lo!Object



560
561
562
563
# File 'lib/origen/pins/pin.rb', line 560

def drive_lo!
  drive_lo
  cycle
end

#drive_memObject



565
566
567
# File 'lib/origen/pins/pin.rb', line 565

def drive_mem
  set_state(:drive_mem)
end

#drive_mem!Object



569
570
571
572
# File 'lib/origen/pins/pin.rb', line 569

def drive_mem!
  drive_mem
  cycle
end

#drive_very_hiObject

Set the pin to drive a high voltage on future cycles (if the tester supports it). For example on a J750 high-voltage channel the pin state would be set to “2”



544
545
546
547
# File 'lib/origen/pins/pin.rb', line 544

def drive_very_hi
  set_state(:drive_very_hi)
  set_value(1)
end

#drive_very_hi!Object



549
550
551
552
# File 'lib/origen/pins/pin.rb', line 549

def drive_very_hi!
  drive_very_hi
  cycle
end

#driving?Boolean

Returns true if the pin is currently in a drive state

Returns:

  • (Boolean)


704
705
706
707
# File 'lib/origen/pins/pin.rb', line 704

def driving?
  !@suspend &&
    (state == :drive || state == :drive_very_hi)
end

#driving_mem?Boolean

Returns true if the pin is currently in a drive mem state

Returns:

  • (Boolean)


710
711
712
713
# File 'lib/origen/pins/pin.rb', line 710

def driving_mem?
  !@suspend &&
    state == :drive_mem
end

#enable_clock(options = {}) ⇒ Object



797
798
799
# File 'lib/origen/pins/pin.rb', line 797

def enable_clock(options = {})
  @clock = PinClock.new(self, options)
end

#expect_memObject



574
575
576
# File 'lib/origen/pins/pin.rb', line 574

def expect_mem
  set_state(:expect_mem)
end

#expect_mem!Object



578
579
580
581
# File 'lib/origen/pins/pin.rb', line 578

def expect_mem!
  expect_mem
  cycle
end

#function_scoped_nameObject



142
# File 'lib/origen/pins/pin.rb', line 142

alias_method :function_scoped_name, :name

#groupsObject Also known as: pin_groups

Returns a hash containing the pin groups that the given pin is a member of



268
269
270
271
272
273
# File 'lib/origen/pins/pin.rb', line 268

def groups
  # Origen.pin_bank.all_pin_groups.select do |name, group|
  @groups ||= Origen.pin_bank.pin_groups.select do |_name, group|
    group.include?(self)
  end
end

#half_periodObject



825
826
827
# File 'lib/origen/pins/pin.rb', line 825

def half_period
  @clock.cycles_per_half_period
end

#has_alias?(id, options = {}) ⇒ Boolean

Returns true if the pin has the given alias within the given or current context

Returns:

  • (Boolean)


420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
# File 'lib/origen/pins/pin.rb', line 420

def has_alias?(id, options = {})
  if aliases[id]
    if options[:ignore_context]
      true
    else
      packages = resolve_packages(options)
      modes = resolve_modes(options)
      configurations = resolve_configurations(options)
      begin
        aliases[id][:packages].include?(:all) || aliases[id][:packages].empty? ||
          packages.any? { |package| aliases[id][:packages].include?(package) }
      end && begin
        aliases[id][:modes].include?(:all) || aliases[id][:modes].empty? ||
          modes.any? { |mode| aliases[id][:modes].include?(mode) }
      end && begin
        aliases[id][:configurations].include?(:all) || aliases[id][:configurations].empty? ||
          configurations.any? { |config| aliases[id][:configurations].include?(config) }
      end
    end
  else
    false
  end
end

#high_voltage?Boolean

Returns true if pin is in high voltage state

Returns:

  • (Boolean)


716
717
718
719
# File 'lib/origen/pins/pin.rb', line 716

def high_voltage?
  !@suspend &&
    state == :drive_very_hi
end

#inspectObject



188
189
190
# File 'lib/origen/pins/pin.rb', line 188

def inspect
  "<#{self.class}:#{object_id}>"
end

#invalidate_group_cacheObject



276
277
278
# File 'lib/origen/pins/pin.rb', line 276

def invalidate_group_cache
  @groups = nil
end

#invalidate_vector_cacheObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



165
166
167
168
# File 'lib/origen/pins/pin.rb', line 165

def invalidate_vector_cache
  @vector_formatted_value = nil
  groups.each { |_name, group| group.invalidate_vector_cache }
end

#inverted?Boolean

Returns the state of invert

Returns:

  • (Boolean)


681
682
683
# File 'lib/origen/pins/pin.rb', line 681

def inverted?
  @invert
end

#is_a_clock?Boolean

Returns:

  • (Boolean)


789
790
791
# File 'lib/origen/pins/pin.rb', line 789

def is_a_clock?
  !(@clock.nil?)
end

#is_a_running_clock?Boolean

Returns:

  • (Boolean)


793
794
795
# File 'lib/origen/pins/pin.rb', line 793

def is_a_running_clock?
  @clock.running?
end

#is_alias_of?(name) ⇒ Boolean

Returns true if the pin is an alias of the given pin name

Returns:

  • (Boolean)


445
446
447
448
449
450
451
# File 'lib/origen/pins/pin.rb', line 445

def is_alias_of?(name)
  if Origen.pin_bank.find(name)
    Origen.pin_bank.find(name).id == Origen.pin_bank.find(self).id
  else
    false
  end
end

#is_not_a_clock?Boolean

Returns:

  • (Boolean)


785
786
787
# File 'lib/origen/pins/pin.rb', line 785

def is_not_a_clock?
  @clock.nil?
end

#name(options = {}) ⇒ Object

Returns the name of the pin, if a name has been specifically assigned by the application (via name=) then this will be returned, otherwise the name of the current function if present will be returned, and then as a last resort the ID of the pin



147
148
149
150
# File 'lib/origen/pins/pin.rb', line 147

def name(options = {})
  # Return a specifically assigned name in preference to a function name
  (options.empty? ? @name : nil) || function_scoped_name(options) || @id
end

#name=(val) ⇒ Object



82
83
84
# File 'lib/origen/pins/pin.rb', line 82

def name=(val)
  @name = val
end

#next_edgeObject



821
822
823
# File 'lib/origen/pins/pin.rb', line 821

def next_edge
  @clock.next_edge
end

#repeat_previous?Boolean

Returns:

  • (Boolean)


490
491
492
# File 'lib/origen/pins/pin.rb', line 490

def repeat_previous?
  @repeat_previous
end

#restoreObject

:nodoc:



776
777
778
779
780
781
782
783
# File 'lib/origen/pins/pin.rb', line 776

def restore # :nodoc:
  invalidate_vector_cache
  @state = @_saved_state
  @value = @_saved_value
  @suspend = @_saved_suspend
  @invert = @_saved_invert
  @repeat_previous = @_saved_repeat_previous
end

#restore_stateObject

Restores the state of the pin at the end of the given block to the state it was in at the start of the block

pin(:invoke).driving?  # => true
pin(:invoke).restore_state do
  pin(:invoke).dont_care
  pin(:invoke).driving?  # => false
end
pin(:invoke).driving?  # => true


762
763
764
765
766
# File 'lib/origen/pins/pin.rb', line 762

def restore_state
  save
  yield
  restore
end

#resumeObject

Will resume compares on this pin



480
481
482
483
# File 'lib/origen/pins/pin.rb', line 480

def resume
  invalidate_vector_cache
  @suspend = false
end

#sanitize_direction(val) ⇒ Object



330
331
332
333
334
335
336
337
338
339
340
341
342
343
# File 'lib/origen/pins/pin.rb', line 330

def sanitize_direction(val)
  if val
    val = val.to_s.downcase.gsub(/\//, '')
    if val =~ /i.*o/
      :io
    elsif val =~ /^i/
      :input
    elsif val =~ /^o/
      :output
    else
      fail "Unknown pin direction: #{val}"
    end
  end
end

#saveObject

:nodoc:



768
769
770
771
772
773
774
# File 'lib/origen/pins/pin.rb', line 768

def save # :nodoc:
  @_saved_state = @state
  @_saved_value = @value
  @_saved_suspend = @suspend
  @_saved_invert = @invert
  @_saved_repeat_previous = @repeat_previous
end

#set_state(state) ⇒ Object



494
495
496
497
498
# File 'lib/origen/pins/pin.rb', line 494

def set_state(state)
  invalidate_vector_cache
  @repeat_previous = false
  @state = state
end

#set_value(val) ⇒ Object Also known as: data=



500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
# File 'lib/origen/pins/pin.rb', line 500

def set_value(val)
  invalidate_vector_cache
  # If val is a data bit extract the value of it
  val = val.respond_to?(:data) ? val.data : val
  # Assume driving/asserting a nil value means 0
  val = 0 unless val
  if val > 1
    fail "Attempt to set a value of #{val} on pin #{name}"
  end
  @repeat_previous = false
  if inverted?
    @value = val == 0 ? 1 : 0
  else
    @value = val
  end
end

#sitesObject

Returns the number of test sites enabled for the pin



326
327
328
# File 'lib/origen/pins/pin.rb', line 326

def sites
  dib_assignment.size
end

#start_clock(options = {}) ⇒ Object Also known as: resume_clock



810
811
812
813
# File 'lib/origen/pins/pin.rb', line 810

def start_clock(options = {})
  enable_clock(options) if self.is_not_a_clock?
  @clock.start_clock(options)
end

#stateObject



522
523
524
# File 'lib/origen/pins/pin.rb', line 522

def state
  @state
end

#state=(value) ⇒ Object



526
527
528
529
# File 'lib/origen/pins/pin.rb', line 526

def state=(value)
  invalidate_vector_cache
  @state = value
end

#stop_clock(options = {}) ⇒ Object Also known as: pause_clock



816
817
818
# File 'lib/origen/pins/pin.rb', line 816

def stop_clock(options = {})
  @clock.stop_clock(options)
end

#suspendObject



470
471
472
473
# File 'lib/origen/pins/pin.rb', line 470

def suspend
  invalidate_vector_cache
  @suspend = true
end

#suspended?Boolean

Returns:

  • (Boolean)


475
476
477
# File 'lib/origen/pins/pin.rb', line 475

def suspended?
  @suspend
end

#to_be_captured?Boolean Also known as: to_be_stored?, is_to_be_stored?, is_to_be_captured?

Returns true if the (data) from the pin is marked to be captured

Returns:

  • (Boolean)


746
747
748
# File 'lib/origen/pins/pin.rb', line 746

def to_be_captured?
  state == :capture
end

#to_vectorObject

Returns the value held by the pin as a string formatted to the current tester’s pattern syntax

Examples:


pin.drive_hi
pin.to_vector   # => "1"
pin.expect_lo
pin.to_vector   # => "L"


160
161
162
# File 'lib/origen/pins/pin.rb', line 160

def to_vector
  @vector_formatted_value ||= Origen.tester.format_pin_state(self)
end

#toggleObject



721
722
723
724
725
# File 'lib/origen/pins/pin.rb', line 721

def toggle
  unless state == :dont_care
    set_value(value == 0 ? 1 : 0)
  end
end

#toggle!Object



727
728
729
730
# File 'lib/origen/pins/pin.rb', line 727

def toggle!
  toggle
  cycle
end

#toggle_clockObject



829
830
831
832
# File 'lib/origen/pins/pin.rb', line 829

def toggle_clock
  fail "ERROR: Clock on #{@owner.name} not running." unless is_a_running_clock?
  @clock.toggle
end

#update_clockObject



806
807
808
# File 'lib/origen/pins/pin.rb', line 806

def update_clock
  @clock.update_clock
end

#valueObject Also known as: data



465
466
467
# File 'lib/origen/pins/pin.rb', line 465

def value
  @value
end

#vector_formatted_value=(val) ⇒ Object

Set the pin value and state from a string formatted to the current tester’s pattern syntax, this is the opposite of the to_vector method

Examples:


pin.vector_formatted_value = "L"
pin.driving?                      # => false
pin.value                         # => 0
pin.vector_formatted_value = "1"
pin.driving?                      # => true
pin.value                         # => 1


181
182
183
184
185
186
# File 'lib/origen/pins/pin.rb', line 181

def vector_formatted_value=(val)
  unless @vector_formatted_value == val
    Origen.tester.update_pin_from_formatted_state(self, val)
    @vector_formatted_value = val
  end
end