ConfigurationPacket assumes that the payload data is owned by someone
else. For frame data, that is generally true. For initialization and
finalization sequences, those payloads need to be created and managed.
Instead, dynamically allocate packets which allows for using subclasses
of ConfigurationPacket that store the payload with the packet.
Signed-off-by: Rick Altherr <kc8apf@kc8apf.net>
Span<T> can be converted to a Span<const T> but the reverse is not true.
Since most of the uses of spans do not allow modification of the data,
taking a Span<const T> is more versatile and importantly allows them to
be used in const methods.
Signed-off-by: Rick Altherr <kc8apf@kc8apf.net>
ConfigurationPacketizer translates a Configuration's frame data to a
sequence of ConfigurationPackets that will write that configuration to
the configuration's Part.
Signed-off-by: Rick Altherr <kc8apf@kc8apf.net>
Configuration's original constructor expects Span<uint32_t>s as part of
the map to avoid copying the actual frame data. In tests or any other
place that needs to directly construct a Configuration, the caller will
already have a map with vector<uint32_t> to hold the actual frame data.
This new constructor just wraps those vectors in Spans.
Signed-off-by: Rick Altherr <kc8apf@kc8apf.net>
ConfigurationFrameAddress row-half and row fields translate directly to
the clock region structure used in 7-series parts. Break these concepts
out into separate classes and encode them as such in Part YAML.
Columns within a row are more complicated. Column indices are relative
to a BlockType. Think of each BlockType as a data bus that terminates at
some particular tile type (e.g. CLB_IO_CLK maps to INT_{L,R} tiles).
Column indices act as addresses of endpoints on the associated BlockType
bus. As the bus is 1 frame (101 words, 404 bytes) wide, each endpoint
feeds frames into multiple tiles simultaneously.
Minor addresses are frame addresses within a BlockType bus endpoint.
These can refer to frames either stored within the endpoint tiles
or in tiles chained behind them.
Note that a given tile can be connected on multiple BlockType buses.
For example, block RAMs appear to be attached both by being chained
behind an INT_{L,R} on the CLB_IO_CLK bus as well as being a direct
endpoint on the BLOCK_RAM bus. Due to this, tiles conceptually belong
to the row rather than a single column.
Signed-off-by: Rick Altherr <kc8apf@kc8apf.net>
_address suffix on accessors is unnecessary and somewhat inaccurate.
The returned values are indices rather than frame addresses.
Signed-off-by: Rick Altherr <kc8apf@kc8apf.net>
Frame addresses are only used in the context of configuration frames.
Remove the prefix to reduce typing that does not improve clarity.
Signed-off-by: Rick Altherr <kc8apf@kc8apf.net>
There seem to be 2 frames of padding between rows in a bitstream. For
single-frame writes, these are parsed as type 0 packets and ignored.
Normal bitstreams use a single FDRI write that apparently includes this
padding and needs to be ignored in the auto-increment handling.
Signed-off-by: Rick Altherr <kc8apf@kc8apf.net>
MemoryMappedFile's data() method returns a void* as it has no idea what
type the contents are. Viewing it as bytes is a very common operation
so add a convience method that wraps the pointer in a Span<uint8_t>.
Signed-off-by: Rick Altherr <kc8apf@kc8apf.net>
Currently is able to parse IDCODE and frames from a sequence of
ConfigurationPackets.
Signed-off-by: Rick Altherr <kc8apf@kc8apf.net>
Signed-off-by: Tim 'mithro' Ansell <mithro@mithis.com>
Currently just the pieces required to successfully identify and decode
a bitstream into configuration frames.
Signed-off-by: Rick Altherr <kc8apf@kc8apf.net>
Signed-off-by: Tim 'mithro' Ansell <mithro@mithis.com>
binary literals are a C++14 feature. Use hex literals instead to
keep C++11 compatibility.
Signed-off-by: Rick Altherr <kc8apf@kc8apf.net>
Signed-off-by: Tim 'mithro' Ansell <mithro@mithis.com>
Type 2 packets are used for when the amount of data required exceeds the
word count field in a Type 1 header. ConfigurationPacket mostly hides
this detail from the user but occasionally it is handy for debugging.
Signed-off-by: Rick Altherr <kc8apf@kc8apf.net>
Signed-off-by: Tim 'mithro' Ansell <mithro@mithis.com>
Both ConfigurationPacket and Configuration need to reference registers.
Use a common scoped enum to reduce change of errors. Leverage stream
operator to simplify outputing register names.
Signed-off-by: Rick Altherr <kc8apf@kc8apf.net>
Signed-off-by: Tim 'mithro' Ansell <mithro@mithis.com>
Class names were getting unwieldy. Use a namespace to group all the
7series classes and allow for shorter class names.
Signed-off-by: Rick Altherr <kc8apf@kc8apf.net>
Signed-off-by: Tim 'mithro' Ansell <mithro@mithis.com>
Reads the raw bitstream into configuration packets that represent
internal register writes.
Signed-off-by: Rick Altherr <kc8apf@kc8apf.net>
Signed-off-by: Tim 'mithro' Ansell <mithro@mithis.com>
Encapsulates configuration packets used in Xilinx 7-Series bitstream
format. The same class handles both Type 1 and Type 2 packets.
Signed-off-by: Rick Altherr <kc8apf@kc8apf.net>
Signed-off-by: Tim 'mithro' Ansell <mithro@mithis.com>
Functions for hiding all the masking and shifting required for accessing
bit ranges within an integer type.
Signed-off-by: Rick Altherr <kc8apf@kc8apf.net>
Signed-off-by: Tim 'mithro' Ansell <mithro@mithis.com>
Currently provides list of segbits files saved in the database.
Signed-off-by: Rick Altherr <kc8apf@kc8apf.net>
Signed-off-by: Tim 'mithro' Ansell <mithro@mithis.com>
Acts as an iterator that yields a single record from the file. Uses a
memory-mapped file and absl::string_view to avoid copies within the
reader.
Signed-off-by: Rick Altherr <kc8apf@kc8apf.net>
Signed-off-by: Tim 'mithro' Ansell <mithro@mithis.com>