## 4.3 Part Definitions

    part
        id               = <id> ;                 # quoted string
        desc             = <description> ;        # quoted string
        family_id        = <description> ;        # quoted string
        has_jtag         = <yes/no> ;             # part has JTAG i/f
        has_debugwire    = <yes/no> ;             # part has debugWire i/f
        has_pdi          = <yes/no> ;             # part has PDI i/f
        has_updi         = <yes/no> ;             # part has UPDI i/f
        has_tpi          = <yes/no> ;             # part has TPI i/f
        devicecode       = <num> ;                # numeric
        stk500_devcode   = <num> ;                # numeric
        avr910_devcode   = <num> ;                # numeric
        signature        = <num> <num> <num> ;    # signature bytes
        usbpid           = <num> ;                # DFU USB PID
        reset            = dedicated | io;
        retry_pulse      = reset | sck;
        pgm_enable       = <instruction format> ;
        chip_erase       = <instruction format> ;
        chip_erase_delay = <num> ;                # micro-seconds
        # STK500 parameters (parallel programming IO lines)
        pagel            = <num> ;                # pin name in hex, i.e., 0xD7
        bs2              = <num> ;                # pin name in hex, i.e., 0xA0
        serial           = <yes/no> ;             # can use serial downloading
        parallel         = <yes/no/pseudo>;       # can use par. programming
        # STK500v2 parameters, to be taken from Atmel's XML files
        timeout          = <num> ;
        stabdelay        = <num> ;
        cmdexedelay      = <num> ;
        synchloops       = <num> ;
        bytedelay        = <num> ;
        pollvalue        = <num> ;
        pollindex        = <num> ;
        predelay         = <num> ;
        postdelay        = <num> ;
        pollmethod       = <num> ;
        mode             = <num> ;
        delay            = <num> ;
        blocksize        = <num> ;
        readsize         = <num> ;
        hvspcmdexedelay  = <num> ;
        # STK500v2 HV programming parameters, from XML
        pp_controlstack  = <num>, <num>, ...;     # PP only
        hvsp_controlstack = <num>, <num>, ...;    # HVSP only
        hventerstabdelay = <num>;
        progmodedelay    = <num>;                 # PP only
        latchcycles      = <num>;
        togglevtg        = <num>;
        poweroffdelay    = <num>;
        resetdelayms     = <num>;
        resetdelayus     = <num>;
        hvleavestabdelay = <num>;
        resetdelay       = <num>;
        synchcycles      = <num>;                 # HVSP only
        chiperasepulsewidth = <num>;              # PP only
        chiperasepolltimeout = <num>;
        chiperasetime    = <num>;                 # HVSP only
        programfusepulsewidth = <num>;            # PP only
        programfusepolltimeout = <num>;
        programlockpulsewidth = <num>;            # PP only
        programlockpolltimeout = <num>;
        # JTAG ICE mkII parameters, also from XML files
        allowfullpagebitstream = <yes/no> ;
        enablepageprogramming = <yes/no> ;
        idr              = <num> ;                # IO addr of IDR (OCD) reg.
        rampz            = <num> ;                # IO addr of RAMPZ reg.
        spmcr            = <num> ;                # mem addr of SPMC[S]R reg.
        eecr             = <num> ;                # mem addr of EECR reg.
                                                  # (only when != 0x3c)
        is_at90s1200     = <yes/no> ;             # AT90S1200 part
        is_avr32         = <yes/no> ;             # AVR32 part

        memory <memtype>
            paged           = <yes/no> ;          # yes / no
            size            = <num> ;             # bytes
            page_size       = <num> ;             # bytes
            num_pages       = <num> ;             # numeric
            min_write_delay = <num> ;             # micro-seconds
            max_write_delay = <num> ;             # micro-seconds
            readback_p1     = <num> ;             # byte value
            readback_p2     = <num> ;             # byte value
            pwroff_after_write = <yes/no> ;       # yes / no
            read            = <instruction format> ;
            write           = <instruction format> ;
            read_lo         = <instruction format> ;
            read_hi         = <instruction format> ;
            write_lo        = <instruction format> ;
            write_hi        = <instruction format> ;
            loadpage_lo     = <instruction format> ;
            loadpage_hi     = <instruction format> ;
            writepage       = <instruction format> ;
          ;
      ;

### 4.3.1 Parent Part

Parts can also inherit parameters from previously defined parts using the following syntax. In this case specified integer and string values override parameter values from the parent part. New memory definitions are added to the definitions inherited from the parent.

       part parent <id>                              # quoted string
           id               = <id> ;                 # quoted string
           <any set of other parameters from the list above>
         ;

### 4.3.2 Instruction Format

Instruction formats are specified as a comma separated list of string values containing information (bit specifiers) about each of the 32 bits of the instruction. Bit specifiers may be one of the following formats:

`1`

  The bit is always set on input as well as output

`0`

  the bit is always clear on input as well as output

`x`

  the bit is ignored on input and output

`a`

  the bit is an address bit, the bit-number matches this bit specifier’s position within the current instruction byte

`aN`

  the bit is the Nth address bit, bit-number = N, i.e., `a12` is address bit 12 on input, `a0` is address bit 0.

`i`

  the bit is an input data bit

`o`

  the bit is an output data bit

Each instruction must be composed of 32 bit specifiers. The instruction specification closely follows the instruction data provided in Atmel’s data sheets for their parts. For example, the EEPROM read and write instruction for an AT90S2313 AVR part could be encoded as:

    read  = "1  0  1  0   0  0  0  0   x x x x  x x x x",
            "x a6 a5 a4  a3 a2 a1 a0   o o o o  o o o o";

    write = "1  1  0  0   0  0  0  0   x x x x  x x x x",
            "x a6 a5 a4  a3 a2 a1 a0   i i i i  i i i i";