upate gnet-tEDAx.scm to work with lepton-eda, preserve geda-gaf version too
authorBdale Garbee <bdale@gag.com>
Tue, 14 Aug 2018 05:51:11 +0000 (23:51 -0600)
committerBdale Garbee <bdale@gag.com>
Tue, 14 Aug 2018 05:51:11 +0000 (23:51 -0600)
scheme/geda-gaf-tEDAx.scm [new file with mode: 0644]
scheme/gnet-tEDAx.scm

diff --git a/scheme/geda-gaf-tEDAx.scm b/scheme/geda-gaf-tEDAx.scm
new file mode 100644 (file)
index 0000000..5eab277
--- /dev/null
@@ -0,0 +1,133 @@
+;;; gEDA - GPL Electronic Design Automation
+;;; gnetlist plug-in for tEDAx
+;;; Copyright (C) 2018 Bdale Garbee
+;;;
+;;; This program is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 2 of the License, or
+;;; (at your option) any later version.
+;;;
+;;; This program is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with this program; if not, write to the Free Software
+;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+;;; MA 02111-1301 USA.
+
+;; --------------------------------------------------------------------------
+
+;;
+;; returns the device attribute value
+;;
+(define tEDAx:get-device
+   (lambda (package)
+      (gnetlist:get-package-attribute package "device")))
+
+;;
+;; returns the footprint attribute value (PATTERN if not defined)
+;;
+(define tEDAx:get-pattern
+   (lambda (package)
+      (define pattern (gnetlist:get-package-attribute package "footprint"))
+      (if (string=? "unknown" pattern)
+         "PATTERN"
+         pattern)))
+; how do i return "PATTERN" if not defined? humm... need to read some
+; guile stuff... i did, and see the result :)
+
+;;
+;; returns the value attribute (empty if not defined)
+;;
+(define tEDAx:get-value
+   (lambda (package)
+      (define value (gnetlist:get-package-attribute package "value"))
+      (if (string=? "unknown" value)
+         ""
+        value)))
+;;
+;; header
+;;
+(define tEDAx:header
+   (lambda (port)
+      (display "tEDAx v1" port) 
+      (newline port)
+
+      (display "begin netlist v1 netlist" port)
+      (newline port)
+      (newline port)))
+
+;;
+;; trailer
+;;
+(define tEDAx:trailer
+   (lambda (port)
+      (display "end netlist" port) 
+      (newline port)))
+
+;;
+;; component related lines 
+;;
+(define tEDAx:components
+   (lambda (port ls)
+      (if (not (null? ls))
+         (let ((package (car ls)))
+            (begin
+               (display "\tfootprint " port)
+               (display package port)
+               (display " " port)
+               (display (tEDAx:get-pattern package) port)
+               (newline port)
+
+               (display "\tdevice " port)
+               (display package port)
+               (display " " port)
+               (display (tEDAx:get-device package) port)
+               (newline port)
+
+               (display "\tvalue " port)
+               (display package port)
+               (display " " port)
+               (display (tEDAx:get-value package) port)
+               (newline port)
+
+               (newline port)
+               (tEDAx:components port (cdr ls)))))))
+
+(define (tEDAx:pinfmt pin)
+  (format #f "~a ~a" (car pin) (car (cdr pin)))
+  )
+
+(define (tEDAx:each-pin net pins port)
+  (if (not (null? pins))
+      (let ((pin (car pins)))
+        (format port "\tconn ~a ~a~%" net (tEDAx:pinfmt pin))
+        (tEDAx:each-pin net (cdr pins) port))))
+
+;;
+;; network related lines 
+;;
+(define (tEDAx:each-net netnames port)
+  (if (not (null? netnames))
+      (let ((netname (car netnames)))
+        (tEDAx:each-pin netname (gnetlist:get-all-connections netname) port)
+        (tEDAx:each-net (cdr netnames) port))))
+
+;;; 
+;;; output a tEDAx formatted netlist
+;;;
+(define tEDAx
+   (lambda (output-filename)
+      (let ((port (open-output-file output-filename)))
+         (begin
+           (tEDAx:header port)
+           (tEDAx:components port packages)
+           (tEDAx:each-net (gnetlist:get-all-unique-nets "dummy") port)
+           (tEDAx:trailer port))
+        (close-output-port port))))
+
+;; --------------------------------------------------------------------------
+
index 5eab277e2c9014bb9d57e32bf01979cd59cd05d3..83c6cda2dd67c3044c362320b6edd802fb7f981b 100644 (file)
@@ -1,5 +1,4 @@
-;;; gEDA - GPL Electronic Design Automation
-;;; gnetlist plug-in for tEDAx
+;;; tEDAx plug-in for lepton-netlist
 ;;; Copyright (C) 2018 Bdale Garbee
 ;;;
 ;;; This program is free software; you can redistribute it and/or modify
 ;;; MA 02111-1301 USA.
 
 ;; --------------------------------------------------------------------------
+;; The tEDAx format is documented at http://repo.hu/projects/tedax/
+;; --------------------------------------------------------------------------
+
+(use-modules (gnetlist schematic))
 
 ;;
-;; returns the device attribute value
+;; return device attribute
 ;;
-(define tEDAx:get-device
-   (lambda (package)
-      (gnetlist:get-package-attribute package "device")))
+(define (tEDAx:get-device package)
+  (gnetlist:get-package-attribute package "device"))
 
 ;;
-;; returns the footprint attribute value (PATTERN if not defined)
+;; return footprint attribute (UNKNOWN if not defined)
 ;;
-(define tEDAx:get-pattern
-   (lambda (package)
-      (define pattern (gnetlist:get-package-attribute package "footprint"))
-      (if (string=? "unknown" pattern)
-         "PATTERN"
-         pattern)))
-; how do i return "PATTERN" if not defined? humm... need to read some
-; guile stuff... i did, and see the result :)
+(define (tEDAx:get-pattern package)
+  (let ((pattern (gnetlist:get-package-attribute package "footprint")))
+    (if (unknown? pattern) "UNKNOWN" pattern)))
 
 ;;
-;; returns the value attribute (empty if not defined)
+;; returns value attribute (empty if not defined)
 ;;
-(define tEDAx:get-value
-   (lambda (package)
-      (define value (gnetlist:get-package-attribute package "value"))
-      (if (string=? "unknown" value)
-         ""
-        value)))
-;;
-;; header
-;;
-(define tEDAx:header
-   (lambda (port)
-      (display "tEDAx v1" port) 
-      (newline port)
-
-      (display "begin netlist v1 netlist" port)
-      (newline port)
-      (newline port)))
+(define (tEDAx:get-value package)
+  (let ((value (gnetlist:get-package-attribute package "value")))
+    (if (unknown? value) "" value)))
 
 ;;
-;; trailer
+;; emit header
 ;;
-(define tEDAx:trailer
-   (lambda (port)
-      (display "end netlist" port) 
-      (newline port)))
+(define (tEDAx:header)
+  (format #t "tEDAx v1\nbegin netlist v1 netlist\n\n"))
 
 ;;
-;; component related lines 
-;;
-(define tEDAx:components
-   (lambda (port ls)
-      (if (not (null? ls))
-         (let ((package (car ls)))
-            (begin
-               (display "\tfootprint " port)
-               (display package port)
-               (display " " port)
-               (display (tEDAx:get-pattern package) port)
-               (newline port)
-
-               (display "\tdevice " port)
-               (display package port)
-               (display " " port)
-               (display (tEDAx:get-device package) port)
-               (newline port)
-
-               (display "\tvalue " port)
-               (display package port)
-               (display " " port)
-               (display (tEDAx:get-value package) port)
-               (newline port)
-
-               (newline port)
-               (tEDAx:components port (cdr ls)))))))
+;; emit trailer
+;;
+(define (tEDAx:trailer)
+  (format #t "end netlist\n"))
 
-(define (tEDAx:pinfmt pin)
-  (format #f "~a ~a" (car pin) (car (cdr pin)))
-  )
+;;
+;; emit component related lines
+;;
+(define (tEDAx:components ls)
+  (for-each
+   (lambda (package)
+     (format #t "\tfootprint ~A ~A\n\tdevice ~A ~A\n\tvalue ~A ~A\n\n"
+       package
+       (tEDAx:get-pattern package)
+       package
+       (tEDAx:get-device package)
+       package
+       (tEDAx:get-value package)))
+   ls))
 
-(define (tEDAx:each-pin net pins port)
-  (if (not (null? pins))
-      (let ((pin (car pins)))
-        (format port "\tconn ~a ~a~%" net (tEDAx:pinfmt pin))
-        (tEDAx:each-pin net (cdr pins) port))))
+;;
+;; emit network related lines for current net
+;;
+(define (tEDAx:display-connections netname nets)
+  (define package car)
+  (define pinnumber cdr)
+  (string-join
+   (map
+    (lambda (net)
+      (format #f "\tconn ~A ~A ~A\n"
+       netname
+        (package net)
+        (pinnumber net)))
+    nets)
+   ""))
 
 ;;
-;; network related lines 
+;; iterate over all nets
 ;;
-(define (tEDAx:each-net netnames port)
-  (if (not (null? netnames))
-      (let ((netname (car netnames)))
-        (tEDAx:each-pin netname (gnetlist:get-all-connections netname) port)
-        (tEDAx:each-net (cdr netnames) port))))
+(define (tEDAx:nets netnames)
+  (for-each
+   (lambda (netname)
+     (format #t "~A\n"
+       (tEDAx:display-connections netname (get-all-connections netname))))
+   netnames))
 
-;;; 
-;;; output a tEDAx formatted netlist
 ;;;
-(define tEDAx
-   (lambda (output-filename)
-      (let ((port (open-output-file output-filename)))
-         (begin
-           (tEDAx:header port)
-           (tEDAx:components port packages)
-           (tEDAx:each-net (gnetlist:get-all-unique-nets "dummy") port)
-           (tEDAx:trailer port))
-        (close-output-port port))))
+;;; emit netlist in tEDAx interchange format
+;;;
+(define (tEDAx output-filename)
+  (let ((nets (schematic-nets toplevel-schematic))
+        (packages (schematic-packages toplevel-schematic)))
+    (tEDAx:header)
+    (tEDAx:components packages)
+    (tEDAx:nets nets)
+    (tEDAx:trailer)))
 
 ;; --------------------------------------------------------------------------
-