origen_testers 0.5.7 → 0.6.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 (81) hide show
  1. checksums.yaml +4 -4
  2. data/config/shared_commands.rb +6 -0
  3. data/config/version.rb +2 -2
  4. data/lib/commands/run.rb +44 -0
  5. data/lib/origen_testers.rb +19 -1
  6. data/lib/origen_testers/flow.rb +382 -0
  7. data/lib/origen_testers/generator.rb +32 -29
  8. data/lib/origen_testers/igxl_based_tester/base/ac_specsets.rb +79 -0
  9. data/lib/origen_testers/igxl_based_tester/base/dc_specsets.rb +98 -0
  10. data/lib/origen_testers/igxl_based_tester/base/edge.rb +60 -0
  11. data/lib/origen_testers/igxl_based_tester/base/edges.rb +24 -0
  12. data/lib/origen_testers/igxl_based_tester/base/edgeset.rb +39 -0
  13. data/lib/origen_testers/igxl_based_tester/base/edgesets.rb +97 -0
  14. data/lib/origen_testers/igxl_based_tester/base/flow.rb +390 -115
  15. data/lib/origen_testers/igxl_based_tester/base/flow_line.rb +4 -54
  16. data/lib/origen_testers/igxl_based_tester/base/generator.rb +257 -11
  17. data/lib/origen_testers/igxl_based_tester/base/level_io_se.rb +59 -0
  18. data/lib/origen_testers/igxl_based_tester/base/level_supply.rb +39 -0
  19. data/lib/origen_testers/igxl_based_tester/base/levels.rb +31 -0
  20. data/lib/origen_testers/igxl_based_tester/base/levelset.rb +109 -0
  21. data/lib/origen_testers/igxl_based_tester/base/pinmap.rb +93 -0
  22. data/lib/origen_testers/igxl_based_tester/base/test_instance.rb +33 -1
  23. data/lib/origen_testers/igxl_based_tester/base/timeset.rb +37 -0
  24. data/lib/origen_testers/igxl_based_tester/base/timesets.rb +47 -0
  25. data/lib/origen_testers/igxl_based_tester/j750/templates/flow.txt.erb +2 -2
  26. data/lib/origen_testers/igxl_based_tester/ultraflex/ac_specsets.rb +10 -0
  27. data/lib/origen_testers/igxl_based_tester/ultraflex/custom_test_instance.rb +4 -0
  28. data/lib/origen_testers/igxl_based_tester/ultraflex/dc_specsets.rb +10 -0
  29. data/lib/origen_testers/igxl_based_tester/ultraflex/edge.rb +9 -0
  30. data/lib/origen_testers/igxl_based_tester/ultraflex/edges.rb +9 -0
  31. data/lib/origen_testers/igxl_based_tester/ultraflex/edgeset.rb +9 -0
  32. data/lib/origen_testers/igxl_based_tester/ultraflex/edgesets.rb +10 -0
  33. data/lib/origen_testers/igxl_based_tester/ultraflex/flow.rb +137 -0
  34. data/lib/origen_testers/igxl_based_tester/ultraflex/level_io_se.rb +9 -0
  35. data/lib/origen_testers/igxl_based_tester/ultraflex/level_supply.rb +9 -0
  36. data/lib/origen_testers/igxl_based_tester/ultraflex/levels.rb +9 -0
  37. data/lib/origen_testers/igxl_based_tester/ultraflex/levelset.rb +10 -0
  38. data/lib/origen_testers/igxl_based_tester/ultraflex/pinmap.rb +10 -0
  39. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/ac_specsets.txt.erb +58 -0
  40. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/dc_specsets.txt.erb +58 -0
  41. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/edgesets.txt.erb +95 -0
  42. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/flow.txt.erb +2 -2
  43. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/levelset.txt.erb +121 -0
  44. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/pinmap.txt.erb +24 -0
  45. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/timesets.txt.erb +137 -0
  46. data/lib/origen_testers/igxl_based_tester/ultraflex/test_instance.rb +4 -0
  47. data/lib/origen_testers/igxl_based_tester/ultraflex/timeset.rb +9 -0
  48. data/lib/origen_testers/igxl_based_tester/ultraflex/timesets.rb +10 -0
  49. data/lib/origen_testers/interface.rb +41 -6
  50. data/lib/origen_testers/no_interface.rb +7 -0
  51. data/lib/origen_testers/origen_ext/application/runner.rb +25 -0
  52. data/lib/origen_testers/origen_ext/generator.rb +37 -0
  53. data/lib/origen_testers/origen_ext/generator/flow.rb +70 -0
  54. data/lib/origen_testers/origen_ext/generator/resources.rb +21 -0
  55. data/lib/origen_testers/program_generators.rb +0 -1
  56. data/lib/origen_testers/smartest_based_tester/base/flow.rb +158 -134
  57. data/lib/origen_testers/smartest_based_tester/base/generator.rb +2 -3
  58. data/lib/origen_testers/smartest_based_tester/base/test_suite.rb +4 -0
  59. data/lib/origen_testers/smartest_based_tester/v93k/templates/template.flow.erb +5 -6
  60. data/lib/origen_testers/test/dut.rb +5 -0
  61. data/lib/origen_testers/test/j750_base_interface.rb +0 -3
  62. data/lib/origen_testers/test/ultraflex_interface.rb +230 -4
  63. data/lib/origen_testers/test/v93k_interface.rb +5 -23
  64. data/program/components/_temp.rb +6 -0
  65. data/program/flow_control.rb +190 -62
  66. data/program/prb1.rb +13 -50
  67. data/program/prb2.rb +0 -16
  68. data/program/test.rb +12 -3
  69. data/program/uflex_resources.rb +159 -0
  70. metadata +66 -16
  71. data/lib/origen_testers/doc.rb +0 -224
  72. data/lib/origen_testers/doc/generator.rb +0 -124
  73. data/lib/origen_testers/doc/generator/flow.rb +0 -69
  74. data/lib/origen_testers/doc/generator/flow_line.rb +0 -201
  75. data/lib/origen_testers/doc/generator/test.rb +0 -66
  76. data/lib/origen_testers/doc/generator/test_group.rb +0 -64
  77. data/lib/origen_testers/doc/generator/tests.rb +0 -45
  78. data/lib/origen_testers/doc/model.rb +0 -160
  79. data/lib/origen_testers/generator/flow_control_api.rb +0 -611
  80. data/lib/origen_testers/smartest_based_tester/base/flow_node.rb +0 -476
  81. data/lib/origen_testers/smartest_based_tester/v93k/flow_node.rb +0 -9
@@ -3,6 +3,10 @@ module OrigenTesters
3
3
  class UltraFLEX
4
4
  require 'origen_testers/igxl_based_tester/base/custom_test_instance'
5
5
  class CustomTestInstance < Base::CustomTestInstance
6
+ # Give all UltraFLEX test instances the ability to contain limits, these will
7
+ # be rendered to Use-limit lines in the flow
8
+ attr_accessor :lo_limit, :hi_limit, :scale, :units, :defer_limits
9
+
6
10
  # Attributes for each test instance line, first few are named directly
7
11
  TEST_INSTANCE_ATTRS = %w(
8
12
  test_name proc_type proc_name proc_called_as dc_category
@@ -0,0 +1,10 @@
1
+ module OrigenTesters
2
+ module IGXLBasedTester
3
+ class UltraFLEX
4
+ require 'origen_testers/igxl_based_tester/base/dc_specsets'
5
+ class DCSpecsets < Base::DCSpecsets
6
+ TEMPLATE = "#{Origen.root!}/lib/origen_testers/igxl_based_tester/ultraflex/templates/dc_specsets.txt.erb"
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,9 @@
1
+ module OrigenTesters
2
+ module IGXLBasedTester
3
+ class UltraFLEX
4
+ require 'origen_testers/igxl_based_tester/base/edge'
5
+ class Edge < Base::Edge
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module OrigenTesters
2
+ module IGXLBasedTester
3
+ class UltraFLEX
4
+ require 'origen_testers/igxl_based_tester/base/edges'
5
+ class Edges < Base::Edges
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module OrigenTesters
2
+ module IGXLBasedTester
3
+ class UltraFLEX
4
+ require 'origen_testers/igxl_based_tester/base/edgeset'
5
+ class Edgeset < Base::Edgeset
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ module OrigenTesters
2
+ module IGXLBasedTester
3
+ class UltraFLEX
4
+ require 'origen_testers/igxl_based_tester/base/edgesets'
5
+ class Edgesets < Base::Edgesets
6
+ TEMPLATE = "#{Origen.root!}/lib/origen_testers/igxl_based_tester/ultraflex/templates/edgesets.txt.erb"
7
+ end
8
+ end
9
+ end
10
+ end
@@ -4,6 +4,143 @@ module OrigenTesters
4
4
  require 'origen_testers/igxl_based_tester/base/flow'
5
5
  class Flow < Base::Flow
6
6
  TEMPLATE = "#{Origen.root!}/lib/origen_testers/igxl_based_tester/ultraflex/templates/flow.txt.erb"
7
+
8
+ SCALES = [:p, :n, :u, :m, :none, :k, :M]
9
+
10
+ def on_test(node)
11
+ super
12
+ ins = node.find(:object).value
13
+ if ins.respond_to?(:lo_limit) && (ins.lo_limit || ins.hi_limit)
14
+ if ins.defer_limits
15
+ completed_lines.last.opcode = 'Test-defer-limits'
16
+ end
17
+ limit = completed_lines.last.dup
18
+ limit.type = :use_limit
19
+ limit.opcode = 'Use-Limit'
20
+ limit.parameter = nil
21
+
22
+ lo = ins.lo_limit
23
+ hi = ins.hi_limit
24
+
25
+ size = 1
26
+ if lo.is_a?(Array)
27
+ size = lo.size if lo.size > size
28
+ end
29
+ if hi.is_a?(Array)
30
+ size = hi.size if hi.size > size
31
+ end
32
+
33
+ size.times do |i|
34
+ line = limit.dup
35
+
36
+ if lo.is_a?(Array)
37
+ l = lo[i]
38
+ else
39
+ l = lo
40
+ end
41
+
42
+ if hi.is_a?(Array)
43
+ h = hi[i]
44
+ else
45
+ h = hi
46
+ end
47
+
48
+ if ins.scale
49
+ if ins.scale.is_a?(Array)
50
+ s = ins.scale[i]
51
+ else
52
+ s = ins.scale
53
+ end
54
+ else
55
+ s = lowest_scale(scale_of(l), scale_of(h))
56
+ l = scaled(l, s)
57
+ h = scaled(h, s)
58
+ end
59
+ line.lolim = l
60
+ line.hilim = h
61
+ line.scale = s unless s == :none
62
+ if ins.units
63
+ if ins.units.is_a?(Array)
64
+ line.units = ins.units[i]
65
+ else
66
+ line.units = ins.units
67
+ end
68
+ end
69
+ completed_lines << line
70
+ end
71
+ end
72
+ end
73
+
74
+ # Returns the scale that should be best used to represent the given number, returns
75
+ # nil in the case where the given number is nil
76
+ def scale_of(number)
77
+ if number && number.is_a?(Numeric)
78
+ number = number.abs
79
+ if number >= 1_000_000
80
+ :M
81
+ elsif number >= 1_000
82
+ :k
83
+ elsif number >= 0.1
84
+ :none
85
+ elsif number >= 0.000_1
86
+ :m
87
+ elsif number >= 0.000_000_1
88
+ :u
89
+ elsif number >= 0.000_000_000_1
90
+ :n
91
+ else
92
+ :p
93
+ end
94
+ end
95
+ end
96
+
97
+ # Returns the lowest of the two scales
98
+ def lowest_scale(a, b)
99
+ if a == b
100
+ a
101
+ elsif !a
102
+ b
103
+ elsif !b
104
+ a
105
+ else
106
+ if SCALES.index(a) < SCALES.index(b)
107
+ a
108
+ else
109
+ b
110
+ end
111
+ end
112
+ end
113
+
114
+ def scaled(number, scale)
115
+ if number
116
+ if number.is_a?(Numeric)
117
+ number = number.to_f
118
+ if scale
119
+ case scale
120
+ when :M
121
+ number = number / 1_000_000
122
+ when :k
123
+ number = number / 1_000
124
+ when :m
125
+ number = number * 1_000
126
+ when :u
127
+ number = number * 1_000_000
128
+ when :n
129
+ number = number * 1_000_000_000
130
+ when :p
131
+ number = number * 1_000_000_000_000
132
+ end
133
+ end
134
+ if number.round(2) == number.to_i.to_f.round(2)
135
+ number.to_i
136
+ else
137
+ number.round(2)
138
+ end
139
+ else
140
+ number
141
+ end
142
+ end
143
+ end
7
144
  end
8
145
  end
9
146
  end
@@ -0,0 +1,9 @@
1
+ module OrigenTesters
2
+ module IGXLBasedTester
3
+ class UltraFLEX
4
+ require 'origen_testers/igxl_based_tester/base/level_io_se'
5
+ class PinLevelSingle < Base::PinLevelSingle
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module OrigenTesters
2
+ module IGXLBasedTester
3
+ class UltraFLEX
4
+ require 'origen_testers/igxl_based_tester/base/level_supply'
5
+ class SupplyLevel < Base::SupplyLevel
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module OrigenTesters
2
+ module IGXLBasedTester
3
+ class UltraFLEX
4
+ require 'origen_testers/igxl_based_tester/base/levels'
5
+ class Levels < Base::Levels
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ module OrigenTesters
2
+ module IGXLBasedTester
3
+ class UltraFLEX
4
+ require 'origen_testers/igxl_based_tester/base/levelset'
5
+ class Levelset < Base::Levelset
6
+ TEMPLATE = "#{Origen.root!}/lib/origen_testers/igxl_based_tester/ultraflex/templates/levelset.txt.erb"
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module OrigenTesters
2
+ module IGXLBasedTester
3
+ class UltraFLEX
4
+ require 'origen_testers/igxl_based_tester/base/pinmap'
5
+ class Pinmap < Base::Pinmap
6
+ TEMPLATE = "#{Origen.root!}/lib/origen_testers/igxl_based_tester/ultraflex/templates/pinmap.txt.erb"
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,58 @@
1
+ % line_cnt = 5
2
+ %
3
+ % specset_names = ac_specsets.keys.join("\t\t\t") + "\t\t\t"
4
+ % categories = "Typ\tMin\tMax\t" * ac_specsets.keys.size
5
+ %
6
+ <%= "DTACSpecSheet,version=2.0:platform=Jaguar:toprow=-1:leftcol=-1:rightcol=-1\tAC Specs" %>
7
+ <%= "" %>
8
+ <%= "\t\t\tSelector\t\t#{specset_names}" %>
9
+ <%= "\tSymbol\tValue\tName\tVal\t#{categories}" %>
10
+ %
11
+ % # Gather spec selectors
12
+ % selectors = []
13
+ % ac_specs.each do |next_spec|
14
+ % ac_specsets.each do |specset_name, ss|
15
+ % ss[next_spec].keys.each do |sel|
16
+ % selectors << sel unless selectors.include?(sel)
17
+ % end
18
+ % end
19
+ % end
20
+ %
21
+ % # Gather spec values per category for each spec/specset
22
+ % ac_specs.each do |next_spec|
23
+ % spec_line = ''
24
+ % categories = {}
25
+ % ac_specsets.each do |specset_name, ss|
26
+ % category_vals = {}
27
+ % ss[next_spec].keys.each do |selector|
28
+ % ss[next_spec][selector].each do |category, value|
29
+ % categories[selector] = category
30
+ %
31
+ % case category
32
+ % when /^(typ|min|max)$/
33
+ % else
34
+ % Origen.log.error "Specset: #{specset_name}, Spec: #{next_spec} category (#{category}) is not one of :typ, :min, :max"
35
+ % fail
36
+ % end
37
+ %
38
+ % if category_vals.key?(category) && category_vals[category] != ss[next_spec][selector][category]
39
+ % Origen.log.error "Specset: #{specset_name}, Spec: #{next_spec} has more than one value for category: #{category}"
40
+ % fail
41
+ % elsif !category_vals.key?(category)
42
+ % category_vals[category] = ss[next_spec][selector][category]
43
+ % end
44
+ % end
45
+ % end
46
+ % !category_vals.key?(:typ) ? category_vals[:typ] = nil : nil
47
+ % !category_vals.key?(:min) ? category_vals[:min] = nil : nil
48
+ % !category_vals.key?(:max) ? category_vals[:max] = nil : nil
49
+ % typ_val = format_uflex_ac_spec(category_vals[:typ])
50
+ % min_val = format_uflex_ac_spec(category_vals[:min])
51
+ % max_val = format_uflex_ac_spec(category_vals[:max])
52
+ % spec_line = spec_line + "#{typ_val}\t#{min_val}\t#{max_val}\t"
53
+ % end
54
+ % selectors.each do |selector|
55
+ <%= "\t#{next_spec}\t\t#{selector}\t#{categories[selector].capitalize}\t#{spec_line}" %>
56
+ % end
57
+ % end
58
+ %
@@ -0,0 +1,58 @@
1
+ % line_cnt = 5
2
+ %
3
+ % specset_names = dc_specsets.keys.join("\t\t\t") + "\t\t\t"
4
+ % categories = "Typ\tMin\tMax\t" * dc_specsets.keys.size
5
+ %
6
+ <%= "DTDCSpecSheet,version=2.0:platform=Jaguar:toprow=-1:leftcol=-1:rightcol=-1\tDC Specs" %>
7
+ <%= "" %>
8
+ <%= "\t\t\tSelector\t\t#{specset_names}" %>
9
+ <%= "\tSymbol\tValue\tName\tVal\t#{categories}" %>
10
+ %
11
+ % # Gather spec selectors
12
+ % selectors = []
13
+ % dc_specs.each do |next_spec|
14
+ % dc_specsets.each do |specset_name, ss|
15
+ % ss[next_spec].keys.each do |sel|
16
+ % selectors << sel unless selectors.include?(sel)
17
+ % end
18
+ % end
19
+ % end
20
+ %
21
+ % # Gather spec values per category for each spec/specset
22
+ % dc_specs.each do |next_spec|
23
+ % spec_line = ''
24
+ % categories = {}
25
+ % dc_specsets.each do |specset_name, ss|
26
+ % category_vals = {}
27
+ % ss[next_spec].keys.each do |selector|
28
+ % ss[next_spec][selector].each do |category, value|
29
+ % categories[selector] = category
30
+ %
31
+ % case category
32
+ % when /^(typ|min|max)$/
33
+ % else
34
+ % Origen.log.error "Specset: #{specset_name}, Spec: #{next_spec} category (#{category}) is not one of :typ, :min, :max"
35
+ % fail
36
+ % end
37
+ %
38
+ % if category_vals.key?(category) && category_vals[category] != ss[next_spec][selector][category]
39
+ % Origen.log.error "Specset: #{specset_name}, Spec: #{next_spec} has more than one value for category: #{category}"
40
+ % fail
41
+ % elsif !category_vals.key?(category)
42
+ % category_vals[category] = ss[next_spec][selector][category]
43
+ % end
44
+ % end
45
+ % end
46
+ % !category_vals.key?(:typ) ? category_vals[:typ] = nil : nil
47
+ % !category_vals.key?(:min) ? category_vals[:min] = nil : nil
48
+ % !category_vals.key?(:max) ? category_vals[:max] = nil : nil
49
+ % typ_val = format_uflex_dc_spec(category_vals[:typ], spec: next_spec)
50
+ % min_val = format_uflex_dc_spec(category_vals[:min], spec: next_spec)
51
+ % max_val = format_uflex_dc_spec(category_vals[:max], spec: next_spec)
52
+ % spec_line = spec_line + "#{typ_val}\t#{min_val}\t#{max_val}\t"
53
+ % end
54
+ % selectors.each do |selector|
55
+ <%= "\t#{next_spec}\t\t#{selector}\t#{categories[selector].capitalize}\t#{spec_line}" %>
56
+ % end
57
+ % end
58
+ %
@@ -0,0 +1,95 @@
1
+ % line_cnt = 8
2
+ % print_hdr = true
3
+ %
4
+ % ## Hash Autovivification
5
+ % l = ->(h, k) { h[k] = Hash.new(&l) }
6
+ % eset_eqns = Hash.new(&l)
7
+ % eset_eqns_print = Hash.new(&l)
8
+ %
9
+ % @es_sheet_pins.each do |grp|
10
+ % if Origen.top_level.has_pin?(grp)
11
+ % pin_ary = get_pin_objects(grp)
12
+ % pin_ary.each do |next_pin|
13
+ % pin_nam = Origen.top_level.pin(next_pin.id).name
14
+ % found_pin_eqn = false
15
+ % @es.keys.each do |eset|
16
+ % if @es[eset].pins.key?(pin_nam)
17
+ % eset_eqns[grp][eset][pin_nam] = @es[eset].pins[pin_nam]
18
+ % eset_eqns_print[grp][pin_nam][eset] = @es[eset].pins[pin_nam]
19
+ % found_pin_eqn = true
20
+ % end
21
+ % end
22
+ % unless found_pin_eqn
23
+ % Origen.log.error "GRP #{grp}, PIN #{pin_nam}: Pin timing is not defined in any edgesets"
24
+ % next
25
+ % end
26
+ % end
27
+ % else
28
+ % Origen.log.error "Undefined pin/pingroup in pattern header (#{grp})"
29
+ % end
30
+ % end
31
+ %
32
+ % eset_eqns.keys.each do |grp|
33
+ % grp_edge_same = true
34
+ % eset_eqns[grp].keys.each do |eset_key|
35
+ % grp_edge = nil
36
+ % pin_ary = get_pin_objects(grp)
37
+ % pin_ary.each do |next_pin|
38
+ % pin_nam = Origen.top_level.pin(next_pin.id).name
39
+ % if eset_eqns[grp][eset_key].key?(pin_nam)
40
+ % if grp_edge.nil?
41
+ % grp_edge = eset_eqns[grp][eset_key][pin_nam]
42
+ % elsif !edges_eql?(grp_edge, eset_eqns[grp][eset_key][pin_nam])
43
+ % grp_edge_same = false
44
+ % end
45
+ % else
46
+ % grp_edge_same = false
47
+ % end
48
+ % end
49
+ % end
50
+ %
51
+ % pin_grp_done = false
52
+ % eset_eqns_print[grp].keys.each do |pin_nam|
53
+ % pin_grp_done ? break : nil
54
+ % eset_eqns_print[grp][pin_nam].keys.each do |eset|
55
+ % data_src = @es[eset].pins[pin_nam].d_src
56
+ % data_fmt = @es[eset].pins[pin_nam].d_fmt
57
+ % drv_on = @es[eset].pins[pin_nam].d0_edge
58
+ % drv_data = @es[eset].pins[pin_nam].d1_edge
59
+ % drv_ret = @es[eset].pins[pin_nam].d2_edge
60
+ % drv_off = @es[eset].pins[pin_nam].d3_edge
61
+ % cmp_mode = @es[eset].pins[pin_nam].c_mode
62
+ % cmp_open = @es[eset].pins[pin_nam].c1_edge
63
+ % cmp_close = @es[eset].pins[pin_nam].c2_edge
64
+ % tim_res = @es[eset].pins[pin_nam].t_res
65
+ % clk_per = @es[eset].pins[pin_nam].clk_per
66
+ % drv_on = format_uflex_edge(drv_on, line_cnt)
67
+ % drv_data = format_uflex_edge(drv_data, line_cnt)
68
+ % drv_ret = format_uflex_edge(drv_ret, line_cnt)
69
+ % drv_off = format_uflex_edge(drv_off, line_cnt)
70
+ % cmp_open = format_uflex_edge(cmp_open, line_cnt)
71
+ % cmp_close = format_uflex_edge(cmp_close, line_cnt)
72
+ % clk_per = format_uflex_edge(clk_per, line_cnt)
73
+ % if print_hdr
74
+ % print_hdr = false
75
+ % tim_mode = @es[eset].t_mode
76
+ <%= "DTEdgesetSheet,version=2.3:platform=Jaguar:toprow=-1:leftcol=-1:rightcol=-1\tEdge Sets" %>
77
+ <%= "" %>
78
+ <%= "\tTiming Mode:\t#{tim_mode}" %>
79
+ <%= "\tTime Domain:\t\t\t\tStrobe Ref Setup Name:" %>
80
+ <%= "" %>
81
+ <%= "\t\t\tData\t\tDrive\t\t\t\tCompare\t\t\t\tEdge Resolution" %>
82
+ <%= "\tPin/Group\tEdge Set\tSrc\tFmt\tOn\tData\tReturn\tOff\tMode\tOpen\tClose\tRef Offset\tMode\tComment" %>
83
+ % end
84
+ % if grp_edge_same
85
+ <%= "\t#{grp}\t#{eset}\t#{data_src}\t#{data_fmt}\t#{drv_on}\t#{drv_data}\t#{drv_ret}\t#{drv_off}\t#{cmp_mode}\t#{cmp_open}\t#{cmp_close}\t\t#{tim_res}" %>
86
+ % line_cnt += 1
87
+ % pin_grp_done = true
88
+ % else
89
+ <%= "\t#{pin_nam}\t#{eset}\t#{data_src}\t#{data_fmt}\t#{drv_on}\t#{drv_data}\t#{drv_ret}\t#{drv_off}\t#{cmp_mode}\t#{cmp_open}\t#{cmp_close}\t\t#{tim_res}" %>
90
+ % line_cnt += 1
91
+ % end
92
+ % end
93
+ % end
94
+ % end
95
+ %