circuitdata 0.6.4 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +25 -122
  3. data/Rakefile +4 -6
  4. data/lib/circuitdata.rb +32 -120
  5. data/lib/circuitdata/bury/bury.rb +61 -0
  6. data/lib/circuitdata/dereferencer.rb +49 -17
  7. data/lib/circuitdata/exposed_area.rb +84 -0
  8. data/lib/circuitdata/json_schema.rb +14 -0
  9. data/lib/circuitdata/json_validator.rb +56 -0
  10. data/lib/circuitdata/json_validator/json_schema_error_parser.rb +57 -0
  11. data/lib/circuitdata/material_validator.rb +40 -0
  12. data/lib/circuitdata/product.rb +125 -0
  13. data/lib/circuitdata/product_id_validator.rb +81 -0
  14. data/lib/circuitdata/profile.rb +31 -69
  15. data/lib/circuitdata/schema.rb +145 -0
  16. data/lib/circuitdata/schema_files/schema_v1_dereferenced.json +107155 -0
  17. data/lib/circuitdata/schema_files/v1/ottp_circuitdata_schema.json +68 -5307
  18. data/lib/circuitdata/schema_files/v1/ottp_circuitdata_schema_generics.json +23 -0
  19. data/lib/circuitdata/schema_files/v1/ottp_circuitdata_schema_materials.json +99 -0
  20. data/lib/circuitdata/schema_files/v1/ottp_circuitdata_schema_products.json +779 -0
  21. data/lib/circuitdata/schema_files/v1/ottp_circuitdata_schema_profiles_and_capabilities.json +323 -0
  22. data/lib/circuitdata/summary.rb +96 -0
  23. data/lib/circuitdata/validator.rb +28 -0
  24. data/lib/circuitdata/version.rb +2 -1
  25. metadata +113 -20
  26. data/lib/circuitdata/bk_comparer.rb +0 -106
  27. data/lib/circuitdata/compatibility_checker.rb +0 -160
  28. data/lib/circuitdata/file_comparer.rb +0 -276
  29. data/lib/circuitdata/schema_files/v1/ottp_circuitdata_schema_definitions.json +0 -1249
  30. data/lib/circuitdata/schema_files/v1/ottp_circuitdata_skeleton_schema.json +0 -94
  31. data/lib/circuitdata/schema_files/v1/ottp_schema_definitions.json +0 -102
  32. 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
- }