Skip to content

v0.23.3 - #506

Merged
soronpo merged 4 commits into
mainfrom
training
Sep 8, 2026
Merged

soronpo merged 4 commits into
mainfrom
training

Conversation

@soronpo

@soronpo soronpo commented Sep 8, 2026

Copy link
Copy Markdown
Collaborator

No description provided.

Oron Port and others added 4 commits September 8, 2026 03:07
…archy

A design is emitted flat, so a base class and a mixed-in trait have no
construct of their own to hold an annotation. `@timing.clock` on a base was
therefore dropped outright: the design was built at the default clock rate,
and the annotation was missing from the elaborated code string.

Two independent gaps, neither of which alone fixes the reported case:

- core: `Design.initOwner` and `Interface.initOwner` read only the head of
  the `__clsMeta` chain, dropping every base class's annotations. They now
  fold the whole chain through `ir.Meta.foldClsChain`. Same-kind signal
  constraints merge field by field with the most-derived class taking
  priority, rather than concatenating: every consumer reads them with
  `collectFirst`, so a duplicate would silently drop the base's fields
  instead of inheriting them.

- plugin: `transformTypeDef` injects `__clsMeta` into classes only, so a
  trait contributes no entry at all. `clsChainAnnotations` folds into a
  class's own entry the annotations of the traits it introduces relative to
  its superclass, keeping each trait's contribution to exactly one entry of
  the chain, in linearization order. Injecting into traits was rejected: the
  phase runs after SuperAccessors, and traits in the chain would change
  `chain.last`, which names a vendor IP's type and a foreign IP's resource
  path.

Caching is unaffected in the unsafe direction and more correct in the other.
`dclMeta` carries the annotations and is part of the design load key, so
entries stored before this change miss rather than false-hit, and the key
only gained information. Code digests hash the compilation unit's source
text plus the dep closure, so editing a base's annotation now invalidates
the entries that depend on it, same file or not.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The spec looked for `ips/VivadoCounter.tcl`, so it only ever passed where
the file separator is `/`; on Windows it failed with a bare `None.get`.

A `SourceFile.path` is a filesystem path relative to the commit folder and
carries the platform separator: the two IP printers build it with
`Paths.get("ips").resolve(...)`, and `GowinDesigner`, `VivadoSim` and `NVC`
use `separatorChar`. Normalization to `/` belongs at the point a path is
written into a generated script, where it already happens
(`hdlFiles.forceWindowsToLinuxPath`, the literal `source ips/X.tcl` the
project tcl emits). So the printers are right and the expectation was not.

The lookup now builds the path the same way the printer does, and reports
the candidate paths instead of throwing `None.get` when it misses.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ces the script

The version banner casing differs between releases: 2023.1 prints
"Vivado v2023.1" while 2024.1 prints "vivado v2024.1". The pattern was
lowercase-only, so every release before 2024.1 was reported as not
installed. Matching case-insensitively covers both, and the same drift is
guarded on the xvlog/xvhdl banner.

The batch invocation used `-script`, which is undocumented in every Vivado
release and absent from the 2023.1 command-line parser. `-source` is the
documented option throughout, and the two are behaviorally identical where
both exist (same output, same exit codes).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@soronpo
soronpo merged commit 906e9f3 into main Sep 8, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant