origen 0.5.7 → 0.5.8
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 +4 -4
- data/config/version.rb +1 -1
- data/helpers/guides.rb +1 -0
- data/lib/origen.rb +4 -0
- data/lib/origen/commands.rb +5 -0
- data/lib/origen/core_ext/numeric.rb +4 -0
- data/lib/origen/core_ext/range.rb +9 -0
- data/lib/origen/core_ext/string.rb +2 -1
- data/lib/origen/global_methods.rb +4 -0
- data/lib/origen/model.rb +28 -0
- data/lib/origen/model_initializer.rb +4 -0
- data/lib/origen/models.rb +6 -0
- data/lib/origen/models/mux.rb +26 -0
- data/lib/origen/models/scan_register.rb +74 -0
- data/lib/origen/netlist.rb +24 -0
- data/lib/origen/netlist/connectable.rb +18 -0
- data/lib/origen/netlist/list.rb +152 -0
- data/lib/origen/pins.rb +0 -71
- data/lib/origen/pins/pin.rb +6 -10
- data/lib/origen/pins/pin_collection.rb +1 -1
- data/lib/origen/ports.rb +66 -0
- data/lib/origen/ports/bit_collection.rb +6 -0
- data/lib/origen/ports/port.rb +129 -0
- data/lib/origen/ports/port_collection.rb +19 -0
- data/lib/origen/ports/section.rb +116 -0
- data/lib/origen/registers.rb +7 -1
- data/lib/origen/registers/bit.rb +8 -3
- data/lib/origen/registers/bit_collection.rb +57 -2
- data/lib/origen/registers/reg.rb +2 -2
- data/lib/origen/revision_control/design_sync.rb +47 -3
- data/lib/origen/sub_blocks.rb +12 -3
- data/lib/origen/undefined.rb +13 -0
- data/templates/nanoc/layouts/bootstrap.html.erb +8 -0
- metadata +16 -5
- data/lib/origen/pins/port.rb +0 -268
data/lib/origen/registers.rb
CHANGED
@@ -311,6 +311,12 @@ module Origen
|
|
311
311
|
@new_reg_attrs = { meta: bit_info }
|
312
312
|
yield self
|
313
313
|
bit_info = @new_reg_attrs
|
314
|
+
else
|
315
|
+
# If no block given then init with all writable bits unless bit_info has
|
316
|
+
# been supplied
|
317
|
+
unless bit_info.any? { |k, v| v.is_a?(Hash) && v[:pos] }
|
318
|
+
bit_info = { d: { pos: 0, bits: size }.merge(bit_info) }
|
319
|
+
end
|
314
320
|
end
|
315
321
|
if _registers[id] && Origen.config.strict_errors
|
316
322
|
puts ''
|
@@ -472,7 +478,7 @@ module Origen
|
|
472
478
|
# Can also be used to define a new register if a block is supplied in which case
|
473
479
|
# it is equivalent to calling add_reg with a block.
|
474
480
|
def reg(*args, &block)
|
475
|
-
if block_given?
|
481
|
+
if block_given? || (args[1].is_a?(Fixnum) && !try(:initialized?))
|
476
482
|
@reg_define_file = define_file(caller[0])
|
477
483
|
add_reg(*args, &block)
|
478
484
|
else
|
data/lib/origen/registers/bit.rb
CHANGED
@@ -234,8 +234,12 @@ module Origen
|
|
234
234
|
# This does not account for any overridding that may have been applied to
|
235
235
|
# this bit specifically however, use the meta method to get that.
|
236
236
|
def default_bit_metadata
|
237
|
-
|
238
|
-
Origen::Registers.
|
237
|
+
if owner
|
238
|
+
Origen::Registers.default_bit_metadata.merge(
|
239
|
+
Origen::Registers.bit_metadata[owner.owner.class] || {})
|
240
|
+
else
|
241
|
+
Origen::Registers.default_bit_metadata
|
242
|
+
end
|
239
243
|
end
|
240
244
|
|
241
245
|
def inspect
|
@@ -440,7 +444,8 @@ module Origen
|
|
440
444
|
self
|
441
445
|
end
|
442
446
|
|
443
|
-
def respond_to?(
|
447
|
+
def respond_to?(*args) # :nodoc:
|
448
|
+
sym = args.first
|
444
449
|
meta_data_method?(sym) || super(sym)
|
445
450
|
end
|
446
451
|
|
@@ -10,6 +10,7 @@ module Origen
|
|
10
10
|
# or a group of Bit objects, the same API can be used as described below.
|
11
11
|
class BitCollection < Array
|
12
12
|
include Origen::SubBlocks::Path
|
13
|
+
include Netlist::Connectable
|
13
14
|
|
14
15
|
DONT_CARE_CHAR = 'X'
|
15
16
|
OVERLAY_CHAR = 'V'
|
@@ -26,6 +27,10 @@ module Origen
|
|
26
27
|
[data].flatten.each { |item| self << item }
|
27
28
|
end
|
28
29
|
|
30
|
+
def terminal?
|
31
|
+
true
|
32
|
+
end
|
33
|
+
|
29
34
|
def bind(live_parameter)
|
30
35
|
parent.bind(name, live_parameter)
|
31
36
|
end
|
@@ -201,7 +206,10 @@ module Origen
|
|
201
206
|
# reg(:control).data # => 0x55, assuming the reg has the required bits to store that
|
202
207
|
def data
|
203
208
|
data = 0
|
204
|
-
each_with_index
|
209
|
+
each_with_index do |bit, i|
|
210
|
+
return undefined if bit.is_a?(Origen::UndefinedClass)
|
211
|
+
data |= bit.data << i
|
212
|
+
end
|
205
213
|
data
|
206
214
|
end
|
207
215
|
alias_method :val, :data
|
@@ -540,7 +548,8 @@ module Origen
|
|
540
548
|
end
|
541
549
|
|
542
550
|
# Recognize that BitCollection responds to some Bit methods via method_missing
|
543
|
-
def respond_to?(
|
551
|
+
def respond_to?(*args) # :nodoc:
|
552
|
+
sym = args.first
|
544
553
|
first.respond_to?(sym) || super(sym)
|
545
554
|
end
|
546
555
|
|
@@ -728,6 +737,52 @@ module Origen
|
|
728
737
|
make_hex_like(str, size / 4)
|
729
738
|
end
|
730
739
|
|
740
|
+
# Shifts the data in the collection left by one place. The data held
|
741
|
+
# by the rightmost bit will be set to the given value (0 by default).
|
742
|
+
#
|
743
|
+
# @example
|
744
|
+
# myreg.data # => 0b1111
|
745
|
+
# myreg.shift_left
|
746
|
+
# myreg.data # => 0b1110
|
747
|
+
# myreg.shift_left
|
748
|
+
# myreg.data # => 0b1100
|
749
|
+
# myreg.shift_left(1)
|
750
|
+
# myreg.data # => 0b1001
|
751
|
+
# myreg.shift_left(1)
|
752
|
+
# myreg.data # => 0b0011
|
753
|
+
def shift_left(data = 0)
|
754
|
+
prev_bit = nil
|
755
|
+
reverse_each do |bit|
|
756
|
+
prev_bit.write(bit.data) if prev_bit
|
757
|
+
prev_bit = bit
|
758
|
+
end
|
759
|
+
prev_bit.write(data)
|
760
|
+
self
|
761
|
+
end
|
762
|
+
|
763
|
+
# Shifts the data in the collection right by one place. The data held
|
764
|
+
# by the leftmost bit will be set to the given value (0 by default).
|
765
|
+
#
|
766
|
+
# @example
|
767
|
+
# myreg.data # => 0b1111
|
768
|
+
# myreg.shift_right
|
769
|
+
# myreg.data # => 0b0111
|
770
|
+
# myreg.shift_right
|
771
|
+
# myreg.data # => 0b0011
|
772
|
+
# myreg.shift_right(1)
|
773
|
+
# myreg.data # => 0b1001
|
774
|
+
# myreg.shift_right(1)
|
775
|
+
# myreg.data # => 0b1100
|
776
|
+
def shift_right(data = 0)
|
777
|
+
prev_bit = nil
|
778
|
+
each do |bit|
|
779
|
+
prev_bit.write(bit.data) if prev_bit
|
780
|
+
prev_bit = bit
|
781
|
+
end
|
782
|
+
prev_bit.write(data)
|
783
|
+
self
|
784
|
+
end
|
785
|
+
|
731
786
|
private
|
732
787
|
|
733
788
|
# Converts a binary-like representation of a data value into a hex-like version.
|
data/lib/origen/registers/reg.rb
CHANGED
@@ -1122,8 +1122,8 @@ module Origen
|
|
1122
1122
|
|
1123
1123
|
# Recognize that Reg responds to all BitCollection methods methods based on
|
1124
1124
|
# application-specific meta data properties
|
1125
|
-
def respond_to?(
|
1126
|
-
sym =
|
1125
|
+
def respond_to?(*args) # :nodoc:
|
1126
|
+
sym = args.first.to_sym
|
1127
1127
|
meta_data_method?(sym) || has_bits?(sym) || super(sym) || BitCollection.instance_methods.include?(sym)
|
1128
1128
|
end
|
1129
1129
|
|
@@ -35,6 +35,43 @@ module Origen
|
|
35
35
|
FileUtils.rm_rf(scratch)
|
36
36
|
end
|
37
37
|
|
38
|
+
# Import a file to the local workspace from another vault, where the first
|
39
|
+
# argument must include the full path to the requested file in the vault. You can optionally
|
40
|
+
# supply a destination for where you want the file to end up via the :local option, if no destination
|
41
|
+
# is supplied the file will end up in the PWD.
|
42
|
+
#
|
43
|
+
# This is a DesignSync only API and can be used in cases where you would to fetch a file
|
44
|
+
# directly from a vault without setting up an association between a local directory and the
|
45
|
+
# vault. i.e. it will not create or modify an existing .SYNC in the local destination directory.
|
46
|
+
#
|
47
|
+
# ==== Example
|
48
|
+
#
|
49
|
+
# # Import this file and save it in RGen.root
|
50
|
+
# file = "sync://sync-15088:15088/Projects/common_tester_blocks/rgen/lib/sys/design_sync.rb"
|
51
|
+
# version = "v0.1.0" # Version can be any valid DS identifier, e.g. a version number or tag
|
52
|
+
#
|
53
|
+
# import(file, version: version, local: RGen.root)
|
54
|
+
def self.import(path_to_file_in_vault, options = {})
|
55
|
+
options = {
|
56
|
+
verbose: true,
|
57
|
+
version: 'Latest'
|
58
|
+
}.merge(options)
|
59
|
+
if options[:verbose]
|
60
|
+
puts 'Importing from DesignSync...'
|
61
|
+
puts "#{path_to_file_in_vault} #{options[:version]}"
|
62
|
+
end
|
63
|
+
dir = path_to_file_in_vault.split('/')
|
64
|
+
file = dir.pop
|
65
|
+
dir = dir.join('/')
|
66
|
+
cmd = "import -version #{options[:version]} -force #{dir} #{file}"
|
67
|
+
dssc(cmd, verbose: false)
|
68
|
+
if Origen.os.windows?
|
69
|
+
system("move /Y #{file} #{options[:local]}/.") if options[:local]
|
70
|
+
else
|
71
|
+
system("mv -f #{file} #{options[:local]}/.") if options[:local]
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
38
75
|
# Recursively remove all .SYNC directories from the given directory
|
39
76
|
def self.remove_dot_syncs!(dir, options = {})
|
40
77
|
dir = Pathname.new(dir)
|
@@ -261,17 +298,18 @@ module Origen
|
|
261
298
|
end
|
262
299
|
|
263
300
|
# Execute a dssc operation, the resultant output is returned in an array
|
264
|
-
def dssc(command, options = {})
|
301
|
+
def self.dssc(command, options = {})
|
265
302
|
options = {
|
266
303
|
check_errors: true,
|
267
|
-
verbose: true
|
304
|
+
verbose: true,
|
305
|
+
local: Dir.pwd
|
268
306
|
}.merge(options)
|
269
307
|
output = []
|
270
308
|
if options[:verbose]
|
271
309
|
Origen.log.info "dssc #{command}"
|
272
310
|
Origen.log.info ''
|
273
311
|
end
|
274
|
-
Dir.chdir local do
|
312
|
+
Dir.chdir options[:local] do
|
275
313
|
Open3.popen2e("dssc #{command}") do |_stdin, stdout_err, wait_thr|
|
276
314
|
while line = stdout_err.gets
|
277
315
|
Origen.log.info line.strip if options[:verbose]
|
@@ -293,6 +331,12 @@ module Origen
|
|
293
331
|
end
|
294
332
|
output
|
295
333
|
end
|
334
|
+
|
335
|
+
# Execute a dssc operation, the resultant output is returned in an array
|
336
|
+
def dssc(command, options = {})
|
337
|
+
options[:local] ||= local
|
338
|
+
DesignSync.dssc(command, options)
|
339
|
+
end
|
296
340
|
end
|
297
341
|
end
|
298
342
|
end
|
data/lib/origen/sub_blocks.rb
CHANGED
@@ -180,11 +180,20 @@ module Origen
|
|
180
180
|
root = "#{p.path(options)}."
|
181
181
|
end
|
182
182
|
else
|
183
|
-
|
183
|
+
# If a path variable has been set on a top-level object, then we will
|
184
|
+
# include that in path, otherwise by default the top-level object is not
|
185
|
+
# included in the path
|
186
|
+
if p || path_var
|
187
|
+
root = ''
|
188
|
+
else
|
189
|
+
return ''
|
190
|
+
end
|
184
191
|
end
|
185
192
|
local = (path_var || name || self.class.to_s.split('::').last).to_s
|
186
193
|
if local == 'hidden'
|
187
194
|
root.chop
|
195
|
+
elsif is_a?(Origen::Registers::BitCollection) && parent.path_var == :hidden
|
196
|
+
"#{root.chop}#{local}"
|
188
197
|
else
|
189
198
|
"#{root}#{local}"
|
190
199
|
end
|
@@ -274,8 +283,7 @@ module Origen
|
|
274
283
|
puts ''
|
275
284
|
fail 'Sub block does not include Origen::Model!'
|
276
285
|
end
|
277
|
-
block = klass.new(options.merge(parent: self))
|
278
|
-
block.name = name
|
286
|
+
block = klass.new(options.merge(parent: self, name: name))
|
279
287
|
if sub_blocks[name]
|
280
288
|
fail "You have already defined a sub-block named #{name} within class #{self.class}"
|
281
289
|
else
|
@@ -312,6 +320,7 @@ module Origen
|
|
312
320
|
# next time, this should be faster for repeated lookups of the same method, e.g. reg
|
313
321
|
def method_missing(method, *args, &block)
|
314
322
|
return regs(method) if self.has_reg?(method)
|
323
|
+
return ports(method) if self.has_port?(method)
|
315
324
|
if method.to_s =~ /=$/
|
316
325
|
define_singleton_method(method) do |val|
|
317
326
|
instance_variable_set("@#{method.to_s.sub('=', '')}", val)
|
@@ -114,5 +114,13 @@
|
|
114
114
|
<script src="http://origen-sdk.org/js/lunr.min.js"></script>
|
115
115
|
<script src="http://origen-sdk.org/js/highlight.js"></script>
|
116
116
|
<script src="http://origen-sdk.org/js/custom.js"></script>
|
117
|
+
<% if @item[:gitter_chat] %>
|
118
|
+
<script>
|
119
|
+
((window.gitter = {}).chat = {}).options = {
|
120
|
+
room: '<%= @item[:gitter_chat] %>'
|
121
|
+
};
|
122
|
+
</script>
|
123
|
+
<script src="https://sidecar.gitter.im/dist/sidecar.v1.js" async defer></script>
|
124
|
+
<% end %>
|
117
125
|
</body>
|
118
126
|
</html>
|
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.5.
|
4
|
+
version: 0.5.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stephen McGinty
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-12-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -344,14 +344,14 @@ dependencies:
|
|
344
344
|
requirements:
|
345
345
|
- - '='
|
346
346
|
- !ruby/object:Gem::Version
|
347
|
-
version: 0.2.
|
347
|
+
version: 0.2.3
|
348
348
|
type: :development
|
349
349
|
prerelease: false
|
350
350
|
version_requirements: !ruby/object:Gem::Requirement
|
351
351
|
requirements:
|
352
352
|
- - '='
|
353
353
|
- !ruby/object:Gem::Version
|
354
|
-
version: 0.2.
|
354
|
+
version: 0.2.3
|
355
355
|
- !ruby/object:Gem::Dependency
|
356
356
|
name: origen_doc_helpers
|
357
357
|
requirement: !ruby/object:Gem::Requirement
|
@@ -531,6 +531,12 @@ files:
|
|
531
531
|
- lib/origen/mode.rb
|
532
532
|
- lib/origen/model.rb
|
533
533
|
- lib/origen/model_initializer.rb
|
534
|
+
- lib/origen/models.rb
|
535
|
+
- lib/origen/models/mux.rb
|
536
|
+
- lib/origen/models/scan_register.rb
|
537
|
+
- lib/origen/netlist.rb
|
538
|
+
- lib/origen/netlist/connectable.rb
|
539
|
+
- lib/origen/netlist/list.rb
|
534
540
|
- lib/origen/operating_systems.rb
|
535
541
|
- lib/origen/parameters.rb
|
536
542
|
- lib/origen/parameters/live.rb
|
@@ -544,8 +550,12 @@ files:
|
|
544
550
|
- lib/origen/pins/pin_clock.rb
|
545
551
|
- lib/origen/pins/pin_collection.rb
|
546
552
|
- lib/origen/pins/pin_common.rb
|
547
|
-
- lib/origen/pins/port.rb
|
548
553
|
- lib/origen/pins/power_pin.rb
|
554
|
+
- lib/origen/ports.rb
|
555
|
+
- lib/origen/ports/bit_collection.rb
|
556
|
+
- lib/origen/ports/port.rb
|
557
|
+
- lib/origen/ports/port_collection.rb
|
558
|
+
- lib/origen/ports/section.rb
|
549
559
|
- lib/origen/registers.rb
|
550
560
|
- lib/origen/registers/bit.rb
|
551
561
|
- lib/origen/registers/bit_collection.rb
|
@@ -575,6 +585,7 @@ files:
|
|
575
585
|
- lib/origen/specs/version_history.rb
|
576
586
|
- lib/origen/sub_blocks.rb
|
577
587
|
- lib/origen/top_level.rb
|
588
|
+
- lib/origen/undefined.rb
|
578
589
|
- lib/origen/users.rb
|
579
590
|
- lib/origen/users/ldap.rb
|
580
591
|
- lib/origen/users/user.rb
|
data/lib/origen/pins/port.rb
DELETED
@@ -1,268 +0,0 @@
|
|
1
|
-
module Origen
|
2
|
-
module Pins
|
3
|
-
class Port
|
4
|
-
attr_accessor :name
|
5
|
-
attr_reader :id
|
6
|
-
attr_reader :owner
|
7
|
-
attr_reader :size
|
8
|
-
attr_accessor :order
|
9
|
-
|
10
|
-
include Pins
|
11
|
-
|
12
|
-
def initialize(id, owner, options = {})
|
13
|
-
options = {
|
14
|
-
name: id.to_s,
|
15
|
-
endian: :big,
|
16
|
-
add_pins: true
|
17
|
-
}.merge(options)
|
18
|
-
@endian = options.delete(:endian)
|
19
|
-
@size = options.delete(:size)
|
20
|
-
@name = options.delete(:name)
|
21
|
-
@order = options.delete(:order)
|
22
|
-
@id = id
|
23
|
-
@owner = owner
|
24
|
-
add_pins(options) if options[:add_pins]
|
25
|
-
end
|
26
|
-
|
27
|
-
def name
|
28
|
-
(Origen.app.pin_names[id] || @name).to_s
|
29
|
-
end
|
30
|
-
|
31
|
-
def inspect
|
32
|
-
"<#{self.class}:#{object_id}>"
|
33
|
-
end
|
34
|
-
|
35
|
-
def add_pins(options)
|
36
|
-
size.times do |i|
|
37
|
-
ix = @endian == :big ? @size - i - 1 : i
|
38
|
-
pin = add_pin(ix, options)
|
39
|
-
pin.port = self
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def cycle # :nodoc:
|
44
|
-
Origen.tester.cycle
|
45
|
-
end
|
46
|
-
|
47
|
-
def drive_mem
|
48
|
-
pins.each { |_ix, pin| pin.drive_mem }
|
49
|
-
end
|
50
|
-
|
51
|
-
def drive_mem!
|
52
|
-
drive_mem
|
53
|
-
cycle
|
54
|
-
end
|
55
|
-
|
56
|
-
def expect_mem
|
57
|
-
pins.each { |_ix, pin| pin.expect_mem }
|
58
|
-
end
|
59
|
-
|
60
|
-
def expect_mem!
|
61
|
-
expect_mem
|
62
|
-
cycle
|
63
|
-
end
|
64
|
-
|
65
|
-
# Set the pin to drive a 1 on future cycles
|
66
|
-
def drive_hi
|
67
|
-
pins.each { |_ix, pin| pin.drive_hi }
|
68
|
-
end
|
69
|
-
|
70
|
-
def drive_hi!
|
71
|
-
drive_hi
|
72
|
-
cycle
|
73
|
-
end
|
74
|
-
|
75
|
-
# Set the pin to drive a high voltage on future cycles (if the tester supports it).
|
76
|
-
# For example on a J750 high-voltage channel the pin state would be set to "2"
|
77
|
-
def drive_very_hi
|
78
|
-
pins.each { |_ix, pin| pin.drive_very_hi }
|
79
|
-
end
|
80
|
-
|
81
|
-
def drive_very_hi!
|
82
|
-
drive_very_hi
|
83
|
-
cycle
|
84
|
-
end
|
85
|
-
|
86
|
-
# Set the pin to drive a 0 on future cycles
|
87
|
-
def drive_lo
|
88
|
-
pins.each { |_ix, pin| pin.drive_lo }
|
89
|
-
end
|
90
|
-
|
91
|
-
def drive_lo!
|
92
|
-
drive_lo
|
93
|
-
cycle
|
94
|
-
end
|
95
|
-
|
96
|
-
# Set the pin to expect a 1 on future cycles
|
97
|
-
def assert_hi(_options = {})
|
98
|
-
pins.each { |_ix, pin| pin.assert_hi }
|
99
|
-
end
|
100
|
-
alias_method :compare_hi, :assert_hi
|
101
|
-
alias_method :expect_hi, :assert_hi
|
102
|
-
|
103
|
-
def assert_hi!
|
104
|
-
assert_hi
|
105
|
-
cycle
|
106
|
-
end
|
107
|
-
alias_method :compare_hi!, :assert_hi!
|
108
|
-
alias_method :expect_hi!, :assert_hi!
|
109
|
-
|
110
|
-
# Set the pin to expect a 0 on future cycles
|
111
|
-
def assert_lo(_options = {})
|
112
|
-
pins.each { |_ix, pin| pin.assert_lo }
|
113
|
-
end
|
114
|
-
alias_method :compare_lo, :assert_lo
|
115
|
-
alias_method :expect_lo, :assert_lo
|
116
|
-
|
117
|
-
def assert_lo!
|
118
|
-
assert_lo
|
119
|
-
cycle
|
120
|
-
end
|
121
|
-
alias_method :compare_lo!, :assert_lo!
|
122
|
-
alias_method :expect_lo!, :assert_lo!
|
123
|
-
|
124
|
-
# Set the pin to X on future cycles
|
125
|
-
def dont_care
|
126
|
-
pins.each { |_ix, pin| pin.dont_care }
|
127
|
-
end
|
128
|
-
|
129
|
-
def dont_care!
|
130
|
-
dont_care
|
131
|
-
cycle
|
132
|
-
end
|
133
|
-
|
134
|
-
# Pass in 0 or 1 to have the pin drive_lo or drive_hi respectively.
|
135
|
-
# This is useful when programatically setting the pin state.
|
136
|
-
# ==== Example
|
137
|
-
# [0,1,1,0].each do |level|
|
138
|
-
# $pin(:d_in).drive(level)
|
139
|
-
# end
|
140
|
-
def drive(value)
|
141
|
-
size.times do |i|
|
142
|
-
pins[i].drive(value[i])
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
|
-
def drive!(value)
|
147
|
-
drive(value)
|
148
|
-
cycle
|
149
|
-
end
|
150
|
-
|
151
|
-
# Pass in 0 or 1 to have the pin expect_lo or expect_hi respectively.
|
152
|
-
# This is useful when programatically setting the pin state.
|
153
|
-
# ==== Example
|
154
|
-
# [0,1,1,0].each do |level|
|
155
|
-
# $pin(:d_in).assert(level)
|
156
|
-
# end
|
157
|
-
def assert(value, _options = {})
|
158
|
-
size.times do |i|
|
159
|
-
pins[i].expect(value[i])
|
160
|
-
end
|
161
|
-
end
|
162
|
-
alias_method :compare, :assert
|
163
|
-
alias_method :expect, :assert
|
164
|
-
|
165
|
-
def assert!(*args)
|
166
|
-
assert(*args)
|
167
|
-
cycle
|
168
|
-
end
|
169
|
-
|
170
|
-
def [](ix)
|
171
|
-
pins[ix]
|
172
|
-
end
|
173
|
-
|
174
|
-
# Returns the data value currently assigned to the port
|
175
|
-
def data
|
176
|
-
d = 0
|
177
|
-
size.times do |i|
|
178
|
-
d |= pins[i].data << i
|
179
|
-
end
|
180
|
-
d
|
181
|
-
end
|
182
|
-
alias_method :value, :data
|
183
|
-
|
184
|
-
# Returns the inverse of the data value currently assigned to the port
|
185
|
-
def data_b
|
186
|
-
# (& operation takes care of Bignum formatting issues)
|
187
|
-
~data & ((1 << size) - 1)
|
188
|
-
end
|
189
|
-
alias_method :value_b, :data_b
|
190
|
-
|
191
|
-
# Set the data assigned to the port
|
192
|
-
def data=(val)
|
193
|
-
size.times do |i|
|
194
|
-
pins[i].data = val[i]
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
|
-
def toggle
|
199
|
-
self.data = data_b
|
200
|
-
end
|
201
|
-
|
202
|
-
def toggle!
|
203
|
-
toggle
|
204
|
-
cycle
|
205
|
-
end
|
206
|
-
|
207
|
-
def comparing?
|
208
|
-
pins.any? { |_ix, pin| pin.comparing? }
|
209
|
-
end
|
210
|
-
|
211
|
-
def comparing_mem?
|
212
|
-
pins.any? { |_ix, pin| pin.comparing_mem? }
|
213
|
-
end
|
214
|
-
|
215
|
-
def driving?
|
216
|
-
pins.any? { |_ix, pin| pin.driving? }
|
217
|
-
end
|
218
|
-
|
219
|
-
def driving_mem?
|
220
|
-
pins.any? { |_ix, pin| pin.driving_mem? }
|
221
|
-
end
|
222
|
-
|
223
|
-
def high_voltage?
|
224
|
-
pins.any? { |_ix, pin| pin.high_voltage? }
|
225
|
-
end
|
226
|
-
|
227
|
-
def repeat_previous=(bool)
|
228
|
-
pins.each { |_ix, pin| pin.repeat_previous = bool }
|
229
|
-
end
|
230
|
-
|
231
|
-
# Mark the (data) from the port to be captured
|
232
|
-
def capture
|
233
|
-
pins.each { |_ix, pin| pin.capture }
|
234
|
-
end
|
235
|
-
alias_method :store, :capture
|
236
|
-
|
237
|
-
# Mark the (data) from the port to be captured and trigger a cycle
|
238
|
-
def capture!
|
239
|
-
capture
|
240
|
-
cycle
|
241
|
-
end
|
242
|
-
alias_method :store!, :capture!
|
243
|
-
|
244
|
-
# Returns true if the (data) from the port is marked to be captured
|
245
|
-
def to_be_captured?
|
246
|
-
pins.any? { |_ix, pin| pin.to_be_captured? }
|
247
|
-
end
|
248
|
-
alias_method :to_be_stored?, :to_be_captured?
|
249
|
-
alias_method :is_to_be_stored?, :to_be_captured?
|
250
|
-
alias_method :is_to_be_captured?, :to_be_captured?
|
251
|
-
|
252
|
-
# Restores the state of the port at the end of the given block
|
253
|
-
# to the state it was in at the start of the block
|
254
|
-
#
|
255
|
-
# port(:a).driving? # => true
|
256
|
-
# port(:a).restore_state do
|
257
|
-
# port(:a).dont_care
|
258
|
-
# port(:a).driving? # => false
|
259
|
-
# end
|
260
|
-
# port(:a).driving? # => true
|
261
|
-
def restore_state
|
262
|
-
pins.each { |_ix, pin| pin.save }
|
263
|
-
yield
|
264
|
-
pins.each { |_ix, pin| pin.restore }
|
265
|
-
end
|
266
|
-
end
|
267
|
-
end
|
268
|
-
end
|