| # Emboss Roadmap |
| |
| Arrows indicate implementation order; that is, "A -> B -> C" means "C depends on |
| B which depends on A." |
| |
| ```dot {layout_engine=dot} |
| digraph { |
| node [ shape=box target="_top" ] |
| edge [ dir="back" ] |
| rankdir="RL" |
| |
| { |
| rank="sink" |
| misc [ label="Other" URL="#misc" ] |
| strings [ label="String Type" URL="#strings" ] |
| proto_back [ label="Proto Backend" URL="#proto_back" ] |
| arr_of_bits [ label="Packed Arrays" URL="#arr_of_bits" ] |
| array_stride [ label="Arbitrary Array Stride" URL="#array_stride" ] |
| dyn_array_elem_size [ label="Dynamic Elements" URL="#dyn_array_elem_size" ] |
| shift_ops [ label="<< and >>" URL="#shift_ops" ] |
| private [ label="Private Fields" URL="#private" ] |
| type_syn [ label="Type Syntax" URL="#type_syn" ] |
| division [ label="//" URL="#division" ] |
| exponent [ label="**" URL="#exponent" ] |
| requires [ label="[requires]" URL="#requires" ] |
| } |
| |
| del_range [ label="rm [range]" URL="#del_range" ] |
| del_is_integer [ label="rm [is_integer]" URL="#del_is_integer" ] |
| |
| { |
| rank="source" |
| |
| del_anon_hack [ label="Unhack Anon Bits" URL="#del_anon_hack" ] |
| checksums [ label="CRC/Checksum" URL="#checksums" ] |
| } |
| |
| del_is_integer -> type_syn |
| |
| del_range -> requires |
| checksums -> requires |
| del_anon_hack -> private |
| del_is_integer -> exponent |
| del_is_integer -> division |
| |
| open_source -> del_range |
| open_source -> del_is_integer |
| |
| edge [style=dashed] |
| } |
| ``` |
| |
| [TOC] |
| |
| |
| ## Type Syntax {#type_syn} |
| |
| A syntax for expressing Emboss expression types. Likely some variation of set |
| builder notation: |
| |
| ``` |
| { x in $integer | 0 <= x <= 510 && x % 2 == 0 } |
| ``` |
| |
| This is needed to replace the `[is_integer]` attribute |
| |
| |
| ## Remove `[is_integer]` {#del_is_integer} |
| |
| Replace the `[is_integer]` attribute on `external`s with a `[type]` attribute. |
| This also lets us remove the hack in `expression_bounds.py`. In passing, it |
| should also allow `Flag` fields to be used as booleans in expressions. |
| |
| |
| ## Private Fields {#private} |
| |
| Provide some annotation -- likely an attribute -- that indicates that a field is |
| "private:" that it should not appear in text format, and that it cannot be |
| referenced from outside the structure. From an end user perspective, this is |
| primarily useful for virtual fields; internally, the automatic structure that |
| wraps anonymous bits can also be marked private so that the backend can stop |
| caring about `is_anonymous`. |
| |
| |
| ## Finishing Refactoring Hacky Anonymous Bits Code {#del_anon_hack} |
| |
| Replace the final uses of *`name`*`.is_anonymous` with something that marks |
| "anonymous" fields as "private." |
| |
| |
| |
| ## `[requires]` on Fields {#requires} |
| |
| Allow the `[requires]` attribute on fields, which can provide an arbitrary |
| expression whose value must be `true` for the field to be `Ok()`. |
| |
| |
| ## Remove `[range]` {#del_range} |
| |
| Replace all extant uses of `[range: low..high]` with `[requires: low <= field < |
| high]`, and remove support for `[range]`. |
| |
| |
| ## Native Checksum/CRC Support {#checksums} |
| |
| Add support for checking standard checksums/CRCs, and for automatically |
| computing them. |
| |
| |
| ## Shift Operators (`<<` and `>>`) {#shift_ops} |
| |
| Left and right shift operators for use in expressions. |
| |
| |
| ## Flooring Integer Division (`//`) and Modulus (`%`) {#division} |
| |
| Flooring (not truncating) integer division for use in expressions, and the |
| corresponding modulus operator. |
| |
| |
| ## Exponentiation (`**`) {#exponent} |
| |
| Exponentiation operator. Mostly needed for `[type]` on `UInt`, `Int`, and |
| `Bcd`. |
| |
| |
| ## Arrays with Runtime-Sized Elements {#dyn_array_elem_size} |
| |
| Support for arrays where the element size is not known until runtime; e.g., |
| arrays of arrays, where the inner array's size is determined by some variable. |
| |
| |
| ## Arbitrary Array Stride {#array_stride} |
| |
| Support for arrays where the stride (distance between the starts of successive |
| elements) is different from the element size. Needed to support padding between |
| elements and interlaced elements. |
| |
| |
| ## Large Arrays of `bits` {#arr_of_bits} |
| |
| Support for large, packed arrays of, e.g., 12-bit integers. Requires such |
| arrays to be byte-order-aware, and there are potential readability concerns. |
| |
| |
| ## Proto Backend {#proto_back} |
| |
| A backend which generates: |
| |
| 1. A `.proto` file with an "equivalent" set of types. |
| 2. C++ code that can populate the protos from Emboss views and vice versa. |
| |
| Essentially, you would be able to serialize to and deserialize from the "proto |
| form" the same way that you can currently serialize to and deserialize from |
| text. |
| |
| |
| ## String Type {#strings} |
| |
| A physical type for strings. This is complex, because strings can be stored in |
| many formats. It is likely that Emboss will only support byte strings, and will |
| not directly handle character encodings, but that still leaves a number of |
| common formats: |
| |
| 1. Length-specified: length is determined by another field. |
| 2. Delimited: string runs until some delimiter byte; usually zero, but |
| sometimes ASCII space or '$'. |
| 3. Optionally-delimited: string runs until either a delimiter byte *or* some |
| maximum size. |
| 4. Right-padded: string bytes run to some maximum size, but padding bytes |
| (usually ASCII space) should be chopped off the end. Bytes with the |
| padding value can appear in the middle. |
| |
| |
| ## Miscellaneous/Potential Features {#misc} |
| |
| These features could happen if there is interest, but there is no current plan |
| to implement them. |
| |
| |
| ### Fixed Point |
| |
| Support for fixed-point arithmetic, both in expressions and physical formats. |
| |
| |
| ### Documentation Backend |
| |
| Support for an HTML/PDF/???-format documentation generator. |
| |
| |
| ### Python Backend |
| |
| A code generator for Python. |