Mail Archives: geda-user/2016/01/02/12:40:54
John Doty:
> On Jan 2, 2016, at 6:12 AM, karl AT aspodata DOT se wrote:
...
> > So currently, if I want to write an "get all syms that this sch file
> > referencs"-program I have to do it in c or don't use libgeda at all.
> >
> > I thought that kind of program could be a nice way to learn a
> > little scheme, but the infrastructure wasn't there.
>
> What does the gaf Scheme API look like?
$ ldd `which gaf ` | grep geda
libgedacairo.so.1 => /usr/local/lib/libgedacairo.so.1 (0xb6ab9000)
libgeda.so.43 => /usr/local/lib/libgeda.so.43 (0xb6a6b000)
where libgedacairo is for image generation.
///
geda-gaf/gaf/shell.c says:
...
#include <libgeda/libgeda.h>
#include <libgeda/libgedaguile.h>
...
scm_boot_guile (argc, argv, cmd_shell_impl, NULL); /* Doesn't return */
...
///
libgeda/include/libgeda/libgedaguile.h
* Scheme API public declarations and definitions.
* \warning Don't include from libgeda.h: should only be included
* by source files that need to use the Scheme API.
so this one seems to be for c programmers to acess scheme functions.
///
$ grep '^ { ' libgeda/src/g_register.c
{ "eval-protected", 1, 1, 0, g_scm_eval_protected },
{ "eval-string-protected", 1, 0, 0, g_scm_eval_string_protected },
{ "component-library", 1, 1, 0, g_rc_component_library },
{ "component-library-command", 3, 0, 0, g_rc_component_library_command },
{ "component-library-funcs", 3, 0, 0, g_rc_component_library_funcs },
{ "source-library", 1, 0, 0, g_rc_source_library },
{ "source-library-search", 1, 0, 0, g_rc_source_library_search },
{ "world-size", 3, 0, 0, g_rc_world_size },
{ "reset-component-library", 0, 0, 0, g_rc_reset_component_library },
{ "reset-source-library", 0, 0, 0, g_rc_reset_source_library },
{ "scheme-directory", 1, 0, 0, g_rc_scheme_directory },
{ "bitmap-directory", 1, 0, 0, g_rc_bitmap_directory },
{ "bus-ripper-symname", 1, 0, 0, g_rc_bus_ripper_symname },
{ "attribute-promotion", 1, 0, 0, g_rc_attribute_promotion },
{ "promote-invisible", 1, 0, 0, g_rc_promote_invisible },
{ "keep-invisible", 1, 0, 0, g_rc_keep_invisible },
{ "always-promote-attributes",1, 0, 0, g_rc_always_promote_attributes },
{ "make-backup-files", 1, 0, 0, g_rc_make_backup_files },
{ "print-color-map", 0, 1, 0, g_rc_print_color_map },
{ "rc-filename", 0, 0, 0, g_rc_rc_filename },
{ "rc-config", 0, 0, 0, g_rc_rc_config },
{ NULL, 0, 0, 0, NULL } };
so the above is available for gaf.
///
Scm files geda-gaf/libgeda/scheme seems to be available:
$ gaf shell
...
guile> (component-library "/home/karl")
#t
guile>
$
where geda.scm seems to be the useful one:
$ grep '^(define' geda.scm
(define path-sep file-name-separator-string)
(define geda-data-path (car (sys-data-dirs)))
(define geda-rc-path (car (sys-config-dirs)))
(define (build-path first . rest)
(define regular-file?
(define directory?
(define has-suffix?
(define load-scheme-dir
(define* (component-library-search rootdir #:optional prefix)
$
///
So it seems libgeda doesn't provide much at all.
gnetlist adds a few to the list
$ grep '^ { ' gnetlist/src/g_register.c
{ "quit", 0, 0, 0, g_quit },
{ "exit", 0, 0, 0, g_quit },
{ "gnetlist-version", 1, 0, 0, g_rc_gnetlist_version },
{ "hierarchy-uref-mangle", 1, 0, 0, g_rc_hierarchy_uref_mangle },
{ "hierarchy-netname-mangle", 1, 0, 0, g_rc_hierarchy_netname_mangle },
{ "hierarchy-netattrib-mangle", 1, 0, 0, g_rc_hierarchy_netattrib_mangle },
{ "hierarchy-uref-separator", 1, 0, 0, g_rc_hierarchy_uref_separator },
{ "hierarchy-netname-separator", 1, 0, 0, g_rc_hierarchy_netname_separator },
{ "hierarchy-netattrib-separator", 1, 0, 0, g_rc_hierarchy_netattrib_separator },
{ "hierarchy-netattrib-order", 1, 0, 0, g_rc_hierarchy_netattrib_order },
{ "hierarchy-netname-order", 1, 0, 0, g_rc_hierarchy_netname_order },
{ "hierarchy-uref-order", 1, 0, 0, g_rc_hierarchy_uref_order },
{ "gnetlist:get-packages", 1, 0, 0, g_get_packages },
{ "gnetlist:get-non-unique-packages", 1, 0, 0, g_get_non_unique_packages },
{ "gnetlist:get-pins", 1, 0, 0, g_get_pins },
{ "gnetlist:get-all-nets", 1, 0, 0, g_get_all_nets },
{ "gnetlist:get-all-unique-nets", 1, 0, 0, g_get_all_unique_nets },
{ "gnetlist:get-all-connections", 1, 0, 0, g_get_all_connections },
{ "gnetlist:get-nets", 2, 0, 0, g_get_nets },
{ "gnetlist:get-pins-nets", 1, 0, 0, g_get_pins_nets },
{ "gnetlist:get-all-package-attributes", 2, 0, 0, g_get_all_package_attributes },
{ "gnetlist:get-toplevel-attribute", 1, 0, 0, g_get_toplevel_attribute },
{ "gnetlist:get-renamed-nets", 1, 0, 0, g_get_renamed_nets },
{ "gnetlist:get-attribute-by-pinseq", 3, 0, 0, g_get_attribute_by_pinseq },
{ "gnetlist:get-attribute-by-pinnumber", 3, 0, 0, g_get_attribute_by_pinnumber },
{ "gnetlist:vams-get-package-attributes", 1, 0, 0, vams_get_package_attributes },
{ "gnetlist:graphical-objs-in-net-with-attrib-get-attrib",
{ "gnetlist:get-backend-arguments", 0, 0, 0, g_get_backend_arguments },
{ "gnetlist:get-input-files", 0, 0, 0, g_get_input_files },
{ "gnetlist:get-verbosity", 0, 0, 0, g_get_verbosity },
{ NULL, 0, 0, 0, NULL } };
but nothing that be used for an archive tool.
///
> A tricky part of doing gnetlist-like things in gschem is that gnetlist
> takes a global view of the thing you're netlisting (simulation,
> board, cell, Â…) while gschem takes a page-level view. Gnetlist
> knows, from its command line, exactly which pages are the top
> level pages representing the netlist. Gschem does not know which
> open pages represent what in any broad sense. One consequence of
> this is that broken hierarchy can throw gnetlist into an infinite
> loop (acceptable since ^C gets you out). Gschem must avoid this,
> as recovery is trickier (open modified pages) and itÂ’s usually
> the tool youÂ’ll want to use to repair the problem. There are
> undoubtedly other ways where making gschem too smart about
> semantics would interfere with the ability to use it to fix a
> broken schematic.
Ahaa...
> For incorporating gschem-like things in gnetlist there are problems
> of navigation and hierarchy. Which U1 do you mean?
Isn't that what (hierarchy-uref-separator "/") is for ?
> The one on the current page? There is no current page.
But you have a top page, and there is some scanning code.
And while scanning the scan code has a "current page", though
that is not available for the scheme side.
The scanning seems be done in geda-gaf/gnetlist/src/s_traverse.c
> I donÂ’t know about anybody else, but I often have a crazy mishmash
> of pages open in gschem. Simulation “test fixtures”, pages from
> different boards (so I can look at both sides of interfaces),
> pages from different projects (how did I solve this last time?
> Can I copy/paste?), and often not a complete set of anything.
> Gnetlist-like processing is not sensible in that circumstance.
Ok.
> I like the idea of having more Scheme in the libgeda layer for
> gschem, gnetlist, and gaf to use, but I think the implementation
> of cross functionality is more difficult and prone to serious bugs
> than you might expect.
I didn't exspect anything so that sentence more true than you think:>
Regards,
/Karl Hammar
-----------------------------------------------------------------------
Aspö Data
Lilla Aspö 148
S-742 94 Östhammar
Sweden
+46 173 140 57
- Raw text -