origen_link 0.1.0.pre0 → 0.1.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.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/bin/start_link_server +20 -0
  3. data/config/application.rb +0 -0
  4. data/config/boot.rb +3 -2
  5. data/config/commands.rb +0 -0
  6. data/config/version.rb +1 -1
  7. data/lib/origen_link.rb +1 -15
  8. data/lib/origen_link/callback_handlers.rb +13 -0
  9. data/lib/origen_link/server/jtag.rb +180 -0
  10. data/lib/origen_link/server/pin.rb +125 -0
  11. data/lib/origen_link/server/sequencer.rb +353 -0
  12. data/lib/origen_link/{includes_vector_based.rb → server_com.rb} +32 -7
  13. data/lib/origen_link/test/top_level.rb +48 -0
  14. data/lib/origen_link/test/top_level_controller.rb +44 -0
  15. data/lib/origen_link/test/vector_based.rb +25 -0
  16. data/lib/origen_link/vector_based.rb +254 -53
  17. data/lib/tasks/origen_link.rake +0 -0
  18. data/pattern/example.rb +0 -0
  19. data/pattern/jtag_100_operations.rb +0 -0
  20. data/pattern/jtag_comm_fail_test.rb +0 -0
  21. data/pattern/jtag_comm_test.rb +0 -0
  22. data/templates/web/index.md.erb +0 -0
  23. data/templates/web/layouts/_basic.html.erb +0 -0
  24. data/templates/web/partials/_navbar.html.erb +0 -0
  25. data/templates/web/release_notes.md.erb +0 -0
  26. metadata +32 -18
  27. data/lib/origen_link/test/regression_tests.rb +0 -68
  28. data/lib/origen_link/test/test_dut.rb +0 -46
  29. data/lib/origen_link/test/test_dut_controller.rb +0 -42
  30. data/lib/origen_link/test/vector_based_redefs.rb +0 -17
  31. data/lib/origen_link_server/LinkSequencer.rb +0 -333
  32. data/lib/origen_link_server/LinkTCPServer.rb +0 -45
  33. data/lib/origen_link_server/jtag_interface.rb +0 -177
  34. data/lib/origen_link_server/pin_interface.rb +0 -134
  35. data/lib/origen_link_server/test/test_Sequencer.rb +0 -51
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: origen_link
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.pre0
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Derouen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-22 00:00:00.000000000 Z
11
+ date: 2016-04-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: origen
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 0.6.6
19
+ version: 0.7.2
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 0.6.6
26
+ version: 0.7.2
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: origen_testers
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: 0.6.1
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: 0.6.1
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: origen_jtag
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -66,29 +66,43 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: test-unit
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  description:
70
84
  email:
71
85
  - paul.derouen@nxp.com
72
- executables: []
86
+ executables:
87
+ - start_link_server
73
88
  extensions: []
74
89
  extra_rdoc_files: []
75
90
  files:
91
+ - bin/start_link_server
76
92
  - config/application.rb
77
93
  - config/boot.rb
78
94
  - config/commands.rb
79
95
  - config/version.rb
80
96
  - lib/origen_link.rb
81
- - lib/origen_link/includes_vector_based.rb
82
- - lib/origen_link/test/regression_tests.rb
83
- - lib/origen_link/test/test_dut.rb
84
- - lib/origen_link/test/test_dut_controller.rb
85
- - lib/origen_link/test/vector_based_redefs.rb
97
+ - lib/origen_link/callback_handlers.rb
98
+ - lib/origen_link/server/jtag.rb
99
+ - lib/origen_link/server/pin.rb
100
+ - lib/origen_link/server/sequencer.rb
101
+ - lib/origen_link/server_com.rb
102
+ - lib/origen_link/test/top_level.rb
103
+ - lib/origen_link/test/top_level_controller.rb
104
+ - lib/origen_link/test/vector_based.rb
86
105
  - lib/origen_link/vector_based.rb
87
- - lib/origen_link_server/LinkSequencer.rb
88
- - lib/origen_link_server/LinkTCPServer.rb
89
- - lib/origen_link_server/jtag_interface.rb
90
- - lib/origen_link_server/pin_interface.rb
91
- - lib/origen_link_server/test/test_Sequencer.rb
92
106
  - lib/tasks/origen_link.rake
93
107
  - pattern/example.rb
94
108
  - pattern/jtag_100_operations.rb
@@ -117,7 +131,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
117
131
  version: 1.8.11
118
132
  requirements: []
119
133
  rubyforge_project:
120
- rubygems_version: 2.2.2
134
+ rubygems_version: 2.6.2
121
135
  signing_key:
122
136
  specification_version: 4
123
137
  summary: Origen interface to a live DUT tester
@@ -1,68 +0,0 @@
1
- require_relative '..\vector_based'
2
- require_relative 'vector_based_redefs'
3
- require 'test/unit'
4
-
5
- class DummyTset
6
- attr_accessor :name
7
-
8
- def initialize
9
- @name = 'default'
10
- end
11
- end
12
-
13
- class TestVectorBased < Test::Unit::TestCase
14
- def test_stuff
15
- timeset_sim_obj = DummyTset.new
16
-
17
- test_obj = OrigenLink::VectorBased.new('localhost', 12_777)
18
- # setup pinmap
19
- test_obj.pinmap = 'tck, 5, tdo, 8, tms, 10, tdi, 15'
20
- assert_equal('pin_assign:tck,5,tdo,8,tms,10,tdi,15', test_obj.message)
21
-
22
- # setup pin order ---- notice there's currently no error checking to see if pinmap and pinorder have the same pins !!!
23
- test_obj.pinorder = 'tck,tdo, tdi, extal'
24
- assert_equal('pin_patternorder:tck,tdo,tdi,extal', test_obj.message)
25
-
26
- assert_equal(true, test_obj.link?)
27
- assert_equal('OrigenLink::VectorBased', test_obj.to_s)
28
-
29
- test_obj.message = ''
30
- test_obj.push_vector(timeset: timeset_sim_obj, pin_vals: '1100')
31
- # check that pin values are being accumulated and not sent
32
- assert_equal('', test_obj.message)
33
- assert_equal(1, test_obj.vector_repeatcount)
34
-
35
- # check that different vector data causes previous to be sent
36
- test_obj.microcodestr = ''
37
- test_obj.test_response = 'P:1100'
38
- test_obj.push_vector(timeset: timeset_sim_obj, pin_vals: '1000')
39
- assert_equal('pin_cycle:1100', test_obj.message)
40
- assert_equal('P:1100', test_obj.microcodestr)
41
-
42
- # check that repeat count accumulates
43
- test_obj.microcodestr = ''
44
- test_obj.push_vector(timeset: timeset_sim_obj, pin_vals: '1000')
45
- assert_equal(2, test_obj.vector_repeatcount)
46
-
47
- # check that repeat count is correctly sent
48
- test_obj.test_response = 'P:repeat2,1000'
49
- test_obj.flush_vector
50
- assert_equal('pin_cycle:repeat2,1000', test_obj.message)
51
-
52
- # check pin format setup
53
- test_obj.test_response = 'P:'
54
- test_obj.pinformat = 'func_25mhz, tck, rl'
55
- assert_equal('pin_format:1,tck,rl', test_obj.message)
56
-
57
- # check timing setup
58
- test_obj.pintiming = 'func_25mhz, tdi, 0, tdo, 1, tms, 0'
59
- assert_equal('pin_timing:1,tdi,0,tdo,1,tms,0', test_obj.message)
60
-
61
- # check pin_cycle works correctly with tsets programmed
62
- test_obj.test_response = 'P:tset0,1000'
63
- timeset_sim_obj.name = 'func_25mhz'
64
- test_obj.push_vector(timeset: timeset_sim_obj, pin_vals: '1000')
65
- test_obj.flush_vector
66
- assert_equal('pin_cycle:tset1,1000', test_obj.message)
67
- end
68
- end
@@ -1,46 +0,0 @@
1
- module TestDut
2
- class TopLevel
3
- include Origen::TopLevel
4
-
5
- def initialize(options = {})
6
- instantiate_pins(options)
7
- instantiate_registers(options)
8
- instantiate_sub_blocks(options)
9
- end
10
-
11
- def instantiate_pins(options = {})
12
- options = {
13
- jtag_comm_config: false,
14
- invalid_pin_number_test: false,
15
- missing_pinmap_test: false
16
- }.merge(options)
17
- add_pin :tclk
18
- add_pin :tdi
19
- add_pin :tdo
20
- add_pin :tms
21
- add_pin :resetb
22
- add_pins :port_a, size: 8
23
-
24
- pin_pattern_order :tclk, :tms, :tdi, :tdo, only: true if options[:jtag_comm_config]
25
-
26
- # if tester.link? #.to_s == 'OrigenLink::VectorBased'
27
- if tester.to_s == 'OrigenLink::VectorBased'
28
- if options[:invalid_pin_number_test]
29
- tester.pinmap = 'tclk,119,tms,1900,tdi,116,tdo,124'
30
- else
31
- tester.pinmap = 'tclk,119,tms,6,tdi,116,tdo,124' unless options[:missing_pinmap_test]
32
- end
33
- tester.pinorder = 'tclk,tms,tdi,tdo'
34
- end
35
- end
36
-
37
- def instantiate_registers(options = {})
38
- reg :testreg, 0 do |reg|
39
- reg.bits 31..0, :value
40
- end
41
- end
42
-
43
- def instantiate_sub_blocks(options = {})
44
- end
45
- end
46
- end
@@ -1,42 +0,0 @@
1
- module TestDut
2
- class TopLevelController
3
- include Origen::Controller
4
-
5
- include OrigenJTAG
6
-
7
- JTAG_CONFIG = {
8
- #:tclk_format => :rl,
9
- tclk_format: :rh,
10
- #:tclk_multiple => 1,
11
- tclk_multiple: 4,
12
- tdo_strobe: :tclk_high,
13
- tdo_store_cycle: 3,
14
- init_state: :idle
15
- }
16
-
17
- def startup(options)
18
- pp 'Enter test mode' do
19
- # if tester.link?
20
- if tester.to_s == 'OrigenLink::VectorBased'
21
- tester.initialize_pattern
22
- # below is for testing return format timing, requires tclk to be rl and multiple of 1
23
- # tester.pinformat = 'func_25mhz,tclk,rl'
24
- # tester.pintiming = 'func_25mhz,tdi,0,tms,0,tdo,1'
25
- end
26
- tester.set_timeset('func_25mhz', 40) # Where 40 is the period in ns
27
- tester.wait time_in_us: 100
28
- end
29
- end
30
-
31
- def shutdown(options)
32
- pp 'Reset the device' do
33
- pin(:resetb).drive!(0)
34
- pin(:tclk).drive!(0)
35
- end
36
- # if tester.link?
37
- if tester.to_s == 'OrigenLink::VectorBased'
38
- tester.finalize_pattern
39
- end
40
- end
41
- end
42
- end
@@ -1,17 +0,0 @@
1
- module OrigenLink
2
- class VectorBased
3
- attr_accessor :message, :microcodestr, :test_response
4
-
5
- def send_cmd(cmdstr, argstr)
6
- @message = cmdstr + ':' + argstr
7
- @test_response
8
- end
9
-
10
- def setup_cmd_response_logger(command, response)
11
- end
12
-
13
- def microcode(msg)
14
- @microcodestr = @microcodestr + msg
15
- end
16
- end
17
- end
@@ -1,333 +0,0 @@
1
- # rubocop:disable Style/FileName: Use snake_case for source file names
2
- require_relative 'pin_interface'
3
-
4
- ##################################################
5
- # OrigenLinkSequencer Class
6
- # Instance variables:
7
- # pinmap: hash with ["pin name"] = pin object
8
- # patternpinindex: hash with ["pin name"] =
9
- # integer index into vector data
10
- # patternpinorder: Array with pin names in
11
- # the vector order
12
- #
13
- # This class processes messages targeted for
14
- # pin sequencer interface (vector pattern
15
- # execution).
16
- #
17
- # Supported messages:
18
- # pin_assign (create pin mapping)
19
- # ex: "pin_assign:tck,3,extal,23,tdo,5"
20
- #
21
- # pin_patternorder (define vector pin order)
22
- # ex: "pin_patternorder:tdo,extal,tck"
23
- #
24
- # pin_cycle (execute vector data)
25
- # ex: "pin_cycle:H11"
26
- #
27
- # pin_clear (clear all setup information)
28
- # ex: "pin_clear:"
29
- #
30
- # pin_format (setup a pin with return format)
31
- # first argument is the timeset
32
- # ex: "pin_format:1,tck,rl"
33
- #
34
- # pin_timing (define when pin events happen)
35
- # timing is stored in a timeset hash
36
- # first argument is the timeset key
37
- # ex: "pin_timing:1,tdi,0,tdo,1,tms,0
38
- ##################################################
39
- class OrigenLinkSequencer
40
- attr_reader :pinmap
41
- attr_reader :patternorder
42
- attr_reader :cycletiming
43
- attr_reader :patternpinindex
44
-
45
- ##################################################
46
- # initialize method
47
- # Create empty pinmap, pattern pin index
48
- # and pattern order instance variables
49
- ##################################################
50
- def initialize
51
- @pinmap = Hash.new(-1)
52
- @patternpinindex = Hash.new(-1)
53
- @patternorder = []
54
- @cycletiming = Hash.new(-1)
55
- end
56
-
57
- ##################################################
58
- # processmessage method
59
- # arguments: message
60
- # message format is <group>_<command>:<args>
61
- # returns: message response
62
- #
63
- # This method splits a message into it's
64
- # command and arguments and passes this
65
- # information to the method that performs
66
- # the requested command
67
- ##################################################
68
- def processmessage(message)
69
- command = message.split(':')
70
-
71
- case command[0]
72
- when 'pin_assign'
73
- pin_assign(command[1])
74
- when 'pin_patternorder'
75
- pin_patternorder(command[1])
76
- when 'pin_cycle'
77
- pin_cycle(command[1])
78
- when 'pin_clear'
79
- pin_clear
80
- when 'pin_format'
81
- pin_format(command[1])
82
- when 'pin_timing'
83
- pin_timing(command[1])
84
- else
85
- 'Error Invalid command: ' + command[0].to_s
86
- end
87
- end
88
-
89
- ##################################################
90
- # pin_assign method
91
- # arguments: <args> from the message request
92
- # see "processmessage" method
93
- # returns: "P:" or error message
94
- #
95
- # This method creates a pin instance for each
96
- # pin in the pin map and builds the pinmap
97
- # hash. Before the pinmap is created, any
98
- # information from a previous pattern run is
99
- # cleared.
100
- ##################################################
101
- def pin_assign(args)
102
- pin_clear
103
- success = true
104
- fail_message = ''
105
- argarr = args.split(',')
106
- 0.step(argarr.length - 2, 2) do |index|
107
- @pinmap[argarr[index]] = OrigenLinkPin.new(argarr[index + 1])
108
- unless @pinmap[argarr[index]].gpio_valid
109
- success = false
110
- fail_message = fail_message + 'pin ' + argarr[index] + ' gpio' + argarr[index + 1] + ' is invalid'
111
- end
112
- end
113
- if success
114
- 'P:'
115
- else
116
- 'F:' + fail_message
117
- end
118
- end
119
-
120
- ##################################################
121
- # new_timeset(tset)
122
- # creates a new empty timeset hash
123
- ##################################################
124
- def new_timeset(tset)
125
- @cycletiming[tset] = {}
126
- @cycletiming[tset]['timing'] = [[], [], []]
127
- end
128
-
129
- ##################################################
130
- # pin_format method
131
- # arguments: <args> from the message request
132
- # Should be <timeset>,<pin>,rl or rh
133
- # multi-clock not currently supported
134
- #
135
- ##################################################
136
- def pin_format(args)
137
- argarr = args.split(',')
138
- tset_key = argarr.delete_at(0).to_i
139
- new_timeset(tset_key) unless @cycletiming.key?(tset_key)
140
- @cycletiming[tset_key].delete('rl')
141
- @cycletiming[tset_key].delete('rh')
142
- 0.step(argarr.length - 2, 2) do |index|
143
- @cycletiming[tset_key][argarr[index + 1]] = [] unless @cycletiming[tset_key].key?(argarr[index + 1])
144
- @cycletiming[tset_key][argarr[index + 1]] << argarr[index]
145
- end
146
- 'P:'
147
- end
148
-
149
- ##################################################
150
- # pin_timing method
151
- # arguments: <args> from the message request
152
- # Should be '1,pin,-1,pin2,0,pin3,1'
153
- # First integer is timeset number
154
- # If argument is '', default timing is created
155
- # Default timeset number is 0, this is used
156
- # if no timeset is explicitly defined
157
- #
158
- # cycle arg: 0 1 2
159
- # waveform : ___/***\___
160
- #
161
- # returns "P:" or error message
162
- #
163
- # This method sets up a time set. All retrun
164
- # format pins are driven between 0 and 1 and
165
- # return between 1 and 2. Non-return pins are
166
- # acted upon during the 0, 1 or 2 time period.
167
- ##################################################
168
- def pin_timing(args)
169
- argarr = args.split(',')
170
- tset_key = argarr.delete_at(0).to_i
171
- new_timeset(tset_key) unless @cycletiming.key?(tset_key)
172
- @cycletiming[tset_key]['timing'].each do |index|
173
- index.delete_if { true }
174
- end
175
- 0.step(argarr.length - 2, 2) do |index|
176
- @cycletiming[tset_key]['timing'][argarr[index + 1].to_i] << argarr[index]
177
- end
178
- 'P:'
179
- end
180
-
181
- ##################################################
182
- # pin_patternorder method
183
- # arguments: <args> from the message request
184
- # returns: "P:" or error message
185
- #
186
- # This method is used to define the order
187
- # for pin vector data.
188
- ##################################################
189
- def pin_patternorder(args)
190
- argarr = args.split(',')
191
- index = 0
192
- if @cycletiming.key?(0)
193
- @cycletiming[0]['timing'][0].delete_if { true }
194
- else
195
- new_timeset(0)
196
- end
197
- argarr.each do |pin|
198
- @patternorder << pin
199
- @patternpinindex[pin] = index
200
- @cycletiming[0]['timing'][0] << pin
201
- index += 1
202
- end
203
- 'P:'
204
- end
205
-
206
- ##################################################
207
- # pin_cycle method
208
- # arguments: <args> from the message request
209
- # returns: "P:" or "F:" followed by results
210
- #
211
- # This method executes one cycle of pin vector
212
- # data. The vector data is decomposed and
213
- # sequenced. Each pin object and pin data
214
- # is passed to the "process_pindata" method
215
- # for decoding and execution
216
- ##################################################
217
- def pin_cycle(args)
218
- # set default repeats and timeset
219
- repeat_count = 1
220
- tset = 0
221
- if args =~ /,/
222
- parsedargs = args.split(',')
223
- args = parsedargs.pop
224
- parsedargs.each do |arg|
225
- if arg =~ /repeat/
226
- repeat_count = arg.sub(/repeat/, '').to_i
227
- elsif arg =~ /tset/
228
- tset = arg.sub(/tset/, '').to_i
229
- end
230
- end
231
- end
232
-
233
- message = ''
234
- pindata = args.split('')
235
- @cycle_failure = false
236
- 0.upto(repeat_count - 1) do |count|
237
- response = {}
238
- # process time 0 events
239
- response = process_events(@cycletiming[tset]['timing'][0], pindata)
240
- # send drive data for return format pins
241
- response = (process_events(@cycletiming[tset]['rl'], pindata)).merge(response)
242
- response = (process_events(@cycletiming[tset]['rh'], pindata)).merge(response)
243
- # process time 1 events
244
- response = process_events(@cycletiming[tset]['timing'][1], pindata).merge(response)
245
- # send return data
246
- unless @cycletiming[tset]['rl'].nil?
247
- @cycletiming[tset]['rl'].each do |pin|
248
- process_pindata(@pinmap[pin], '0')
249
- end
250
- end
251
- unless @cycletiming[tset]['rh'].nil?
252
- @cycletiming[tset]['rh'].each do |pin|
253
- process_pindata(@pinmap[pin], '1')
254
- end
255
- end
256
- # process time 2 events
257
- response = process_events(@cycletiming[tset]['timing'][2], pindata).merge(response)
258
- if (count == 0) || (@cycle_failure)
259
- message = ''
260
- @patternorder.each do |pin|
261
- message += response[pin]
262
- end
263
- end
264
- end # end cycle through repeats
265
- if @cycle_failure
266
- rtnmsg = 'F:' + message + ' Expected:' + args
267
- else
268
- rtnmsg = 'P:' + message
269
- end
270
- rtnmsg += ' Repeat ' + repeat_count.to_s if repeat_count > 1
271
- rtnmsg
272
- end
273
-
274
- ##################################################
275
- # process_events
276
- # used by pin_cycle to avoid duplicating code
277
- ##################################################
278
- def process_events(events, pindata)
279
- response = {}
280
- unless events.nil?
281
- events.each do |pin|
282
- response[pin] = process_pindata(@pinmap[pin], pindata[@patternpinindex[pin]])
283
- end
284
- end
285
- response
286
- end
287
-
288
- ##################################################
289
- # process_pindata method
290
- # arguments:
291
- # pin: the pin object to be operated on
292
- # data: the pin data to be executed
293
- # returns: the drive data or read data
294
- #
295
- # This method translates pin data into one
296
- # of three possible events. Drive 0, drive 1
297
- # or read. Supported character decode:
298
- # drive 0: '0'
299
- # drive 1: '1'
300
- # read: anything else
301
- ##################################################
302
- def process_pindata(pin, data)
303
- if data == '0' || data == '1'
304
- pin.out(data)
305
- data
306
- else
307
- case pin.in
308
- when '0'
309
- @cycle_failure = true if data == 'H'
310
- 'L'
311
- when '1'
312
- @cycle_failure = true if data == 'L'
313
- 'H'
314
- else
315
- 'W'
316
- end
317
- end
318
- end
319
-
320
- ##################################################
321
- # pin_clear method
322
- #
323
- # This method clears all storage objects. It
324
- # is called by the "pin_assign" method
325
- ##################################################
326
- def pin_clear
327
- @pinmap.clear
328
- @patternpinindex.clear
329
- @patternorder.delete_if { true }
330
- @cycletiming.clear
331
- 'P:'
332
- end
333
- end