[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8. Writing an application

This chapter contains information for those wishing to write their own CGEN application.

8.1 File Layout  Organization of source files
8.2 File Generation Process  Workflow in cgen
8.3 Coding Conventions  Coding conventions
8.4 Accessing Loaded Data  Reading data from loaded .cpu files
8.5 Name References  Architecture names in generated code
8.6 String Building  Building long strings and writing them out
8.7 COS  Cgen's Object System


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.1 File Layout

Source files in cgen are organized in a very specific way.(21) It makes it easy to find things.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.2 File Generation Process

This is an overview of cgen workflow.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.3 Coding Conventions


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.4 Accessing Loaded Data

Each kind of description file entry (defined with `define-foo') is recorded in an object of class <foo>.(22) All the data is collected together in an object of class <system>.(23) (24)

Data for the currently selected architecture is obtained with several access functions.

 
  (current-arch-name)
  - return symbol that is the name of the arch
  - this is the name specified with `define-arch'

  (current-arch-comment)
  - return the comment specified with `define-arch'

  (current-arch-atlist)
  - return the attributes specified with `define-arch'

  (current-arch-default-alignment)
  - return a symbol indicated the default aligment
    - one of aligned, unaligned, forced

  (current-arch-insn-lsb0?)
  - return a #t if the least significant bit in a word is numbered 0
  - return a #f if the most significant bit in a word is numbered 0

  (current-arch-mach-name-list)
  - return a list of names (as symbols) of all machs in the architecture

  (current-arch-isa-name-list)
  - return a list of names (as symbols) of all isas in the architecture

  - for most of the remaining elements, there are three main accessors
    [foo is sometimes abbreviated]
    - current-foo-list - returns list of <foo> objects in the architecture
    - current-foo-add! - add a <foo> object to the architecture
    - current-foo-lookup - lookup the <foo> object based on its name

  <atlist>
  (current-attr-list)
  (current-attr-add!)
  (current-attr-lookup)

  <enum>
  (current-enum-list)
  (current-enum-add!)
  (current-enum-lookup)

  <keyword>
  (current-kw-list)
  (current-kw-add!)
  (current-kw-lookup)

  <isa>
  (current-isa-list)
  (current-isa-add!)
  (current-isa-lookup)

  <cpu>
  (current-cpu-list)
  (current-cpu-add!)
  (current-cpu-lookup)

  <mach>
  (current-mach-list)
  (current-mach-add!)
  (current-mach-lookup)

  <model>
  (current-model-list)
  (current-model-add!)
  (current-model-lookup)

  <hardware>
  (current-hw-list)
  (current-hw-add!)
  (current-hw-lookup)

  <ifield>
  (current-ifld-list)
  (current-ifld-add!)
  (current-ifld-lookup)

  <operand>
  (current-op-list)
  (current-op-add!)
  (current-op-lookup)

  <insn>
  (current-insn-list)
  (current-insn-add!)
  (current-insn-lookup)

  <macro-insn>
  (current-minsn-list)
  (current-minsn-add!)
  (current-minsn-lookup)

  (current-ifmt-list)
  - return list of computed <iformat> objects

  (current-sfmt-list)
  - return list of computed <sformat> objects

  [there are a few more to be documented, not sure they'll remain as is]


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.5 Name References

To simplify writing code generators, system names can be specified with fixed strings rather than having to compute them. The output is post-processed to convert the strings to the actual names. Upper and lower case names are supported.

The `prefix' notion is to segregate different code for the same cpu family. For example, this is used to segregate the ARM ISA from the Thumb ISA.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.6 String Building

Output generation uses a combination of writing text out as it is computed and building text for later writing out.

The top level file generator uses string-write. It takes string-lists and thunks as arguments and writes each argument in turn to stdout. String-lists are lists of strings (nested arbitrarily deep). It's cheaper to cons long strings together than to use string-append. Thunks return string-lists to write out, but isn't computed until all preceeding arguments to `string-write' have been written out. This allows defering building up of large amounts of text until it needs to be.

The main procedures for building strings and writing them out are:


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.7 COS

COS is Cgen's Object System. It's a simple OO system for Guile that was written to provide something useful until Guile had its own. COS will be replaced with GOOPs if the Scheme implementation of cgen is kept.

The pure Scheme implementation of COS uses vectors to record objects and classes. The C implementation uses smobs (though classes are still implemented with vectors).

A complete list of user-visible functions is at the top of `cos.scm'.

Here is a list of the frequently used ones.


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Ben Elliston on January, 8 2003 using texi2html