Brian Silverman | 8fa2aad | 2017-06-10 16:45:30 -0700 | [diff] [blame] | 1 | #!/usr/bin/env ruby |
| 2 | |
| 3 | require './gschem_file' |
| 4 | require 'pp' |
| 5 | |
| 6 | if ARGV.size == 0 |
| 7 | filenames = Dir.glob('**/*.{sch,sym}') |
| 8 | else |
| 9 | filenames = get_schematic_filenames ARGV |
| 10 | end |
| 11 | |
| 12 | seen = {} |
| 13 | |
| 14 | filenames.each do |filename| |
| 15 | file = GschemSchematic.new(filename) |
| 16 | |
| 17 | file.components.each do |component| |
Brian Silverman | de75645 | 2017-07-02 12:43:02 -0700 | [diff] [blame^] | 18 | refdes = component.refdes |
| 19 | slot = component[:slot] |
| 20 | if !refdes |
| 21 | if !component.is_power |
| 22 | puts "Warning: #{component.inspect} does not have a refdes." |
| 23 | end |
| 24 | elsif !seen.has_key? refdes |
| 25 | seen[refdes] = [[filename, slot]] |
| 26 | else |
| 27 | if seen[refdes][0][1] == nil && slot == nil |
| 28 | puts "Error: duplicate unslotted component #{refdes} in #{seen[refdes].collect { |a| a[0] }.inspect}." |
| 29 | elsif (seen[refdes][0][1] == nil) != (slot == nil) |
| 30 | puts "Error: slotted and unslotted component #{refdes} at #{seen[refdes].collect { |a| "#{a[1] || 'none'} in #{a[0]}" }.inspect}." |
Brian Silverman | 8fa2aad | 2017-06-10 16:45:30 -0700 | [diff] [blame] | 31 | else |
| 32 | seen[refdes].each do |_, s| |
| 33 | if s == slot |
Brian Silverman | de75645 | 2017-07-02 12:43:02 -0700 | [diff] [blame^] | 34 | puts "Error: duplicate slotted component #{refdes}:#{slot} in #{seen[refdes].collect { |a| a[0] if a[1] == slot }.compact.inspect}." |
Brian Silverman | 8fa2aad | 2017-06-10 16:45:30 -0700 | [diff] [blame] | 35 | break |
| 36 | end |
| 37 | end |
| 38 | end |
| 39 | seen[refdes].push [filename, slot] |
Brian Silverman | de75645 | 2017-07-02 12:43:02 -0700 | [diff] [blame^] | 40 | end |
Brian Silverman | 8fa2aad | 2017-06-10 16:45:30 -0700 | [diff] [blame] | 41 | end |
| 42 | end |