circuitdata 0.6.4 → 0.7.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.
- checksums.yaml +5 -5
- data/README.md +25 -122
- data/Rakefile +4 -6
- data/lib/circuitdata.rb +32 -120
- data/lib/circuitdata/bury/bury.rb +61 -0
- data/lib/circuitdata/dereferencer.rb +49 -17
- data/lib/circuitdata/exposed_area.rb +84 -0
- data/lib/circuitdata/json_schema.rb +14 -0
- data/lib/circuitdata/json_validator.rb +56 -0
- data/lib/circuitdata/json_validator/json_schema_error_parser.rb +57 -0
- data/lib/circuitdata/material_validator.rb +40 -0
- data/lib/circuitdata/product.rb +125 -0
- data/lib/circuitdata/product_id_validator.rb +81 -0
- data/lib/circuitdata/profile.rb +31 -69
- data/lib/circuitdata/schema.rb +145 -0
- data/lib/circuitdata/schema_files/schema_v1_dereferenced.json +107155 -0
- data/lib/circuitdata/schema_files/v1/ottp_circuitdata_schema.json +68 -5307
- data/lib/circuitdata/schema_files/v1/ottp_circuitdata_schema_generics.json +23 -0
- data/lib/circuitdata/schema_files/v1/ottp_circuitdata_schema_materials.json +99 -0
- data/lib/circuitdata/schema_files/v1/ottp_circuitdata_schema_products.json +779 -0
- data/lib/circuitdata/schema_files/v1/ottp_circuitdata_schema_profiles_and_capabilities.json +323 -0
- data/lib/circuitdata/summary.rb +96 -0
- data/lib/circuitdata/validator.rb +28 -0
- data/lib/circuitdata/version.rb +2 -1
- metadata +113 -20
- data/lib/circuitdata/bk_comparer.rb +0 -106
- data/lib/circuitdata/compatibility_checker.rb +0 -160
- data/lib/circuitdata/file_comparer.rb +0 -276
- data/lib/circuitdata/schema_files/v1/ottp_circuitdata_schema_definitions.json +0 -1249
- data/lib/circuitdata/schema_files/v1/ottp_circuitdata_skeleton_schema.json +0 -94
- data/lib/circuitdata/schema_files/v1/ottp_schema_definitions.json +0 -102
- data/lib/circuitdata/tools.rb +0 -207
@@ -1,276 +0,0 @@
|
|
1
|
-
class Circuitdata::FileComparer
|
2
|
-
def initialize(file_hash, validate_origins)
|
3
|
-
@file_hash = file_hash
|
4
|
-
@validate_origins = validate_origins
|
5
|
-
@rows = {}
|
6
|
-
@nh = {} # a new_hash to combine all the data
|
7
|
-
@columns = []
|
8
|
-
@default_column = nil
|
9
|
-
@master_column = nil
|
10
|
-
# Final hash
|
11
|
-
@fh = {error: false, message: nil, conflict: false, product_name: nil, columns: nil, rows: nil}
|
12
|
-
end
|
13
|
-
|
14
|
-
def compare
|
15
|
-
# Initial check
|
16
|
-
unless @file_hash.is_a? Hash
|
17
|
-
@fh[:error] = true
|
18
|
-
@fh[:message] = 'You have to feed this function with a hash of names and hashes'
|
19
|
-
return @fh
|
20
|
-
end
|
21
|
-
|
22
|
-
# Process the hashes
|
23
|
-
products_array = []
|
24
|
-
@file_hash.each do |k, v|
|
25
|
-
# read content
|
26
|
-
@fh[:error], @fh[:message], file_content = Circuitdata.read_json(v)
|
27
|
-
return @fh if @fh[:error]
|
28
|
-
products, types = Circuitdata.get_data_summary(file_content)
|
29
|
-
products_array.push(*products) # add products to tracking array
|
30
|
-
# populate the new_hash to be used later
|
31
|
-
@nh[k] = {types: types, products: products, data: file_content}
|
32
|
-
end
|
33
|
-
|
34
|
-
# check if the files content meet the requirements
|
35
|
-
if valid_product?(products_array)
|
36
|
-
@fh[:product_name] = products_array.first.to_s
|
37
|
-
@columns = @nh.keys
|
38
|
-
# get all data with products in it
|
39
|
-
product_hashes = @nh.select{|k, v| v[:products].any?}
|
40
|
-
product_columns = product_hashes.keys
|
41
|
-
|
42
|
-
# Add conflicts into the new_hash
|
43
|
-
product_hashes.each do |column_k, column_v|
|
44
|
-
master_json = column_v.dig(:data)
|
45
|
-
@nh.each do |file_k, file_v|
|
46
|
-
products, data = file_v[:products], file_v[:data]
|
47
|
-
check_results = Circuitdata.compatibility_checker(master_json, data, false)
|
48
|
-
# format the conflicts correctly here
|
49
|
-
file_v[:conflicts] ||= {}
|
50
|
-
file_v[:conflicts][column_k] = get_validation_summary(check_results, file_k)
|
51
|
-
# initialize the rows format - for all the product items
|
52
|
-
product_hash = data.dig(:open_trade_transfer_package, :products, @fh[:product_name].to_sym, :printed_circuits_fabrication_data)
|
53
|
-
if products.any?
|
54
|
-
init_row_format(product_hash)
|
55
|
-
end
|
56
|
-
end
|
57
|
-
# Initialize the rows format - for all default profile items
|
58
|
-
@default_column, file_v = @nh.select{|k, v| v[:types].include?("profile_defaults")}.first # this should only be a single file
|
59
|
-
if @default_column.present?
|
60
|
-
data = file_v[:data]
|
61
|
-
product_hash = data.dig(:open_trade_transfer_package, :profiles, :defaults, :printed_circuits_fabrication_data)
|
62
|
-
init_row_format(product_hash)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
# populate the @rows
|
67
|
-
product_columns.each do |column|
|
68
|
-
@master_column = column
|
69
|
-
process_row_hash('populate')
|
70
|
-
end
|
71
|
-
# populate the @rows summary
|
72
|
-
product_columns.each do |column|
|
73
|
-
@master_column = column
|
74
|
-
process_row_hash('get_summary')
|
75
|
-
end
|
76
|
-
process_row_hash('populate_defaults')
|
77
|
-
end
|
78
|
-
|
79
|
-
@fh[:columns] = @columns.unshift(:summary)
|
80
|
-
@fh[:rows] = @rows
|
81
|
-
@fh
|
82
|
-
end
|
83
|
-
|
84
|
-
def init_row_format(product_hash)
|
85
|
-
product_hash.each do |k, v|
|
86
|
-
if v.is_a?(Hash)
|
87
|
-
@rows[k] ||= {}
|
88
|
-
v.each do |kl1, vl1|
|
89
|
-
@rows[k][kl1] ||= get_l1_hash(@columns)
|
90
|
-
end
|
91
|
-
else
|
92
|
-
@rows[k] ||= []
|
93
|
-
# if array functionality eg Holes
|
94
|
-
end if ['Hash', 'Array'].include?(v.class.name)
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
def process_row_hash(action)
|
99
|
-
@rows.each do |k, v| # product elements level
|
100
|
-
|
101
|
-
if v.is_a?(Hash)
|
102
|
-
v.each do |kl1, vl1| # specification level
|
103
|
-
value, conflict, conflicts_with, conflict_message = [], false, [], []
|
104
|
-
vl1.each do |kl2, vl2| # the specification column level - call the function from here
|
105
|
-
conflicts = @nh.dig(kl2, :conflicts, @master_column)
|
106
|
-
case action
|
107
|
-
when 'populate'
|
108
|
-
conflict = conflicts.dig(:rows, k, kl1)
|
109
|
-
check = conflicts.any? && conflict.present?
|
110
|
-
vl2[:value] = @nh.dig(kl2, :data, :open_trade_transfer_package, :products, @fh[:product_name].to_sym, :printed_circuits_fabrication_data, k, kl1)
|
111
|
-
vl2[:conflict] = check unless vl2[:conflict] # update only when the status is false
|
112
|
-
vl2[:conflicts_with] = check ? ((vl2[:conflicts_with] || []) << @master_column).uniq : vl2[:conflicts_with] || []
|
113
|
-
vl2[:conflict_message] = check ? ((vl2[:conflict_message] || []) + conflict).uniq : vl2[:conflict_message] || []
|
114
|
-
# update master_column conflicts with
|
115
|
-
if check
|
116
|
-
master_row = @rows.dig(k, kl1, @master_column)
|
117
|
-
master_row[:conflicts_with] = (master_row[:conflicts_with] + conflicts.dig(:master_conflicts)).uniq
|
118
|
-
master_row[:conflict] = true
|
119
|
-
master_row[:conflict_message] = (master_row[:conflict_message] + vl2[:conflict_message]).uniq
|
120
|
-
end
|
121
|
-
when 'get_summary'
|
122
|
-
# get the summary items
|
123
|
-
if kl2 != :summary
|
124
|
-
items_v = vl2[:value]
|
125
|
-
master_value = vl1.dig(@master_column, :value)
|
126
|
-
# dont test if the @master_column value is also nil
|
127
|
-
if value.empty? || !value.include?(items_v)
|
128
|
-
value << items_v
|
129
|
-
conflicts_with << kl2
|
130
|
-
# jump the default column
|
131
|
-
if kl2 != @master_column # Add errors to the specific rows items
|
132
|
-
# get the item type
|
133
|
-
col_type = get_column_type(@nh.dig(kl2, :types))
|
134
|
-
vl2[:conflict] = true
|
135
|
-
vl2[:conflicts_with] = (vl2[:conflicts_with] << @master_column).uniq
|
136
|
-
vl2[:conflict_message] = (vl2[:conflict_message] << customize_conflict_message(col_type, kl2, @master_column)).uniq
|
137
|
-
# update the master row
|
138
|
-
master_row = @rows.dig(k, kl1, @master_column)
|
139
|
-
master_row[:conflicts_with] = master_row[:conflicts_with] << kl2
|
140
|
-
master_row[:conflict] = true
|
141
|
-
# get a customized error message here
|
142
|
-
master_row[:conflict_message] = (master_row[:conflict_message] << customize_conflict_message(col_type, @master_column, kl2)).uniq
|
143
|
-
end
|
144
|
-
end unless items_v.nil? || master_value.nil?
|
145
|
-
conflict = true if vl2[:conflict]
|
146
|
-
conflicts_with = conflicts_with + vl2[:conflicts_with]
|
147
|
-
conflict_message = conflict_message + vl2[:conflict_message]
|
148
|
-
end
|
149
|
-
when 'populate_defaults'
|
150
|
-
if kl2 == @default_column
|
151
|
-
vl2[:value] = @nh.dig(kl2, :data, :open_trade_transfer_package, :profiles, :defaults, :printed_circuits_fabrication_data, k, kl1)
|
152
|
-
vl2[:conflict] = false
|
153
|
-
vl2[:conflicts_with] = []
|
154
|
-
vl2[:conflict_message] = []
|
155
|
-
end
|
156
|
-
end
|
157
|
-
end
|
158
|
-
case action
|
159
|
-
when 'get_summary'
|
160
|
-
if value.count > 1
|
161
|
-
conflict = true
|
162
|
-
else
|
163
|
-
value = value.first
|
164
|
-
end
|
165
|
-
vl1[:summary] = {value: value, conflict: conflict, conflicts_with: conflicts_with.uniq, conflict_message: conflict_message.uniq}
|
166
|
-
when 'populate_defaults'
|
167
|
-
# if all the values are blank, use the default value
|
168
|
-
vl1[:summary][:value] ||= vl1.dig(@default_column, :value)
|
169
|
-
end
|
170
|
-
if action == 'get_summary'
|
171
|
-
end
|
172
|
-
@fh[:conflict] = true if conflict
|
173
|
-
end
|
174
|
-
else
|
175
|
-
# if array functionality eg Holes
|
176
|
-
end
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
|
-
def customize_conflict_message(type, col, conflicting_col)
|
181
|
-
case type
|
182
|
-
when :product
|
183
|
-
"#{col.to_s} value conflicts with value from #{conflicting_col.to_s}"
|
184
|
-
when :restricted
|
185
|
-
"#{col.to_s} value is restricted in #{conflicting_col.to_s}"
|
186
|
-
when :enforced
|
187
|
-
"#{col.to_s} value conflicts with the enforced value from #{conflicting_col.to_s}"
|
188
|
-
when :capability
|
189
|
-
"#{col.to_s} value is outside the capabilities of #{conflicting_col.to_s}"
|
190
|
-
else
|
191
|
-
"There were some value conflicts"
|
192
|
-
end
|
193
|
-
end
|
194
|
-
|
195
|
-
def get_column_type(types)
|
196
|
-
types ||= []
|
197
|
-
if types.include? "product"
|
198
|
-
:product
|
199
|
-
elsif types.include? "profile_restricted"
|
200
|
-
:restricted
|
201
|
-
elsif types.include? "profile_enforced"
|
202
|
-
:enforced
|
203
|
-
elsif types.include? "capabilities"
|
204
|
-
:capability
|
205
|
-
end
|
206
|
-
end
|
207
|
-
|
208
|
-
def get_validation_summary(validation, column)
|
209
|
-
summary = {}
|
210
|
-
if validation[:error]
|
211
|
-
summary[:master_conflicts] ||= []
|
212
|
-
summary[:master_conflicts] << column
|
213
|
-
summary[:conflicts], summary[:rows] = true, {}
|
214
|
-
validation[:errors].each do |type, errors| # validation, restricted, enforced, capabilities
|
215
|
-
errors.each do |k, v|
|
216
|
-
folders_stack = k.split('/')
|
217
|
-
folder, spec = folders_stack[5], folders_stack[6]
|
218
|
-
if folder.nil?
|
219
|
-
get_other_conflicts(summary[:rows], v, 'l1')
|
220
|
-
else
|
221
|
-
summary[:rows][folder.to_sym] ||= {}
|
222
|
-
if spec.nil?
|
223
|
-
get_other_conflicts(summary[:rows][folder.to_sym], v, 'l2')
|
224
|
-
else
|
225
|
-
summary[:rows][folder.to_sym][spec.to_sym] ||= []
|
226
|
-
summary[:rows][folder.to_sym][spec.to_sym] = summary[:rows][folder.to_sym][spec.to_sym] + v
|
227
|
-
end
|
228
|
-
end
|
229
|
-
end if errors.any?
|
230
|
-
end
|
231
|
-
end
|
232
|
-
summary
|
233
|
-
end
|
234
|
-
|
235
|
-
def get_other_conflicts(hash, v, level)
|
236
|
-
hash[:not_allowed] ||= []
|
237
|
-
hash[:messages] ||= []
|
238
|
-
not_allowed, messages = [], []
|
239
|
-
if v.is_a? Array
|
240
|
-
# get items that are not allowed
|
241
|
-
msg = v.select{|e| e.include?('contains additional properties [')}.first
|
242
|
-
not_allowed = eval(msg[/properties(.*?)outside/m, 1]) rescue []
|
243
|
-
messages << "#{not_allowed.to_sentence} are not allowed" if not_allowed.any?
|
244
|
-
# get other conflicts
|
245
|
-
messages = messages + v.select{|e| !e.include?('contains additional properties [')}
|
246
|
-
end
|
247
|
-
if not_allowed.any? && level == 'l2'
|
248
|
-
not_allowed.each do |spec|
|
249
|
-
hash[spec.to_sym] ||= []
|
250
|
-
hash[spec.to_sym] = hash[spec.to_sym] << "#{spec} is not a allowed element"
|
251
|
-
end
|
252
|
-
end
|
253
|
-
hash[:not_allowed] = (hash[:not_allowed] + not_allowed).uniq
|
254
|
-
hash[:messages] = (hash[:messages] + messages).uniq
|
255
|
-
end
|
256
|
-
|
257
|
-
def get_l1_hash(columns)
|
258
|
-
l1_hash = {}
|
259
|
-
columns.each{|c| l1_hash[c]={} }
|
260
|
-
l1_hash
|
261
|
-
end
|
262
|
-
|
263
|
-
def valid_product?(products_array)
|
264
|
-
if products_array.uniq.count > 1
|
265
|
-
@fh[:error] = true
|
266
|
-
@fh[:message] = 'Your files contains several different product names'
|
267
|
-
return false # validation fails because of different product names
|
268
|
-
end
|
269
|
-
if products_array.empty?
|
270
|
-
@fh[:error] = true
|
271
|
-
@fh[:message] = 'None of the files contains a product'
|
272
|
-
return false # c=validation fails because there are no products
|
273
|
-
end
|
274
|
-
true
|
275
|
-
end
|
276
|
-
end
|
@@ -1,1249 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"definitions": {
|
3
|
-
"version": {
|
4
|
-
"type": "string",
|
5
|
-
"pattern": "^0.6$"
|
6
|
-
},
|
7
|
-
"stackup_specific": {
|
8
|
-
"layer_order": {
|
9
|
-
"type": "integer"
|
10
|
-
},
|
11
|
-
"layer_name": {
|
12
|
-
"type": "string"
|
13
|
-
}
|
14
|
-
},
|
15
|
-
"custom": {
|
16
|
-
"soldermasks": {
|
17
|
-
"type": "object",
|
18
|
-
"additionalProperties": false,
|
19
|
-
"required": ["name"],
|
20
|
-
"properties": {
|
21
|
-
"name": {
|
22
|
-
"type": "string",
|
23
|
-
"uom": null,
|
24
|
-
"description": "The name of the Soldermask. Use the official name or some name as close to it as possible"
|
25
|
-
},
|
26
|
-
"manufacturer": {
|
27
|
-
"type": "string",
|
28
|
-
"uom": null,
|
29
|
-
"description": "The name of the manufacturer"
|
30
|
-
},
|
31
|
-
"ipc_sm_840_class": {
|
32
|
-
"type": "string",
|
33
|
-
"enum": ["T", "H"],
|
34
|
-
"uom": null,
|
35
|
-
"description": "Soldermask to meet IPC SM 840 Class."
|
36
|
-
},
|
37
|
-
"link": {
|
38
|
-
"type": "string",
|
39
|
-
"uom": null,
|
40
|
-
"description": "The link to some url that gives more information or a reference to the product."
|
41
|
-
},
|
42
|
-
"accept_equivalent": {
|
43
|
-
"type": "boolean",
|
44
|
-
"uom": null,
|
45
|
-
"description": "Equivalent material to the one specified is OK to use as a replacement if true."
|
46
|
-
}
|
47
|
-
},
|
48
|
-
"aliases": "",
|
49
|
-
"descriptive_name": "Soldermasks",
|
50
|
-
"description": "Materials used as soldermask"
|
51
|
-
},
|
52
|
-
"dielectrics": {
|
53
|
-
"type": "object",
|
54
|
-
"additionalProperties": false,
|
55
|
-
"required": ["name"],
|
56
|
-
"properties": {
|
57
|
-
"name": {
|
58
|
-
"type": "string",
|
59
|
-
"uom": null,
|
60
|
-
"description": "The name of the Laminate. Use the official name or some name as close to it as possible."
|
61
|
-
},
|
62
|
-
"manufacturer": {
|
63
|
-
"type": "string",
|
64
|
-
"uom": null,
|
65
|
-
"description": "The name of the manufacturer"
|
66
|
-
},
|
67
|
-
"ipc_4101_sheet": {
|
68
|
-
"type": "integer",
|
69
|
-
"uom": null,
|
70
|
-
"description": "The reference sheet number of the IPC 4101 Standard."
|
71
|
-
},
|
72
|
-
"ipc_4103_sheet": {
|
73
|
-
"type": "integer",
|
74
|
-
"uom": null,
|
75
|
-
"description": "The reference sheet number of the IPC 4103 Standard."
|
76
|
-
},
|
77
|
-
"ipc_4204_sheet": {
|
78
|
-
"type": "integer",
|
79
|
-
"uom": null,
|
80
|
-
"description": "The reference sheet number of the IPC 4204 Standard."
|
81
|
-
},
|
82
|
-
"tg_min": {
|
83
|
-
"type": "integer",
|
84
|
-
"uom": null,
|
85
|
-
"description": "The minimum Glass Transition Temperature (Tg) required."
|
86
|
-
},
|
87
|
-
"tg_range_from": {
|
88
|
-
"type": "integer",
|
89
|
-
"uom": null,
|
90
|
-
"description": "The Glass Transition Temperature (Tg) range starts at."
|
91
|
-
},
|
92
|
-
"tg_range_to": {
|
93
|
-
"type": "integer",
|
94
|
-
"uom": null,
|
95
|
-
"description": "The Glass Transition Temperature (Tg) range ands at."
|
96
|
-
},
|
97
|
-
"td_min": {
|
98
|
-
"type": "integer",
|
99
|
-
"uom": null,
|
100
|
-
"description": "The minimum required temperature at which a base laminate material experiences an established percentage of weight loss using Thermograv imetric Analysis (TGA)."
|
101
|
-
},
|
102
|
-
"td_range_from": {
|
103
|
-
"type": "integer",
|
104
|
-
"uom": null,
|
105
|
-
"description": "The Td range starts at."
|
106
|
-
},
|
107
|
-
"td_range_to": {
|
108
|
-
"type": "integer",
|
109
|
-
"uom": null,
|
110
|
-
"description": "The Td range stops at."
|
111
|
-
},
|
112
|
-
"halogen_free": {
|
113
|
-
"type": "boolean",
|
114
|
-
"uom": null,
|
115
|
-
"description": "Indicates the material is material free or is required to be"
|
116
|
-
},
|
117
|
-
"rw_en45545_2_2013": {
|
118
|
-
"type": "boolean",
|
119
|
-
"uom": null,
|
120
|
-
"description": "Railway Europe EN45545-2:2013 compatible"
|
121
|
-
},
|
122
|
-
"rw_nf_f_16_101": {
|
123
|
-
"type": "boolean",
|
124
|
-
"uom": null,
|
125
|
-
"description": "Railway France NF F 16-101 compatible"
|
126
|
-
},
|
127
|
-
"rw_uni_cei_11170_3": {
|
128
|
-
"type": "boolean",
|
129
|
-
"uom": null,
|
130
|
-
"description": "Railway Italy UNI CEI 11170-3 compatible."
|
131
|
-
},
|
132
|
-
"rw_nfpa_130": {
|
133
|
-
"type": "boolean",
|
134
|
-
"uom": null,
|
135
|
-
"description": "Railway USA NFPA 130 compatible."
|
136
|
-
},
|
137
|
-
"ul": {
|
138
|
-
"type": "boolean",
|
139
|
-
"uom": null,
|
140
|
-
"description": "UL compatible."
|
141
|
-
},
|
142
|
-
"link": {
|
143
|
-
"type": "string",
|
144
|
-
"uom": null,
|
145
|
-
"description": "The link to some url that gives more information or a reference to the product."
|
146
|
-
},
|
147
|
-
"accept_equivalent": {
|
148
|
-
"type": "boolean",
|
149
|
-
"uom": null,
|
150
|
-
"description": "Equivalent material to the one specified is OK to use as a replacement if true."
|
151
|
-
}
|
152
|
-
},
|
153
|
-
"aliases": "",
|
154
|
-
"descriptive_name": "Dielectrics",
|
155
|
-
"description": "Materials used as dielectrics/laminates"
|
156
|
-
},
|
157
|
-
"stiffeners": {
|
158
|
-
"type": "array",
|
159
|
-
"additionalProperties": false,
|
160
|
-
"required": ["name"],
|
161
|
-
"properties": {
|
162
|
-
"descriptive_name": {
|
163
|
-
"type": "string",
|
164
|
-
"uom": null,
|
165
|
-
"description": "The name of the stiffener. Use the official name or some name as close to it as possible"
|
166
|
-
},
|
167
|
-
"manufacturer": {
|
168
|
-
"type": "string",
|
169
|
-
"uom": null,
|
170
|
-
"description": "The name of the manufacturer"
|
171
|
-
},
|
172
|
-
"link": {
|
173
|
-
"type": "string",
|
174
|
-
"uom": null,
|
175
|
-
"description": "The link to some url that gives more information or a reference to the product."
|
176
|
-
},
|
177
|
-
"accept_equivalent": {
|
178
|
-
"type": "boolean",
|
179
|
-
"uom": null,
|
180
|
-
"description": "Equivalent material to the one specified is OK to use as a replacement if true."
|
181
|
-
}
|
182
|
-
},
|
183
|
-
"aliases": "",
|
184
|
-
"descriptive_name": "Stiffener",
|
185
|
-
"uom": null,
|
186
|
-
"description": "The materials to be used as stiffener"
|
187
|
-
}
|
188
|
-
},
|
189
|
-
"generics": {
|
190
|
-
"thickness_min_micron": {
|
191
|
-
"type": "number",
|
192
|
-
"uom": ["um"],
|
193
|
-
"description": "The minimum thickness."
|
194
|
-
},
|
195
|
-
"thickness_max_micron": {
|
196
|
-
"type": "number",
|
197
|
-
"uom": ["um"],
|
198
|
-
"description": "The maximum thickness."
|
199
|
-
},
|
200
|
-
"presence_top_boolean": {
|
201
|
-
"type": "boolean",
|
202
|
-
"uom": null,
|
203
|
-
"description": "Indicates presence/capability on top"
|
204
|
-
},
|
205
|
-
"presence_bottom_boolean": {
|
206
|
-
"type": "boolean",
|
207
|
-
"uom": null,
|
208
|
-
"description": "Indicates presence/capability at bottom"
|
209
|
-
},
|
210
|
-
"numeric_single_or_range": {
|
211
|
-
"type": "string",
|
212
|
-
"pattern": "^[-+]?([0-9]*\\.[0-9]+|[0-9]+)$|^([0-9]*|[0-9].[0-9]*)\\.\\.\\.([0-9]|[0-9].[0-9]*)$"
|
213
|
-
},
|
214
|
-
"boolean_true_false_or_both": {
|
215
|
-
"type": "string",
|
216
|
-
"pattern": "^[t,T][r,R][u,U][e,E]$|^[f,F][a,A][l,L][s,S][e,E]$|^[t,T][r,R][u,U][e,E],.[f,F][a,A][l,L][s,S][e,E]$|^[f,F][a,A][l,L][s,S][e,E],.[t,T][r,R][u,U][e,E]$"
|
217
|
-
},
|
218
|
-
"range": {
|
219
|
-
"type": "string",
|
220
|
-
"pattern": "^(\\d*|\\d*.\\d*)\\.\\.\\.(\\d*|\\d*.\\d*)$"
|
221
|
-
},
|
222
|
-
"number": {
|
223
|
-
"type": "number"
|
224
|
-
},
|
225
|
-
"string": {
|
226
|
-
"type": "string"
|
227
|
-
}
|
228
|
-
},
|
229
|
-
"elements": {
|
230
|
-
"stackup": {
|
231
|
-
"specification_level": {
|
232
|
-
"type": "string",
|
233
|
-
"enum": ["free", "separate_file", "specified"],
|
234
|
-
"enum_description": {
|
235
|
-
"free": "The manufacturer can choose the stackup that matches the rest of the requirements",
|
236
|
-
"separate_file": "A file is supplied with the package that will contain the actual stackup",
|
237
|
-
"specified": "The actual stackup is under the stackup->specified element"
|
238
|
-
},
|
239
|
-
"uom": null,
|
240
|
-
"description": "The stack up of this board"
|
241
|
-
},
|
242
|
-
"file_name": {
|
243
|
-
"type": "string",
|
244
|
-
"format": "uri",
|
245
|
-
"uom": null,
|
246
|
-
"description": "The URI of the file that specifies the stackup. Either as a path witin a project compressed file (ZIP) or as a link"
|
247
|
-
}
|
248
|
-
},
|
249
|
-
"conductive_layer": {
|
250
|
-
"count": {
|
251
|
-
"type": "number",
|
252
|
-
"uom": null,
|
253
|
-
"description": "The number of conductive layers.",
|
254
|
-
"minimum": 1,
|
255
|
-
"maximum": 100,
|
256
|
-
"multipleOf": 1.0
|
257
|
-
},
|
258
|
-
"minimum_internal_track_width": {
|
259
|
-
"type": "number",
|
260
|
-
"uom": ["mm"],
|
261
|
-
"description": "The minimum nominal width of conductors on internal/unplated layers (minimum track)."
|
262
|
-
},
|
263
|
-
"minimum_external_track_width": {
|
264
|
-
"type": "number",
|
265
|
-
"uom": ["mm"],
|
266
|
-
"description": "The minimum nominal width of conductors on external/plated layers (minimum track). If only only one minimum track is present, is should be here."
|
267
|
-
},
|
268
|
-
"minimum_internal_spacing_width": {
|
269
|
-
"type": "number",
|
270
|
-
"uom": ["mm"],
|
271
|
-
"description": "The minimum gap between two conductors on the internal layers."
|
272
|
-
},
|
273
|
-
"minimum_external_spacing_width": {
|
274
|
-
"type": "number",
|
275
|
-
"uom": ["mm"],
|
276
|
-
"description": "The minimum gap between two conductors on the external layers. If only one minimum gap is present, is should be here."
|
277
|
-
},
|
278
|
-
"external_base_copper_thickness": {
|
279
|
-
"type": "number",
|
280
|
-
"enum": [5.1, 8.5, 12, 17.1, 25.7, 34.3, 68.6, 102.9, 137.2, 171.5, 205.7, 240, 342.9, 480.1],
|
281
|
-
"uom": ["um"],
|
282
|
-
"description": "Finished base copper thickness following IPC Class on the up to two external layers"
|
283
|
-
},
|
284
|
-
"internal_base_copper_thickness": {
|
285
|
-
"type": "number",
|
286
|
-
"enum": [5.1, 8.5, 12, 17.1, 25.7, 34.3, 68.6, 102.9, 137.2, 171.5, 205.7, 240, 342.9, 480.1],
|
287
|
-
"uom": ["um"],
|
288
|
-
"description": "Finished base copper thickness following IPC Class on the internal layers"
|
289
|
-
},
|
290
|
-
"copper_foil_roughness": {
|
291
|
-
"type": "string",
|
292
|
-
"enum": ["S", "L", "V"],
|
293
|
-
"enum_description": {
|
294
|
-
"S": "Standard profile",
|
295
|
-
"L": "Low profile",
|
296
|
-
"V": "Very low profile"
|
297
|
-
},
|
298
|
-
"uom": null,
|
299
|
-
"description": "The roughness of the copper foil"
|
300
|
-
},
|
301
|
-
"copper_foil_type": {
|
302
|
-
"type": "string",
|
303
|
-
"enum": ["ED", "RA"],
|
304
|
-
"enum_description": {
|
305
|
-
"ED": "Electro Deposited",
|
306
|
-
"RA": "Rolled Annealed Copper"
|
307
|
-
},
|
308
|
-
"uom": null,
|
309
|
-
"description": "The type of copper foil"
|
310
|
-
},
|
311
|
-
"copper_coverage_average": {
|
312
|
-
"type": "number",
|
313
|
-
"uom": ["%"],
|
314
|
-
"description": "The average copper coverage of the board"
|
315
|
-
}
|
316
|
-
},
|
317
|
-
"dielectric": {
|
318
|
-
"name": {
|
319
|
-
"type": "string",
|
320
|
-
"uom": null,
|
321
|
-
"description": "The name of the Laminate. Use the official name or some name as close to it as possible"
|
322
|
-
},
|
323
|
-
"manufacturer": {
|
324
|
-
"type": "string",
|
325
|
-
"uom": null,
|
326
|
-
"description": "The name of the manufacturer"
|
327
|
-
},
|
328
|
-
"ipc_4101_sheet": {
|
329
|
-
"type": "integer",
|
330
|
-
"uom": null,
|
331
|
-
"description": "The reference sheet number of the IPC 4101 Standard"
|
332
|
-
},
|
333
|
-
"ipc_4103_sheet": {
|
334
|
-
"type": "integer",
|
335
|
-
"uom": null,
|
336
|
-
"description": "The reference sheet number of the IPC 4103 Standard"
|
337
|
-
},
|
338
|
-
"ipc_4204_sheet": {
|
339
|
-
"type": "integer",
|
340
|
-
"uom": null,
|
341
|
-
"description": "The reference sheet number of the IPC 4204 Standard"
|
342
|
-
},
|
343
|
-
"tg_min": {
|
344
|
-
"type": "integer",
|
345
|
-
"uom": null,
|
346
|
-
"description": "The minimum Glass Transition Temperature (Tg) required"
|
347
|
-
},
|
348
|
-
"tg_range_from": {
|
349
|
-
"type": "integer",
|
350
|
-
"uom": null,
|
351
|
-
"description": "The Glass Transition Temperature (Tg) range starts at"
|
352
|
-
},
|
353
|
-
"tg_range_to": {
|
354
|
-
"type": "integer",
|
355
|
-
"uom": null,
|
356
|
-
"description": "The Glass Transition Temperature (Tg) range ands at"
|
357
|
-
},
|
358
|
-
"td_min": {
|
359
|
-
"type": "integer",
|
360
|
-
"uom": null,
|
361
|
-
"description": "The minimum required temperature at which a base laminate material experiences an established percentage of weight loss using Thermograv imetric Analysis (TGA)"
|
362
|
-
},
|
363
|
-
"td_range_from": {
|
364
|
-
"type": "integer",
|
365
|
-
"uom": null,
|
366
|
-
"description": "The Td range starts at"
|
367
|
-
},
|
368
|
-
"td_range_to": {
|
369
|
-
"type": "integer",
|
370
|
-
"uom": null,
|
371
|
-
"description": "The Td range stops at"
|
372
|
-
},
|
373
|
-
"halogen_free": {
|
374
|
-
"type": "boolean",
|
375
|
-
"uom": null,
|
376
|
-
"description": "Indicates the material is material free or is required to be"
|
377
|
-
},
|
378
|
-
"rw_en45545_2_2013": {
|
379
|
-
"type": "boolean",
|
380
|
-
"uom": null,
|
381
|
-
"description": "Railway Europe EN45545-2:2013 compatible"
|
382
|
-
},
|
383
|
-
"rw_nf_f_16_101": {
|
384
|
-
"type": "boolean",
|
385
|
-
"uom": null,
|
386
|
-
"description": "Railway France NF F 16-101 compatible"
|
387
|
-
},
|
388
|
-
"rw_uni_cei_11170_3": {
|
389
|
-
"type": "boolean",
|
390
|
-
"uom": null,
|
391
|
-
"description": "Railway Italy UNI CEI 11170-3 compatible"
|
392
|
-
},
|
393
|
-
"rw_nfpa_130": {
|
394
|
-
"type": "boolean",
|
395
|
-
"uom": null,
|
396
|
-
"description": "Railway USA NFPA 130 compatible"
|
397
|
-
},
|
398
|
-
"ul": {
|
399
|
-
"type": "boolean",
|
400
|
-
"uom": null,
|
401
|
-
"description": "UL compatible"
|
402
|
-
},
|
403
|
-
"link": {
|
404
|
-
"type": "string",
|
405
|
-
"uom": null,
|
406
|
-
"description": "The link to some url that gives more information or a reference to the product"
|
407
|
-
},
|
408
|
-
"accept_equivalent": {
|
409
|
-
"type": "boolean",
|
410
|
-
"uom": null,
|
411
|
-
"description": "Equivalent material to the one specified is OK to use as a replacement if true"
|
412
|
-
},
|
413
|
-
"aliases": "",
|
414
|
-
"descriptive_name": "Dielectrics",
|
415
|
-
"description": "Materials used as dielectrics/laminates"
|
416
|
-
},
|
417
|
-
"final_finish": {
|
418
|
-
"finish": {
|
419
|
-
"type": "string",
|
420
|
-
"enum": ["none", "c_bare_copper", "isn", "iag", "enig", "enepig", "osp", "ht_osp", "g", "GS", "t_fused", "tlu_unfused", "dig", "gwb-1_ultrasonic", "gwb-2-thermosonic", "s_hasl", "b1_lfhasl"],
|
421
|
-
"enum_description": {
|
422
|
-
"none": "No final finish should be used",
|
423
|
-
"c_bare_copper": "AABUS",
|
424
|
-
"isn": "IPC-4554 Immersion Tin",
|
425
|
-
"iag": "IPC-4553 Immersion Silver",
|
426
|
-
"enig": "IPC-4552 Immersion Gold",
|
427
|
-
"enepig": "IPC-4556 ENEPIG",
|
428
|
-
"osp": "J-STD-003 Organic Solderability Preservative",
|
429
|
-
"ht_osp": "J-STD-003 High Temperature OSP",
|
430
|
-
"g": "ASTM-B-488 Gold for edge printed board connectors and areas not to be soldered",
|
431
|
-
"GS": "J-STD-003 Gold Electroplate on areas to be soldered",
|
432
|
-
"t_fused": "J-STD-003 Electrodeposited Tin-Lead (fused)",
|
433
|
-
"tlu_unfused": "J-STD-003 Electrodeposited Tin-Lead Unfused",
|
434
|
-
"dig": "J-STD-003 Direct Immersion Gold (Solderable Surface)",
|
435
|
-
"gwb-1_ultrasonic": "ASTM-B-488 Gold Electroplate for areas to be wire bonded (ultrasonic)",
|
436
|
-
"gwb-2-thermosonic": "ASTM-B-488 Gold Electroplate for areas to be wire bonded (thermosonic)",
|
437
|
-
"s_hasl": "J-STD-003_J-STD-006 Solder Coating over Bare Copper (HASL)",
|
438
|
-
"b1_lfhasl": "J-STD-003_J-STD-006 Lead-Free Solder Coating over Bare Copper (Lead-Free HASL, Lead free HASL)"
|
439
|
-
},
|
440
|
-
"uom": null,
|
441
|
-
"description": "The material/method/surface to be used in the finish"
|
442
|
-
},
|
443
|
-
"area": {
|
444
|
-
"type": "number",
|
445
|
-
"uom": ["dm2"],
|
446
|
-
"description": "The area that the finish will cover"
|
447
|
-
}
|
448
|
-
},
|
449
|
-
"soldermask": {
|
450
|
-
"color": {
|
451
|
-
"type": "string",
|
452
|
-
"uom": null,
|
453
|
-
"description": "This describes the color based on the name of the color; green, black, blue, red, white, yellow. If a specific color needs to be defined, this can be done custom -> colors section"
|
454
|
-
},
|
455
|
-
"finish": {
|
456
|
-
"type": "string",
|
457
|
-
"enum": ["matte", "semi-matte", "glossy", "any"],
|
458
|
-
"uom": null,
|
459
|
-
"description": "The finish of the soldermask"
|
460
|
-
},
|
461
|
-
"material": {
|
462
|
-
"type": "string",
|
463
|
-
"uom": null,
|
464
|
-
"description": "The name of a material that appears in the materials section"
|
465
|
-
},
|
466
|
-
"allow_touchups": {
|
467
|
-
"type": "boolean",
|
468
|
-
"uom": null,
|
469
|
-
"description": "The manufacturer is allowed to do touchups on the soldermask if true"
|
470
|
-
}
|
471
|
-
},
|
472
|
-
"legend": {
|
473
|
-
"color": {
|
474
|
-
"type": "string",
|
475
|
-
"uom": null,
|
476
|
-
"description": "This describes the color based on the name of the color; white, yellow. If a specific color needs to be defined, this can be done custom -> colors section"
|
477
|
-
}
|
478
|
-
},
|
479
|
-
"stiffener": {
|
480
|
-
"size": {
|
481
|
-
"type": "number",
|
482
|
-
"uom": ["um"],
|
483
|
-
"description": "The size of the stiffener should be specified in drawing"
|
484
|
-
},
|
485
|
-
"placement": {
|
486
|
-
"type": "string",
|
487
|
-
"enum": ["top", "bottom"],
|
488
|
-
"enum_description": {
|
489
|
-
"top": "The stiffener is on top of the flexible layer(s)",
|
490
|
-
"bottom": "The stiffener is below the flexible layer(s)"
|
491
|
-
},
|
492
|
-
"uom": null,
|
493
|
-
"description": "Indicating if the stiffener is on top or bottom of the flexible layer"
|
494
|
-
},
|
495
|
-
"thickness": {
|
496
|
-
"type": "number",
|
497
|
-
"uom": ["um"],
|
498
|
-
"description": "The thickness of the stiffener"
|
499
|
-
},
|
500
|
-
"material": {
|
501
|
-
"type": "string",
|
502
|
-
"uom": null,
|
503
|
-
"description": "The name of a material that appears in the materials section"
|
504
|
-
}
|
505
|
-
},
|
506
|
-
"coverlay": {
|
507
|
-
"total_thickness": {
|
508
|
-
"type": "number",
|
509
|
-
"uom": null,
|
510
|
-
"description": "The total thickness of the coverlay"
|
511
|
-
},
|
512
|
-
"material": {
|
513
|
-
"type": "string",
|
514
|
-
"uom": null,
|
515
|
-
"description": "The name of a material that appears in the materials -> soldermask section"
|
516
|
-
}
|
517
|
-
},
|
518
|
-
"peelable_mask": {
|
519
|
-
"heating_operations": {
|
520
|
-
"type": "integer",
|
521
|
-
"uom": null,
|
522
|
-
"description": ""
|
523
|
-
}
|
524
|
-
},
|
525
|
-
"kapton_tape": {
|
526
|
-
"accept_equivalent": {
|
527
|
-
"type": "boolean",
|
528
|
-
"uom": null,
|
529
|
-
"description": "If alternative to DuPont™ Kapton® HN general-purpose film can be used"
|
530
|
-
}
|
531
|
-
},
|
532
|
-
"inner_packaging": {
|
533
|
-
"type_of_bag": {
|
534
|
-
"type": "string",
|
535
|
-
"enum": ["a", "b", "c", "d"],
|
536
|
-
"enum_description": {
|
537
|
-
"a": "Nylon/Foil/Polyethylene",
|
538
|
-
"b": "TyvekTM/Foil/Polyethylene",
|
539
|
-
"c": "Aluminized Polyester/Polyethylene",
|
540
|
-
"d": "Plastics/Polymers (non-metallic)"
|
541
|
-
},
|
542
|
-
"uom": null,
|
543
|
-
"description": "The material of the bag to be used"
|
544
|
-
},
|
545
|
-
"hic": {
|
546
|
-
"type": "boolean",
|
547
|
-
"uom": null,
|
548
|
-
"description": "True to include a Humidity Indicator Card (HIC), False to not"
|
549
|
-
},
|
550
|
-
"esd": {
|
551
|
-
"type": "boolean",
|
552
|
-
"uom": null,
|
553
|
-
"description": "True to indicate that packaging for ESD-sensitive required"
|
554
|
-
},
|
555
|
-
"desiccant": {
|
556
|
-
"type": "boolean",
|
557
|
-
"uom": null,
|
558
|
-
"description": "True to indicate that a desiccant material is required"
|
559
|
-
},
|
560
|
-
"vacuum": {
|
561
|
-
"type": "boolean",
|
562
|
-
"uom": null,
|
563
|
-
"description": "True to indicate that vacuum is needed for shrinkage - no heat rap or shrink rap allowed"
|
564
|
-
}
|
565
|
-
},
|
566
|
-
"via_protection": {
|
567
|
-
"type_1": {
|
568
|
-
"type": "boolean",
|
569
|
-
"uom": null,
|
570
|
-
"description": "A via with a dry film mask material applied bridging over the via wherein no additional materials are in the hole"
|
571
|
-
},
|
572
|
-
"type_2": {
|
573
|
-
"type": "boolean",
|
574
|
-
"uom": null,
|
575
|
-
"description": "A Type I via with a secondary covering of mask material applied over the tented via"
|
576
|
-
},
|
577
|
-
"type_3": {
|
578
|
-
"type": "boolean",
|
579
|
-
"uom": null,
|
580
|
-
"description": "A via with material applied allowing partial penetration into the via. The plug material may be applied from one or both sides"
|
581
|
-
},
|
582
|
-
"type_4a": {
|
583
|
-
"type": "boolean",
|
584
|
-
"uom": null,
|
585
|
-
"description": "A Type III via with a secondary covering of material applied over the via. The plug material may be applied from one or both sides"
|
586
|
-
},
|
587
|
-
"type_4b": {
|
588
|
-
"type": "boolean",
|
589
|
-
"uom": null,
|
590
|
-
"description": "A Type III via with a secondary covering of material applied over the via. The plug material may be applied from one or both sides"
|
591
|
-
},
|
592
|
-
"type_5": {
|
593
|
-
"type": "boolean",
|
594
|
-
"uom": null,
|
595
|
-
"description": "A via with material applied into the via targeting a full penetration and encapsulation of the hole"
|
596
|
-
},
|
597
|
-
"type_6a": {
|
598
|
-
"type": "boolean",
|
599
|
-
"uom": null,
|
600
|
-
"description": "A Type V via with a secondary covering of material (liquid or dry film soldermask) applied over the via. The plug material may be applied from one or both sides"
|
601
|
-
},
|
602
|
-
"type_6b": {
|
603
|
-
"type": "boolean",
|
604
|
-
"uom": null,
|
605
|
-
"description": "A Type V via with a secondary covering of material (liquid or dry film soldermask) applied over the via. The plug material may be applied from one or both sides"
|
606
|
-
},
|
607
|
-
"type_7": {
|
608
|
-
"type": "boolean",
|
609
|
-
"uom": null,
|
610
|
-
"description": "A Type V via with a secondary metallized coating covering the via. The metallization is on both sides"
|
611
|
-
}
|
612
|
-
},
|
613
|
-
"board": {
|
614
|
-
"size_x": {
|
615
|
-
"type": "number",
|
616
|
-
"uom": ["mm"],
|
617
|
-
"description": "The size of the board in the x-asis"
|
618
|
-
},
|
619
|
-
"size_y": {
|
620
|
-
"type": "number",
|
621
|
-
"uom": ["mm"],
|
622
|
-
"description": "The size of the board in the y-asis"
|
623
|
-
},
|
624
|
-
"thickness": {
|
625
|
-
"type": "number",
|
626
|
-
"uom": ["mm"],
|
627
|
-
"description": "The thickness of the board"
|
628
|
-
}
|
629
|
-
},
|
630
|
-
"array": {
|
631
|
-
"size_x": {
|
632
|
-
"type": "number",
|
633
|
-
"uom": ["mm"],
|
634
|
-
"description": "The size of the array in the x-asis"
|
635
|
-
},
|
636
|
-
"size_y": {
|
637
|
-
"type": "number",
|
638
|
-
"uom": ["mm"],
|
639
|
-
"description": "The size of the array in the y-asis"
|
640
|
-
},
|
641
|
-
"boards_x": {
|
642
|
-
"type": "integer",
|
643
|
-
"uom": null,
|
644
|
-
"description": "Number of boards in the panel in the x-direction"
|
645
|
-
},
|
646
|
-
"boards_y": {
|
647
|
-
"type": "integer",
|
648
|
-
"uom": null,
|
649
|
-
"description": "Number of boards in the panel in the y-direction"
|
650
|
-
},
|
651
|
-
"boards_total": {
|
652
|
-
"type": "integer",
|
653
|
-
"uom": ["mm"],
|
654
|
-
"description": "Number total number of boards in the panel. This is not the preferred method of stating the number, \"boards_x\" and \"boards_y\" should be used"
|
655
|
-
},
|
656
|
-
"border_left": {
|
657
|
-
"type": "number",
|
658
|
-
"uom": ["mm"],
|
659
|
-
"description": "The size of the left side boarder between the edge and the board"
|
660
|
-
},
|
661
|
-
"border_right": {
|
662
|
-
"type": "number",
|
663
|
-
"uom": ["mm"],
|
664
|
-
"description": "The size of the right side boarder between the edge and the board"
|
665
|
-
},
|
666
|
-
"border_top": {
|
667
|
-
"type": "number",
|
668
|
-
"uom": ["mm"],
|
669
|
-
"description": "The size of the top side boarder between the edge and the board"
|
670
|
-
},
|
671
|
-
"border_bottom": {
|
672
|
-
"type": "number",
|
673
|
-
"uom": ["mm"],
|
674
|
-
"description": "The size of the bottom side boarder between the edge and the board"
|
675
|
-
},
|
676
|
-
"board_spacing_x": {
|
677
|
-
"type": "number",
|
678
|
-
"uom": ["mm"],
|
679
|
-
"description": "The size of the space between the boards in the x-direction"
|
680
|
-
},
|
681
|
-
"board_spacing_y": {
|
682
|
-
"type": "number",
|
683
|
-
"uom": ["mm"],
|
684
|
-
"description": "The size of the space between the boards in the y-direction"
|
685
|
-
},
|
686
|
-
"fiducials_number": {
|
687
|
-
"type": "integer",
|
688
|
-
"uom": null,
|
689
|
-
"description": "The number of fiducials on the array"
|
690
|
-
},
|
691
|
-
"fiducials_size": {
|
692
|
-
"type": "number",
|
693
|
-
"uom": ["mm"],
|
694
|
-
"description": "The size of the fiducials"
|
695
|
-
},
|
696
|
-
"fiducials_shape": {
|
697
|
-
"type": "string",
|
698
|
-
"enum": ["donut", "circle", "plus", "diamond"],
|
699
|
-
"uom": null,
|
700
|
-
"description": "The shape of the fiducials."
|
701
|
-
},
|
702
|
-
"breakaway_method": {
|
703
|
-
"type": "string",
|
704
|
-
"enum": ["routing", "scoring", "jump_scoring"],
|
705
|
-
"enum_description": {
|
706
|
-
"scoring": "alises includes \"v-cut\" and \"v-grove\""
|
707
|
-
},
|
708
|
-
"uom": null,
|
709
|
-
"description": "The method of creation of the breakaways on the array"
|
710
|
-
},
|
711
|
-
"mouse_bites": {
|
712
|
-
"type": "boolean",
|
713
|
-
"uom": null,
|
714
|
-
"description": "Indicates if there should be \"mouse bites\" to allow easy break away of the boards"
|
715
|
-
},
|
716
|
-
"tooling_holes_number": {
|
717
|
-
"type": "integer",
|
718
|
-
"uom": null,
|
719
|
-
"description": "The number of tooling holes on the array"
|
720
|
-
},
|
721
|
-
"tooling_holes_size": {
|
722
|
-
"type": "number",
|
723
|
-
"uom": ["mm"],
|
724
|
-
"description": "The size of the tooling holes."
|
725
|
-
},
|
726
|
-
"x_outs_allowed": {
|
727
|
-
"type": "boolean",
|
728
|
-
"uom": null,
|
729
|
-
"description": "Manufacturer can deliver arrays with defect boards as long as these are clearly marked as defect (X'ed out)."
|
730
|
-
},
|
731
|
-
"x_outs_max_percentage_on_array": {
|
732
|
-
"type": "integer",
|
733
|
-
"uom": ["percentage"],
|
734
|
-
"description": "The maximum number of defective and clearly marked as such boards that are allowed on on panel, stated in percentage"
|
735
|
-
},
|
736
|
-
"transplant_board_allowed": {
|
737
|
-
"type": "boolean",
|
738
|
-
"uom": null,
|
739
|
-
"description": "The maximum number of defective and clearly marked as such boards that are allowed on on panel, stated in percentage."
|
740
|
-
},
|
741
|
-
"weight": {
|
742
|
-
"type": "number",
|
743
|
-
"uom": ["g"],
|
744
|
-
"description": "The weight of the array"
|
745
|
-
}
|
746
|
-
},
|
747
|
-
"mechanical": {
|
748
|
-
"edge_bevelling": {
|
749
|
-
"type": "boolean",
|
750
|
-
"uom": null,
|
751
|
-
"description": "Edge bevelling present"
|
752
|
-
},
|
753
|
-
"depth_routing_top": {
|
754
|
-
"type": "boolean",
|
755
|
-
"uom": null,
|
756
|
-
"description": "Depth Routing from the top present"
|
757
|
-
},
|
758
|
-
"depth_routing_bottom": {
|
759
|
-
"type": "boolean",
|
760
|
-
"uom": null,
|
761
|
-
"description": "Depth Routing from the bottom present"
|
762
|
-
},
|
763
|
-
"counterboring_top": {
|
764
|
-
"type": "boolean",
|
765
|
-
"uom": null,
|
766
|
-
"description": "Counterboring from the top present"
|
767
|
-
},
|
768
|
-
"counterboring_bottom": {
|
769
|
-
"type": "boolean",
|
770
|
-
"uom": null,
|
771
|
-
"description": "Counterboring from the bottom present"
|
772
|
-
},
|
773
|
-
"countersink_top": {
|
774
|
-
"type": "boolean",
|
775
|
-
"uom": null,
|
776
|
-
"description": "Countersink from the top present"
|
777
|
-
},
|
778
|
-
"countersink_bottom": {
|
779
|
-
"type": "boolean",
|
780
|
-
"uom": null,
|
781
|
-
"description": "Countersink from the bottom present"
|
782
|
-
},
|
783
|
-
"punching": {
|
784
|
-
"type": "boolean",
|
785
|
-
"uom": null,
|
786
|
-
"description": "Punching process required"
|
787
|
-
},
|
788
|
-
"plated_edges": {
|
789
|
-
"type": "boolean",
|
790
|
-
"uom": null,
|
791
|
-
"description": "Plated Edges process required"
|
792
|
-
},
|
793
|
-
"plated_slots": {
|
794
|
-
"type": "boolean",
|
795
|
-
"uom": null,
|
796
|
-
"description": "Plated Slots process required"
|
797
|
-
},
|
798
|
-
"plated_castellated_holes": {
|
799
|
-
"type": "boolean",
|
800
|
-
"uom": null,
|
801
|
-
"description": "Plated Castellated Holes process required"
|
802
|
-
},
|
803
|
-
"coin_attachment": {
|
804
|
-
"type": "boolean",
|
805
|
-
"uom": null,
|
806
|
-
"description": "Coin Attachment process required"
|
807
|
-
}
|
808
|
-
},
|
809
|
-
"selective_plated_pads": {
|
810
|
-
"present": {
|
811
|
-
"type": "boolean",
|
812
|
-
"uom": null,
|
813
|
-
"description": "Selective plated pads present"
|
814
|
-
},
|
815
|
-
"layers": {
|
816
|
-
"type": "string",
|
817
|
-
"uom": null,
|
818
|
-
"description": "The layers included in the connectors, counted from 1 (top layer)"
|
819
|
-
}
|
820
|
-
},
|
821
|
-
"hard_gold_edge_connectors": {
|
822
|
-
"present": {
|
823
|
-
"type": "boolean",
|
824
|
-
"uom": null,
|
825
|
-
"description": "Hard gold edge connectors present"
|
826
|
-
},
|
827
|
-
"thickness": {
|
828
|
-
"type": "string",
|
829
|
-
"enum": ["0.76", "1.27", "other"],
|
830
|
-
"enum_description": {
|
831
|
-
"0.76": "According to IPC Class 2",
|
832
|
-
"1.27": "According to IPC Class 3",
|
833
|
-
"other": "To be specified in the thickness_other tag"
|
834
|
-
},
|
835
|
-
"uom": null,
|
836
|
-
"description": "The thickness of the connectors"
|
837
|
-
},
|
838
|
-
"thickness_other": {
|
839
|
-
"type": "number",
|
840
|
-
"uom": null,
|
841
|
-
"description": "Thickness if it is not \"0.76\" or \"1.27\"."
|
842
|
-
},
|
843
|
-
"area": {
|
844
|
-
"type": "number",
|
845
|
-
"uom": null,
|
846
|
-
"description": "Area covered by the edge connectors in square desimeter"
|
847
|
-
},
|
848
|
-
"layers": {
|
849
|
-
"type": "string",
|
850
|
-
"uom": null,
|
851
|
-
"description": "The layers included in the connectors, counter from 1 (top layer)"
|
852
|
-
}
|
853
|
-
},
|
854
|
-
"markings": {
|
855
|
-
"date_code": {
|
856
|
-
"type": "string",
|
857
|
-
"uom": null,
|
858
|
-
"description": "Possible values are \"YY\" for year, \"WW\" for week \"-\" and \"LOT\" (alias \"BATCH\"). E.g. \"YYWW-LOT\" or \"LOT-YYWW\". If no marking, set \"NONE\""
|
859
|
-
},
|
860
|
-
"placement": {
|
861
|
-
"type": "string",
|
862
|
-
"enum": ["copper_top", "copper_bottom", "soldermask_top", "soldermask_bottom", "legend_top", "legend_bottom"],
|
863
|
-
"uom": null,
|
864
|
-
"description": "Placement of the markings"
|
865
|
-
},
|
866
|
-
"manufacturer_identification": {
|
867
|
-
"type": "boolean",
|
868
|
-
"uom": null,
|
869
|
-
"description": "Manufacturer identification present"
|
870
|
-
},
|
871
|
-
"standards": {
|
872
|
-
"type": "array",
|
873
|
-
"items": {
|
874
|
-
"type": "string"
|
875
|
-
},
|
876
|
-
"uom": null,
|
877
|
-
"description": "Possible values are the ones listed in the subelement \"standards\" but typical will be \"ul\" and \"rohs\""
|
878
|
-
},
|
879
|
-
"serial_number": {
|
880
|
-
"type": "boolean",
|
881
|
-
"uom": null,
|
882
|
-
"description": "Serial number should be added in the markings"
|
883
|
-
},
|
884
|
-
"serial_number_format": {
|
885
|
-
"type": "string",
|
886
|
-
"uom": null,
|
887
|
-
"description": "Format of the serial number expressed as a \"regular expression\" but needs to have x amount of digits in it"
|
888
|
-
},
|
889
|
-
"serial_number_start": {
|
890
|
-
"type": "integer",
|
891
|
-
"uom": null,
|
892
|
-
"description": "The number to start the serial number from. Will have to replace the digits from the \"serial_number_format\" above"
|
893
|
-
},
|
894
|
-
"serial_number_increase_by": {
|
895
|
-
"type": "integer",
|
896
|
-
"uom": null,
|
897
|
-
"description": "The increase in number from \"serial_number_start\" with each product"
|
898
|
-
}
|
899
|
-
},
|
900
|
-
"standards": {
|
901
|
-
"ul": {
|
902
|
-
"type": "boolean",
|
903
|
-
"uom": null,
|
904
|
-
"description": "Indicating if UL is required for the board. Can not be used as a capability, as this will be indicated on each material"
|
905
|
-
},
|
906
|
-
"c_ul": {
|
907
|
-
"type": "boolean",
|
908
|
-
"uom": null,
|
909
|
-
"description": "Indicating if Canadian UL is required for the board. Can not be used as a capability, as this will be indicated on each material"
|
910
|
-
},
|
911
|
-
"rohs": {
|
912
|
-
"type": "boolean",
|
913
|
-
"uom": null,
|
914
|
-
"description": "RoHS"
|
915
|
-
},
|
916
|
-
"ul94": {
|
917
|
-
"type": "string",
|
918
|
-
"enum": ["hb", "v_0", "v_1", "v_2", "5vb", "5va"],
|
919
|
-
"enum_description": {
|
920
|
-
"hb": "HB - Slow burning on a horizontal specimen; burning rate < 76 mm/min for thickness < 3 mm or burning stops before 100 mm",
|
921
|
-
"v_0": "V-0 - Burning stops within 30 seconds on a vertical specimen; drips of flaming particles are allowed",
|
922
|
-
"v_1": "V-1 - Burning stops within 30 seconds on a vertical specimen; drips of particles allowed as long as they are not inflamed",
|
923
|
-
"v_2": "V-2 - Burning stops within 30 seconds on a vertical specimen; drips of flaming particles are allowed",
|
924
|
-
"5vb": "5VB - Burning stops within 60 seconds on a vertical specimen; no drips allowed; plaque specimens may develop a hole",
|
925
|
-
"5va": "5VA - Burning stops within 60 seconds on a vertical specimen; no drips allowed; plaque specimens may not develop a hole"
|
926
|
-
},
|
927
|
-
"uom": null,
|
928
|
-
"description": "UL 94 - Standard for Safety of Flammability of Plastic Materials for Parts in Devices and Appliances testing"
|
929
|
-
},
|
930
|
-
"esa": {
|
931
|
-
"type": "boolean",
|
932
|
-
"uom": null,
|
933
|
-
"description": "European Space Agency Use"
|
934
|
-
},
|
935
|
-
"itar": {
|
936
|
-
"type": "boolean",
|
937
|
-
"uom": null,
|
938
|
-
"description": "US ITAR"
|
939
|
-
},
|
940
|
-
"dfars": {
|
941
|
-
"type": "boolean",
|
942
|
-
"uom": null,
|
943
|
-
"description": "US DFARS"
|
944
|
-
},
|
945
|
-
"mil_prf_55110": {
|
946
|
-
"type": "boolean",
|
947
|
-
"uom": null,
|
948
|
-
"description": "MIL-PRF-55110"
|
949
|
-
},
|
950
|
-
"mil_prf_50884": {
|
951
|
-
"type": "boolean",
|
952
|
-
"uom": null,
|
953
|
-
"description": "MIL-PRF-5884"
|
954
|
-
},
|
955
|
-
"mil_prf_31032": {
|
956
|
-
"type": "boolean",
|
957
|
-
"uom": null,
|
958
|
-
"description": "MIL-PRF-31032"
|
959
|
-
},
|
960
|
-
"as9100": {
|
961
|
-
"type": "boolean",
|
962
|
-
"uom": null,
|
963
|
-
"description": "AS9100"
|
964
|
-
},
|
965
|
-
"nadcap": {
|
966
|
-
"type": "boolean",
|
967
|
-
"uom": null,
|
968
|
-
"description": "NADCAP"
|
969
|
-
},
|
970
|
-
"rw_en45545_2_2013": {
|
971
|
-
"type": "boolean",
|
972
|
-
"uom": null,
|
973
|
-
"description": "Railway Europe EN45545-2:2013"
|
974
|
-
},
|
975
|
-
"rw_nf_f_16_101": {
|
976
|
-
"type": "boolean",
|
977
|
-
"uom": null,
|
978
|
-
"description": "Railway France NF F 16-101"
|
979
|
-
},
|
980
|
-
"rw_uni_cei_11170_3": {
|
981
|
-
"type": "boolean",
|
982
|
-
"uom": null,
|
983
|
-
"description": "Railway Italy UNI CEI 11170-3"
|
984
|
-
},
|
985
|
-
"rw_nfpa_130": {
|
986
|
-
"type": "boolean",
|
987
|
-
"uom": null,
|
988
|
-
"description": "Railway USA NFPA 130"
|
989
|
-
},
|
990
|
-
"ipc_6010_class": {
|
991
|
-
"type": "string",
|
992
|
-
"enum": ["1", "2", "3"],
|
993
|
-
"uom": null,
|
994
|
-
"description": "According to Table 4-2 /4-3"
|
995
|
-
},
|
996
|
-
"ipc_6010_compliance_level": {
|
997
|
-
"type": "string",
|
998
|
-
"enum": ["full", "factory_standard", "aabus"],
|
999
|
-
"enum_description": {
|
1000
|
-
"aabus": "As Agreed Between User and Supplier"
|
1001
|
-
},
|
1002
|
-
"uom": null,
|
1003
|
-
"description": ""
|
1004
|
-
},
|
1005
|
-
"ipc_6010_copper_plating_thickness_level": {
|
1006
|
-
"type": "string",
|
1007
|
-
"enum": ["2", "3"],
|
1008
|
-
"uom": null,
|
1009
|
-
"description": "Used either if ipc_6010_class is set to 2 and you want to add copper plating thickness demands from class 3, or the other way round - class 3 is set but you can accept demands from class 2"
|
1010
|
-
},
|
1011
|
-
"ipc_6010_annular_ring_level": {
|
1012
|
-
"type": "string",
|
1013
|
-
"enum": ["2", "3"],
|
1014
|
-
"uom": null,
|
1015
|
-
"description": "Used either if ipc_6010_class is set to 2 and you want to add annular ring demands from class 3, or the other way round - class 3 is set but you can accept demands from class 2"
|
1016
|
-
},
|
1017
|
-
"ipc_6010_conductor_spacing_level": {
|
1018
|
-
"type": "string",
|
1019
|
-
"enum": ["2", "3"],
|
1020
|
-
"uom": null,
|
1021
|
-
"description": "Used either if ipc_6010_class is set to 2 and you want to add conductor spacing demands from class 3, or the other way round - class 3 is set but you can accept demands from class 2"
|
1022
|
-
},
|
1023
|
-
"ipc_6010_conductor_width_level": {
|
1024
|
-
"type": "string",
|
1025
|
-
"enum": ["2", "3"],
|
1026
|
-
"uom": null,
|
1027
|
-
"description": "Used either if ipc_6010_class is set to 2 and you want to add conductor width demands from class 3, or the other way round - class 3 is set but you can accept demands from class 2"
|
1028
|
-
},
|
1029
|
-
"ipc_6012_class": {
|
1030
|
-
"type": "string",
|
1031
|
-
"enum": ["1", "2", "3", "3A", "3S", "3M"],
|
1032
|
-
"enum_description": {
|
1033
|
-
"3A": "Automotive addendum",
|
1034
|
-
"3S": "Space and Military Avionics Addendum",
|
1035
|
-
"3M": "Medical Addendum"
|
1036
|
-
},
|
1037
|
-
"uom": null,
|
1038
|
-
"description": "Requirements according to IPC 6012 class"
|
1039
|
-
},
|
1040
|
-
"ipc_6013_class": {
|
1041
|
-
"type": "string",
|
1042
|
-
"enum": ["1", "2", "3"],
|
1043
|
-
"uom": null,
|
1044
|
-
"description": "Requirements according to IPC 6013 for flexible or rigid-flex boards"
|
1045
|
-
},
|
1046
|
-
"ipc_6018": {
|
1047
|
-
"type": "boolean",
|
1048
|
-
"uom": null,
|
1049
|
-
"description": "IPC-6018 Microwave End Product Board Inspection and Test"
|
1050
|
-
}
|
1051
|
-
},
|
1052
|
-
"testing": {
|
1053
|
-
"netlist": {
|
1054
|
-
"type": "boolean",
|
1055
|
-
"uom": null,
|
1056
|
-
"description": "100% Netlist testing according to IPC-D-356, ODB++ or IPC2581"
|
1057
|
-
},
|
1058
|
-
"allow_generate_netlist": {
|
1059
|
-
"type": "boolean",
|
1060
|
-
"uom": null,
|
1061
|
-
"description": "Allow Netlist to be generated from Gerber or other file format if needed"
|
1062
|
-
},
|
1063
|
-
"hipot": {
|
1064
|
-
"type": "boolean",
|
1065
|
-
"uom": null,
|
1066
|
-
"description": "HiPot Test (Dielectric Withstanding Voltage Test)"
|
1067
|
-
},
|
1068
|
-
"4_wire": {
|
1069
|
-
"type": "boolean",
|
1070
|
-
"uom": null,
|
1071
|
-
"description": "Use 4 wired test"
|
1072
|
-
},
|
1073
|
-
"ist": {
|
1074
|
-
"type": "boolean",
|
1075
|
-
"uom": null,
|
1076
|
-
"description": "Use IST testing"
|
1077
|
-
},
|
1078
|
-
"impedance": {
|
1079
|
-
"type": "string",
|
1080
|
-
"enum": ["controlled", "calculated", "follow_stackup"],
|
1081
|
-
"uom": null,
|
1082
|
-
"description": "How to conduct a impedance test"
|
1083
|
-
}
|
1084
|
-
},
|
1085
|
-
"country_of_origin": {
|
1086
|
-
"iso_3166_1_alpha_3": {
|
1087
|
-
"type": "string",
|
1088
|
-
"uom": null,
|
1089
|
-
"description": "A three letter string representation of the Country of origin according too ISO 3166-1"
|
1090
|
-
},
|
1091
|
-
"iso_3166_1_alpha_2": {
|
1092
|
-
"type": "string",
|
1093
|
-
"uom": null,
|
1094
|
-
"description": "A two letter string representation of the Country of origin according too ISO 3166-1"
|
1095
|
-
},
|
1096
|
-
"nato_member": {
|
1097
|
-
"type": "boolean",
|
1098
|
-
"uom": null,
|
1099
|
-
"description": "Indicates if the COO is a NATO member state"
|
1100
|
-
},
|
1101
|
-
"eu_member": {
|
1102
|
-
"type": "boolean",
|
1103
|
-
"uom": null,
|
1104
|
-
"description": "Indicates if the COO is a European Union member state"
|
1105
|
-
}
|
1106
|
-
},
|
1107
|
-
"conflict_resolution": {
|
1108
|
-
"order": {
|
1109
|
-
"type": "integer",
|
1110
|
-
"uom": null,
|
1111
|
-
"description": "Information provided on order level"
|
1112
|
-
},
|
1113
|
-
"oem_specification_sheet": {
|
1114
|
-
"type": "integer",
|
1115
|
-
"uom": null,
|
1116
|
-
"description": "Information provided from the OEM in a PDF or other document format"
|
1117
|
-
},
|
1118
|
-
"assembly_specification_sheet": {
|
1119
|
-
"type": "integer",
|
1120
|
-
"uom": null,
|
1121
|
-
"description": "Information provided from the assembly facility in a PDF or other document format"
|
1122
|
-
},
|
1123
|
-
"drawing": {
|
1124
|
-
"type": "integer",
|
1125
|
-
"uom": null,
|
1126
|
-
"description": "Information in a drawing (if present)"
|
1127
|
-
},
|
1128
|
-
"ipc2581": {
|
1129
|
-
"type": "integer",
|
1130
|
-
"uom": null,
|
1131
|
-
"description": "Information in an IPC-2581 file"
|
1132
|
-
},
|
1133
|
-
"odb": {
|
1134
|
-
"type": "integer",
|
1135
|
-
"uom": null,
|
1136
|
-
"description": " Information in a ODB++ file"
|
1137
|
-
},
|
1138
|
-
"gerber": {
|
1139
|
-
"type": "integer",
|
1140
|
-
"uom": null,
|
1141
|
-
"description": "Information in a Gerber format file"
|
1142
|
-
}
|
1143
|
-
},
|
1144
|
-
"holes": {
|
1145
|
-
"number": {
|
1146
|
-
"type": "integer",
|
1147
|
-
"uom": null,
|
1148
|
-
"description": "The number of holes total or in this process"
|
1149
|
-
},
|
1150
|
-
"type": {
|
1151
|
-
"type": "string",
|
1152
|
-
"enum": ["through", "blind", "buried", "back_drill"],
|
1153
|
-
"uom": null,
|
1154
|
-
"description": "The type of holes"
|
1155
|
-
},
|
1156
|
-
"plated": {
|
1157
|
-
"type": "boolean",
|
1158
|
-
"uom": null,
|
1159
|
-
"description": "True if the holes are plated"
|
1160
|
-
},
|
1161
|
-
"size": {
|
1162
|
-
"type": "number",
|
1163
|
-
"uom": ["um"],
|
1164
|
-
"description": "The size of the hole in micrometers. Can be considered the minimum hole size if only one holes element present in the list or as a capability"
|
1165
|
-
},
|
1166
|
-
"layer_start": {
|
1167
|
-
"type": "integer",
|
1168
|
-
"uom": null,
|
1169
|
-
"description": "The layer where the hole starts, counted from the top, where top layer is 1"
|
1170
|
-
},
|
1171
|
-
"layer_stop": {
|
1172
|
-
"type": "integer",
|
1173
|
-
"uom": null,
|
1174
|
-
"description": "The layer where the hole stops, counted from the top, where top layer is 1"
|
1175
|
-
},
|
1176
|
-
"depth": {
|
1177
|
-
"type": "number",
|
1178
|
-
"uom": ["um"],
|
1179
|
-
"description": "The depth of the hole"
|
1180
|
-
},
|
1181
|
-
"method": {
|
1182
|
-
"type": "string",
|
1183
|
-
"enum": ["routing", "drilling", "laser"],
|
1184
|
-
"uom": null,
|
1185
|
-
"description": "Can be either \"routing\" or \"drilling\", where drilling is default"
|
1186
|
-
},
|
1187
|
-
"minimum_designed_annular_ring": {
|
1188
|
-
"type": "number",
|
1189
|
-
"uom": ["um"],
|
1190
|
-
"description": "The minimum designed annular ring"
|
1191
|
-
},
|
1192
|
-
"press_fit": {
|
1193
|
-
"type": "boolean",
|
1194
|
-
"uom": null,
|
1195
|
-
"description": "Press Fit holes"
|
1196
|
-
},
|
1197
|
-
"copper_filled": {
|
1198
|
-
"type": "boolean",
|
1199
|
-
"uom": null,
|
1200
|
-
"description": "Copper filled holes"
|
1201
|
-
},
|
1202
|
-
"staggered": {
|
1203
|
-
"type": "boolean",
|
1204
|
-
"uom": null,
|
1205
|
-
"description": "Staggered holes"
|
1206
|
-
},
|
1207
|
-
"stacked": {
|
1208
|
-
"type": "boolean",
|
1209
|
-
"uom": null,
|
1210
|
-
"description": "Stacked holes"
|
1211
|
-
},
|
1212
|
-
"alivh": {
|
1213
|
-
"type": "boolean",
|
1214
|
-
"uom": null,
|
1215
|
-
"description": "ALIVH holes"
|
1216
|
-
}
|
1217
|
-
},
|
1218
|
-
"allowed_modifications": {
|
1219
|
-
"dead_pad_removal": {
|
1220
|
-
"type": "boolean",
|
1221
|
-
"uom": null,
|
1222
|
-
"description": "Allowed to remove Non Functioning Pads"
|
1223
|
-
},
|
1224
|
-
"add_copper_balancing": {
|
1225
|
-
"type": "boolean",
|
1226
|
-
"uom": null,
|
1227
|
-
"description": "Adding copper balancing pattern allowed"
|
1228
|
-
},
|
1229
|
-
"add_copper_balancing_on_array": {
|
1230
|
-
"type": "boolean",
|
1231
|
-
"uom": null,
|
1232
|
-
"description": "Adding copper balancing pattern on array/panel frame allowed"
|
1233
|
-
},
|
1234
|
-
"add_tear_drops": {
|
1235
|
-
"type": "boolean",
|
1236
|
-
"uom": null,
|
1237
|
-
"description": "Adding Tear Drops allowed"
|
1238
|
-
}
|
1239
|
-
},
|
1240
|
-
"additional_requirements": {
|
1241
|
-
"any_name": {
|
1242
|
-
"type": "string",
|
1243
|
-
"uom": null,
|
1244
|
-
"description": "Must have a similar element in the custom -> additional"
|
1245
|
-
}
|
1246
|
-
}
|
1247
|
-
}
|
1248
|
-
}
|
1249
|
-
}
|