Exporting coverage
At the end of a simulation, coverage should be exported for later viewing or merging. Bucket supports several on-disk formats:
| Format | Extension | Typical use |
|---|---|---|
| Archive | .bktgz |
Primary format for the viewer |
| SQL | .db |
Legacy storage and regression databases |
| JSON | .json |
Human-readable interchange and debugging |
From Python
# In your testbench — MyCvg is your Covertop subclass (NAME/DESCRIPTION set on the class)
self.my_cvg = MyCvg(log=self.log)
def export_coverage(self):
# Context hash is stored with the coverage and used to validate merges.
# An empty string can be provided instead.
context_hash = Repo().head.object.hexsha
readout = PointReader(context_hash).read(self.my_cvg)
# Preferred: write a viewer archive
ArchiveAccessor("test_2356.bktgz").write(readout)
# Or write SQL / JSON
SQLAccessor.File("test_2356.db").write(readout)
JSONAccessor("test_2356.json").write(readout)
See example/example.py for a complete export and merge workflow.
From the command line
Readout sources are specified with -r / --read (repeatable). If the record
index is omitted, all records from the source are read. If the type is omitted,
it is inferred from the file extension (.db → sql, .json → json,
.bktgz → archive).
Valid read forms:
<record>@<type>:<URI><record>@:<URI><type>:<URI><URI>
Examples:
# Export a simulation database to a viewer archive
python -m bucket write -r sql:./test_2356.db archive -o test_2356.bktgz
# Export to JSON
python -m bucket write -r archive:./run.bktgz json -o run.json
# Print a summary to the terminal
python -m bucket write -r archive:./run.bktgz console --summary
# Generate standalone HTML with the embedded viewer
# (needs a source checkout and Node.js; not available from a pip install)
python -m bucket write -r archive:./run.bktgz html -o index.html
# Generate a human-readable HTML coverage report
# (same checkout/Node.js requirement as `html`)
python -m bucket write -r archive:./run.bktgz report -o report.html
Merging coverage
After a regression, coverage from separate simulations can be merged before viewing. At present a simple merge is performed, producing one combined readout. Records must be compatible (same covertree definition) to merge successfully.
From Python
from bucket.rw import ArchiveAccessor
from bucket.rw.common import MergeReadout
readout_a = next(ArchiveAccessor("test_a.bktgz").reader().read_all())
readout_b = next(ArchiveAccessor("test_b.bktgz").reader().read_all())
merged = MergeReadout(readout_a, readout_b)
ArchiveAccessor("merged.bktgz").write(merged)
ArchiveAccessor.merge_files() provides a convenience wrapper for merging
multiple archives on disk.
From the command line
Use --merge / -m to merge all read sources before writing:
python -m bucket write -r sql:./test_2356.db -r sql:./test_87263.db -m archive -o merged.bktgz
python -m bucket write -r archive:./a.bktgz -r archive:./b.bktgz -m sql -o merged.db
In the viewer
You can also merge without writing a file first:
- Load multiple archives and choose Merge into one in the load dialog, or
- Use Edit → select two or more records → Merge Selected
Merged results exist only for the current session. Use Export in the viewer
to save the merged record as .bktgz or JSON, or as an HTML coverage report.
Prev: Adding coverage to the testbench
Next: Reading and Writing