origen_testers 0.5.7 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
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
+ %