origen 0.5.7 → 0.5.8
Sign up to get free protection for your applications and to get access to all the features.
- 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
|