update quantities
[hw/telefirefour] / gnet-partslist-bom.scm
1 ; Copyright © 2012 Keith Packard <keithp@keithp.com>
2 ; gnet-partslist-bom.scm
3
4 ; This program is free software; you can redistribute it and/or modify
5 ; it under the terms of the GNU General Public License as published by
6 ; the Free Software Foundation; either version 2 of the License, or
7 ; (at your option) any later version.
8
9 ; This program is distributed in the hope that it will be useful,
10 ; but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 ; GNU General Public License for more details.
13
14 ; You should have received a copy of the GNU General Public License
15 ; along with this program; if not, write to the Free Software
16 ; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
18 ; The /'s may not work on win32
19 (load (string-append gedadata "/scheme/gnet-partslist-common.scm"))
20
21 (define (caddddddr s)
22   (car (cdr (cdr (cdr (cdr (cdr (cdr s))))))))
23
24 (define (cadddddr s)
25   (car (cdr (cdr (cdr (cdr (cdr s)))))))
26
27 (define (caddddr s)
28   (car (cdr (cdr (cdr (cdr s))))))
29
30 (define (partslist-bom:write-part s port)
31   (let ((quantity (caddddddr s))
32         (part (cadddddr s))
33         (device (cadr s))
34         (value (caddr s)))
35     (display quantity port)
36     (display ", " port)
37     (display part port)
38     (display ", " port)
39     (display device port)
40     (display " " port)
41     (display value port)
42     (display "\n" port)))
43
44 (define (partslist-bom:write-partslist ls port)
45   (if (null? ls)
46       '()
47       (begin (partslist-bom:write-part (car ls) port)
48              (partslist-bom:write-partslist (cdr ls) port))))
49
50 (define (count-same-parts ls)
51   (if (null? ls)
52       (append ls)
53       (let* ((parts-table-no-uref (let ((result '()))
54                                     (for-each (lambda (l) (set! result (cons (cdr l) result))) (reverse ls))
55                                     (append result)))
56              (first-ls (car parts-table-no-uref))
57              (match-length (length (member first-ls (reverse parts-table-no-uref))))
58              (rest-ls (list-tail ls match-length))
59              (match-ls (list-tail (reverse ls) (- (length ls) match-length)))
60              (uref-ls (let ((result '()))
61                         (for-each (lambda (l) (set! result (cons (car l) result))) match-ls)
62                         (append result))))
63         (cons (cons uref-ls (append first-ls  (list match-length))) (count-same-parts rest-ls)))))
64
65 (define get-vendor
66    (lambda (package)
67       (gnetlist:get-package-attribute package "vendor")))
68
69 (define get-vendor-part-number
70    (lambda (package)
71       (gnetlist:get-package-attribute package "vendor_part_number")))
72
73 (define get-footprint
74    (lambda (package)
75       (gnetlist:get-package-attribute package "footprint")))
76
77 (define (get-parts-table-bom packages vendor)
78   (if (null? packages)
79       '()
80       (let ((package (car packages)))
81         (if (string=? (get-vendor package) vendor)
82             (if (string=? (get-device package) "include")
83                 (get-parts-table-bom (cdr packages) vendor)
84                 (cons (list package
85                             (get-device package)
86                             (get-value package)
87                             (get-footprint package)
88                             (get-vendor package)
89                             (get-vendor-part-number package)) ;; sdb change
90                       (get-parts-table-bom (cdr packages) vendor)))
91             (get-parts-table-bom (cdr packages) vendor)))))
92             
93
94 (define (get-vendor-match)
95   (let ((vendor-param (calling-flag? "vendor" (gnetlist:get-calling-flags))))
96     (if vendor-param
97         (cdr vendor-param)
98         "digikey")))
99
100 (define (partslist-bom output-filename)
101   (let ((port (open-output-file output-filename))
102         (parts-table (marge-sort-with-multikey (get-parts-table-bom packages (get-vendor-match)) '(1 2 3 0))))
103     (set! parts-table (count-same-parts parts-table))
104     (partslist-bom:write-partslist parts-table port)
105     (close-output-port port)))