From: Bdale Garbee Date: Tue, 14 Aug 2018 05:51:11 +0000 (-0600) Subject: upate gnet-tEDAx.scm to work with lepton-eda, preserve geda-gaf version too X-Git-Tag: telelco-v3.0~440 X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=fa78785d7e3e28ee09fbdb3e1a97f16c7bddda8b;p=hw%2Faltusmetrum upate gnet-tEDAx.scm to work with lepton-eda, preserve geda-gaf version too --- diff --git a/scheme/geda-gaf-tEDAx.scm b/scheme/geda-gaf-tEDAx.scm new file mode 100644 index 0000000..5eab277 --- /dev/null +++ b/scheme/geda-gaf-tEDAx.scm @@ -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)))) + +;; -------------------------------------------------------------------------- + diff --git a/scheme/gnet-tEDAx.scm b/scheme/gnet-tEDAx.scm index 5eab277..83c6cda 100644 --- a/scheme/gnet-tEDAx.scm +++ b/scheme/gnet-tEDAx.scm @@ -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 @@ -18,116 +17,93 @@ ;;; 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))) ;; -------------------------------------------------------------------------- -