Skip to content

Releases: pcardaba/TimeIt

Release v2.5.0

Choose a tag to compare

@pcardaba pcardaba released this 13 Sep 20:24

[v2.5.0] - 2026-09-13

Signals can now be computed from other signals instead of only being drawn
from a list of edges. Nothing breaks: v2.4.0 scripts load unchanged.

Added

  • create_logic -op and|or|xor|nand|nor|not -inputs {sig ...}. Combines
    any number of signals, or inverts one, into a new waveform. The operands
    are merged in the time domain rather than snapped to a clock grid, so
    signals launched by different or unrelated clocks combine correctly.
    Unknown propagates through the operator except where a controlling value
    masks it (0 AND x is 0, 1 OR x is 1), and the min/max transition
    windows of the operands count as unknown, so the result shows the real
    uncertainty. A hi-Z operand resolves to 1 when it was created
    -pulled_up and to unknown otherwise. -tpd_max / -tpd_min delay the
    result and their spread widens every transition window, like the delays of
    an I/O signal. Clocks, buses and PWL signals are rejected as operands, and
    so is any definition that would close a dependency loop.
  • create_sampled -source <signal> -clock <clock> [-edge rising|falling].
    Resamples a signal the way a flip-flop does, holding each captured value
    until the next sampling edge. At every edge the source is examined over
    the half-open aperture [t - setup, t + hold): anything other than one
    stable value across the whole aperture captures as unknown and stays
    unknown until the next edge, which is how a setup or hold violation
    appears on the diagram. -setup, -hold, -tco_max and -tco_min are
    Tcl expressions defaulting to 0. Sampling on a gated clock holds through
    the suppressed pulses, a bus source may be resampled, and the source may
    itself be a derived signal.
  • Derived signals compose. Their waveform is expressed exactly like a
    basic signal's, so one can be measured by a timing marker, be annotated,
    or feed another derived signal.
  • Removing a signal a derived signal reads is refused (remove -signal
    and the Delete Signal menu), with a message naming the derived signals to
    remove or edit first. The same rule refuses re-creating such a signal
    under another class. The move_signal rules now cover operands as well:
    a derived signal stays below what it reads, so a saved script always
    reloads intact.
  • set_attribute understands the derived signals. op, inputs,
    tpd_max/tpd_min of a logic signal and source, clock, edge,
    setup/hold/tco_max/tco_min of a sampled signal are resolved and
    validated exactly like the corresponding create_* options, so a typo is
    refused instead of dropping the signal at the next redraw.
  • Both are available from the GUI under New Signal → Logic… and
    New Signal → Sampled…, with the input or source pre-filled from the
    right-clicked signal, and reopen for editing through Edit Signal like
    any other signal. The pickers only offer choices the command would accept.
  • See How to create logic and sampled signals and
    the logic_example.tcl example.

Changed

  • Double-clicking a signal name opens its edit dialog, the same one the
    context menu reaches, for every signal type. Previously a double-click on a
    name did nothing and editing was only reachable through the right-click
    menu. Double-clicking a waveform element still opens its annotation dialog.

Notes

  • Derived signals are omitted from write_sdc: they model internal nodes,
    not I/O pins. They can not gate a clock (-enabled_by still takes an input
    or output only).

Release v2.4.0

Choose a tag to compare

@pcardaba pcardaba released this 10 Sep 17:11
2262d35

[v2.4.0] - 2026-09-10

Analog waveforms come to TimeIt: the new create_pwl command overlays
piece-wise-linear traces (voltage, current, temperature...) in a single
waveform slot, each with oscilloscope-style scale and offset knobs, and value
markers read back a trace's interpolated value at any point. PWL signals are
documentation only — write_sdc ignores them.

Nothing breaks: v2.3.0 scripts load unchanged.

Added

  • PWL (analog) signals. create_pwl -names {...} -files {...} draws one
    or more piece-wise linear waveforms (voltage, current, temperature...) in a
    single waveform slot, read from two-column text files (time, value) that
    accept time units, engineering notation and SPICE-style SI prefixes
    (10mV, 400e-3, 5MEG). Every trace is normalized to the slot and has
    its own color, lstyle, lwidth, scale, offset and visible
    attributes (set with set_attribute on the trace name), scale and offset
    acting like the vertical knobs of an oscilloscope. New Signal → PWL (analog)
    ...
    is the dialog
    counterpart (up to 5 traces per slot). PWL signals are documentation
    signals: write_sdc ignores them. See docs/20_pwl_signals.md.
  • Value markers on PWL traces: right-click a trace and Add Value
    Marker
    to read its interpolated value there (1.2V, 120mA). The label
    can be dragged (a thin line keeps it tied to the marked point) and its text
    edited with a double-click. Saved as create_value_marker, removed with
    remove -vmarker.
  • Ovals (the colored dots of PWL labels and value markers) are now exported
    in every format.

Changed

  • PWL dialog and value-marker refinements. The New Signal → PWL
    (analog)...
    form was simplified, and value-marker rendering and their
    set_attribute handling were tightened up.

v2.3.0

Choose a tag to compare

@pcardaba pcardaba released this 31 Aug 19:29
df1d55a

What's new

Import VCDs (File → Import VCDs)

  • Import Value Change Dump (.vcd) waveform files and convert them into TimeIt timing diagrams.
  • VCD parsing, signal analysis, and a clock-characterization dialog to map imported signals onto the diagram model.
  • User-guide documentation for the import workflow.

Release v2.2.0

Choose a tag to compare

@pcardaba pcardaba released this 25 Jul 18:07

[v2.2.0] - 2026-07-25

Generated clocks can now be gated and inverted, and diagrams can bootstrap their
own SDC I/O constraints with the new write_sdc command. Several editing and
data-safety rough edges are also smoothed out: timing markers open their edit
dialog on a double-click, unsaved sessions warn before they are discarded, and
your own Tcl variables survive a round trip through File → Write Script....

Nothing breaks: v2.1.0 scripts load unchanged.

Added

  • write_sdc -file {path}. Generates a partial SDC (Synopsys Design
    Constraints) file from the diagram's input and output signals:
    set_input_delay / set_output_delay statements (converting internal
    delays to their external equivalent, and taking the worst case of data and
    output-enable delays for tri-stated outputs), plus set_multicycle_path
    statements whenever a signal's launch and capture clocks differ. Diagram
    timing variables are re-declared so the statements stay symbolic, and
    diagram clocks are sketched as commented-out create_clock /
    create_generated_clock templates. Signals clocked by a gated clock are
    constrained from the free-running waveform, as STA assumes. This is what
    File → Write SDC... now runs; the generated file is a bootstrap aid,
    not a ready-to-use constraint deck — see
    Writing an SDC constraint file.
  • Generated clocks can be gated. create_clock -enabled_by <enable_signal> [-enable_active high|low] gates a generated clock with an
    existing input/output signal, the same way a latch-based ICG does: a pulse
    is only emitted when the enable is at its active level at the pulse's
    leading edge, and the clock parks at its idle level while disabled. Edge
    numbering counts only the visible (drawn) edges, so signals referencing the
    gated clock track the enabled burst. Gating can also be set or cleared on
    an existing clock with set_attribute -name enabled_by.
  • Generated clocks can be inverted. create_clock -invert complements a
    generated clock — it falls where the direct clock would rise and vice
    versa — with the same semantics as SDC's create_generated_clock -invert.
    Combines with either -edges or -divide_by.
  • redraw. Forces a full repaint of every signal, timing marker, split
    and annotation on both canvases. Only needed after driving the diagram
    from plain Tcl set commands that bypass the app's own change tracking.
  • Timing markers open their edit dialog on double-click, matching every
    other editable diagram element.
  • Unsaved-session warnings. Loading a script or exiting the application
    while the diagram differs from its last saved/loaded state now asks
    whether to save first, with the load/exit cancellable from the prompt.
    View-only changes (window resize, zoom) do not count as modifications.
  • User Tcl variables survive Write Script. Plain set variables you
    define yourself (in the console or a sourced script) are now re-emitted by
    File → Write Script... in a # --- User variables --- section ahead of
    anything that could reference them, so remove -all at the top of the
    reloaded script no longer drops them.

Release v2.1.0

Choose a tag to compare

@pcardaba pcardaba released this 14 Jul 14:30

A command for every GUI action

The console log pane was never really doing its job: it only showed what you typed. Now every GUI action that changes the diagram runs its
equivalent TCL command, and that command is logged in the pane
, exactly as if you had typed it.

That makes the pane a trace of the session. You can read back how something was done, press to recall and re-run a past action,
and recover after a crash: the log is also written to classes/timeit_commands.log without the % prefix, so that file is a valid script
that rebuilds the diagram.

% create_clock -name clk -topology source -period {10} -rise_at {0} -fall_at {5} -visible -show 4
% create_waveform_split -at 25.0
% create_timing_marker -from start:uid_0_0 -to end:uid_0_1
% move_signal -name {dout} -direction up
% remove -signal {1}

Most of this release is the command language catching up with the GUI, so that no action is left without a command.

v2.0.0 scripts load unchanged — there is nothing to migrate.

New commands

  • helphelp lists every command TimeIt adds to the interpreter; help <command> prints its help notice (the same as <command> -h elp).
  • export_canvas — exports the canvas from a script or the console, in the same six formats as the menu:
    export_canvas -file {diagram.svg}
    export_canvas -file {diagram.png} -dpi 600 -background {#f0f0f0}
    export_canvas -file {report/fig3} -format pdf
    This is what File → Export Canvas… now runs.
  • move_signal — reorders a signal, which previously could only be done from the context menu:
    move_signal -name clk -direction down
    A move that would put a signal above the clocks it refers to is refused, in the GUI and in the console alike.
  • remove -annotation / remove -timing_var — the two objects remove could not delete:
    remove -annotation {uid_2_11}   ;# by the waveform element it annotates
    remove -timing_var {tSU tHO}    ;# by name; also unset in the interpreter

Timing markers and waveform splits can be updated

create_timing_marker and create_waveform_split now accept -use_uid. When a marker or a split already carries that uid it is updated
in place
instead of a second one being created, and the options you do not give keep their current value:

create_timing_marker  -use_uid 0  -style outer          ;# restyle it
create_timing_marker  -use_uid 0  -anchor from -at 30   ;# re-anchor and move it
create_waveform_split -use_uid 0  -at 75                ;# move it, keep its look

This is what lets a restyle, a re-anchor, a rename or a drag be expressed — and logged — as a command.

Behaviour change worth knowing

remove -all now also clears the timing variables and the measured values of the named timing markers. Every saved script starts with remove -all, so loading a diagram no longer inherits either from the diagram it replaces, and no longer saves them back into it.

If you have a hand-written script that sets its timing variables before a remove -all, move them after it. Generated scripts already do
the right thing.

Fixed

  • The Settings dialog changed a setting in the model without setting the corresponding TCL variable, so the two could disagree.
  • The Remove button of the User Timings window crashed on a row that had been added but never given a value.
  • set_canvas_scale -help and set_window_size -help did not print their help.
  • The Input/Output signal dialogs printed the command they built to the terminal's stdout, where nobody launching the app from a desktop ent
    ry would ever see it. It goes to the log pane now, like every other command.
  • Every command TimeIt registers now has a -help notice (puts, set_window_size and set_canvas_scale had none).

Documentation

The user guide covers the command log, move_signal, remove by uid, marker update and removal, annotation removal and timing-variable rem
oval. Two stale claims are gone: that remove could not delete signals individually, and that deletion was not undoable.

Full changelog: CHANGELOG.md · v2.0.0…v2.1.0

Release v2.0.0

Choose a tag to compare

@pcardaba pcardaba released this 13 Jul 20:12

[v2.0.0] - 2026-07-13

Major release. The clock model of the I/O signals changed: a data path is now
described by the clock that launches it and the clock that captures it,
instead of by a single reference clock. Diagrams written for v1.x do not load
until they are migrated (see Migration below).

Breaking

  • create_input / create_output: the -refclock option is removed and
    replaced by -launch_clock and -capture_clock. Both clocks must be related
    (they must share the same source clock); giving only one of them means the
    same clock launches and captures the data, which is the v1.x behaviour.

Added

  • Generated clocks. create_clock now creates either a source clock
    (topologies source, clockin, waveform given explicitly) or a generated
    clock (topologies clockout, clockinout, waveform derived from a master
    clock):
    • -master : the source clock the clock derives from.
    • -edges {rise fall cycle_end} : master clock edges generating this clock,
      with the same semantics as the SDC create_generated_clock -edges option.
    • -divide_by divisor : shorthand for -edges {1 divisor+1 2*divisor+1}.
    • -output_dly : delay the clock takes to come out of the interface.
    • -input_dly : clockinout only, delay of the clock fed back in.
  • Launch/capture rendering. The capturing edge of a data path is now
    resolved against the capture clock waveform instead of being assumed to be
    half a period (or a period) away on the reference clock. The edge lists
    (-data_edges, ...) still always name launch clock edges.
  • remove by uid. remove now accepts -signal {uids}, -split {uids}
    and -tmarker {uids}, which may be combined in a single command. Removing a
    signal still removes everything depending on it (its timing markers, and the
    clocks/signals derived from it).
  • Delete Split. A waveform split can be deleted from the canvas context
    menu, by right-clicking on it.
  • remove -help and set_app_var -help, with their data/*.help.txt reference
    pages (neither command had one).
  • Documentation: How to use timing variables (docs/17_timing_vars.md).

Fixed

  • Input signals specified with internal delays, and output signals specified
    with external delays, used the uncertainty of the wrong clock edge when the
    data was launched on one polarity and captured on the other.
  • Output signals specified with internal delays subtracted the falling clock
    uncertainty twice from the min delay of data launched on a falling edge.
  • A timing marker anchored on a signal that could not be drawn crashed the tool
    with an empty Tcl error. The marker is now skipped and the cause is reported in
    the console.
  • set_app_var cleared the description of a timing variable when its value was
    set again without -desc. The description is now kept; pass -desc {} to
    clear it.

Changed

  • The Input/Output signal dialogs are more compact and let the launch and the
    capture clock be selected.
  • The clock, I/O signal and timing variable documentation was rewritten for the
    new model.
  • The example scripts in scripts/ were migrated to the new options.

Migration from v1.x

Replace the -refclock option of every create_input / create_output by
-launch_clock, which preserves the v1.x behaviour exactly:

# v1.x
create_input -name data_i -refclock clk ...

# v2.0.0 (same behaviour: clk both launches and captures)
create_input -name data_i -launch_clock clk ...

Give -capture_clock as well when the data is captured by a different (related)
clock.

Release v1.1.0

Choose a tag to compare

@pcardaba pcardaba released this 21 Jun 14:33

[feat] Adding Help entry menu to give TimeIt basic information
[bug] Properly clearing Hidden signals dynamic cascade ctx menu
[feat] Undo/Redo capability.
[gui] canvas y-scrolling shall not go negative
[doc] Install clarifications.

TimeIt v1.0.0

Choose a tag to compare

@pcardaba pcardaba released this 09 Jun 11:15

Initial release