Skip to content

Design.writeCheckpoint emits non-deterministic binary outputs #1244

@korbin

Description

@korbin

I run RapidWright and Vivado in Docker (but have run it in similar caching systems previously) which provides binary layer caching for the inputs and outputs to build stages. If the checksums for all of the inputs (files, arguments, etc.) don't change, intermediate stages can be cached and reused.

I have synth, opt, place, route build stages for a plain Vivado flow. In some builds, I use a RapidWright intermediate stage to manipulate Vivado DCPs.

If I run:

 val dcp = Design.readCheckpoint("vivado.dcp")
 dcp.writeCheckpoint("rapidwright1.dcp")
 dcp.writeCheckpoint("rapidwright2.dcp")

The emitted DCPs: rapidwright1.dcp and rapidwright2.dcp contain different binary data (and interestingly: on a 522MB Vivado DCP, the DCPs that RapidWright emits are only 356MB).

I assume a timestamp or something is getting inserted into the DCP output which is causing the file checksums to be different, breaking any kind of caching one might be using:

# sha256sum rapidwright*.dcp
3d88a165e38282320b92e8ac020b7ef4472fda2d1bc971f261b868dcdcbd8a31  rapidwright1.dcp
aa514d798478831d6ad232ddc75fdb6617670cefba4dd1cb1eb9abba77298ab1  rapidwright2.dcp

I would love the ability for rapidwright1.dcp and rapidwright2.dcp to have the same binary contents and checksum - even if this means fixing or explicitly passing the timestamp or whatever is changing internally. It's okay if vivado.dcp and rapidwright1.dcp don't match, as I'm sure these are radically different codebases, DCP generation routines, etc., but successive RapidWright runs should be able to result in consistent outputs.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions