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.
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
- }