ucs_monitor_run_status.pl

Usage Guide — UCS PnR Run Status Monitor

Scriptucs_monitor_run_status.pl
VersionUCS-1.0.0
Modified2026-04-14
PurposeMonitor PnR run status, extract QoR metrics, and generate HTML status reports
Supporttech@universalchipstudio.com
Quick Nav: Features Quick Start Input Sources Filtering Metrics & Monitor Items Output & Display Email Mirror Slim Mirror Debug ECO Flow Scenario Names Config File Format Examples Workflow Diagram

Key Features

Quick Start

# Minimal — scan current directory, show run time summary
ucs_monitor_run_status.pl --monitor_item summary

# Full report with timing details, emailed to yourself
ucs_monitor_run_status.pl --base_dir /path/to/runs \
    --metrics time timing routing \
    --monitor_item summary timing \
    --to your_userid

# Outlook-optimized with flat tables + Excel export
ucs_monitor_run_status.pl --base_dir /path/to/runs \
    --monitor_item summary timing clock_qor \
    --flat_table --excel

Input Sources

At least one input source is required. If none is specified, defaults to scanning the current working directory.

OptionTypeDefaultDescription
--base_dirstring cwd (fallback) Base directory to scan for run subdirectories. Each subdirectory containing a tile.params file is treated as a run.
--run_liststring— Path to a text file listing run directories, one per line.
--runstring— Explicit run directory path. repeatable
--config_dirstring— Directory containing .conf config files. Each .conf file defines a separate monitoring job. Files with a corresponding .conf.done are skipped.
--config_filestring— Path to a specific config file. repeatable
Priority: When both CLI and config file specify the same option, CLI takes precedence — except for base_dir, run_list, run, interval, config_dir, and config_file, which are always taken from the config file when present.

Filtering Options

OptionTypeDefaultDescription
--tilesstring— Include only these tile names. repeatable
--skip_tilesstring— Exclude these tile names. repeatable
--ownerstring— Filter runs by PD_OWNER from tile.params. repeatable
--stagestringall stages Limit detail timing/clock_qor to specific stages. Values: synthesize, place, cts, preoptcts, optcts, route, optroute, reroute, pretiming, routetiming, reroutetiming. repeatable
--scenariostringall Include only scenarios matching this pattern (regex, case-insensitive). repeatable
--no_scenariostring_si Exclude scenarios matching this pattern (regex, case-insensitive). SI scenarios are excluded by default. Use --no_scenario "" to include them. repeatable
--checkstringboth Timing check type filter: setup, hold, or both.
--select_groupstringall Include only these timing path groups (regex). repeatable
--ignore_groupsstringDesign, DESIGN Exclude these timing path groups (regex). repeatable
--ignore_io / --noignore_iobooleanon Ignore IO path groups (io_to_flop, flop_to_io, io_to_io, etc.).
--clocksstringall Filter clock QoR to specific clocks (regex). repeatable
--slack_less_thanfloat0 Only show timing groups with WNS below this threshold.

Metrics & Monitor Items

--metrics (Summary Table Columns)

Controls which metrics appear in the summary table. repeatable

ValueWhat It ShowsPer Step
timeElapsed run time (hours), color-coded by statusFxSynthesize → FxReRoute + Total
timingSummary WNS values (setup_wns/hold_wns/total_wns)Per applicable step
routingDRC violations/shorts/overflow or congestion %Per applicable step
utilizationLogic cell utilization %Per applicable step
clock_qorClock skew/latency summary (from clock_display file)Per applicable step

--monitor_item (Report Sections)

Controls which sections appear in the report. repeatable

ValueWhat It Generates
summarySummary table with per-step metrics, disk usage, owner, run directory
timingDetail timing table with WNS/TNS/Violations per scenario/group, with optional diff
clock_qorClock QoR table with skew, latency per scenario/clock
noticeNotice/comment section from notice and comment files in run directories
OptionTypeDefaultDescription
--qorbooleanoff Enable QoR comparison using fc_shell compare_qor_data. Requires Fusion Compiler in PATH.
--consider_hangfloat2 Hours since last log modification before marking a running job as "hang".

Output & Display Options

OptionTypeDefaultDescription
--merge_tablebooleanoff Merge all tiles into a single table instead of separate per-tile tables.
--flat_tablebooleanoff Use flat table layout with no colspan/rowspan. Significantly faster Outlook rendering. Repeats all dimension values (tile, scenario, group) in every row.
--comparebooleanoff Show differences from the base run. Color-coded: green = improved, red = degraded. Base run is auto-detected or marked by a base_run file in the run directory.
--excelbooleanoff Export to Excel (.xlsx) with Summary, Detail Timing, and Clock QoR sheets. Flat layout with autofilter. Requires Excel::Writer::XLSX.
--use_linkbooleanoff Use symbolic link names as run nicknames instead of NICKNAME from tile.params or qor_name.
--color_schemestringdefault HTML color theme. Available: default, dark, minimalist, high_contrast, pastel, corporate, retro, monochrome.
--logviewer_urlstringhttps://logviewer-atl.amd.com Base URL for log viewer hyperlinks in reports.

Table Layout Options (Detail Timing & Clock QoR)

OptionDefaultDescription
--timing_stylerun_stage_scenario_group Dimension order for timing table. Four tokens from: run, stage, scenario, group.
--timing_mode2x2 Table pivot mode: NxM where N = column dimensions, M = row dimensions. E.g., 2x2 means first 2 tokens become column headers, last 2 become row labels.
--clock_stylescenario_clock_stage_run Dimension order for clock QoR table. Four tokens from: scenario, clock, stage, run.
--clock_mode2x2 Table pivot mode for clock QoR table.
Style/Mode interaction: With --timing_style run_stage_scenario_group --timing_mode 2x2, columns are run × stage and rows are scenario × group. With --timing_mode 1x3, columns would be run only, rows would be stage × scenario × group.

Path Group & Clock Name Display

Timing path groups and clock names can contain hierarchical instance paths with / separators (e.g., from Fusion Compiler instance-based grouping). To keep tables readable, only the last segment is displayed while the full path is preserved internally.

ContextBehaviorExample
Internal processing Full path preserved for filtering, sorting, comparison, hyperlinks U_acp_core/U_dbg_client_ssb__aon_steer/I_dbg_client_v2_bc_steer/dbg_steer_muxf0_..._SSB_balance_INT_CLK
HTML & Excel display Last segment after final / dbg_steer_muxf0_..._SSB_balance_INT_CLK
Simple names (no /) Displayed as-is ACLK, VDDCR_SOC_SMNCLK
# Real example from acp_t tile:

# Full internal path (used for data keys, filtering, link resolution):
U_acp_core/U_dbg_client_ssb__aon_steer/I_dbg_client_v2_bc_steer/dbg_steer_muxf0_I_dbg_v2_client_ssb__aon_mux_lane0_SSB_balance_INT_CLK
U_acp_core/U_dbg_client_ssb__aon_steer/I_dbg_client_v2_bc_steer/dbg_steer_muxf1_I_dbg_v2_client_ssb__aon_mux_lane1_SSB_balance_INT_CLK

# Displayed in HTML table cell and Excel:
dbg_steer_muxf0_I_dbg_v2_client_ssb__aon_mux_lane0_SSB_balance_INT_CLK
dbg_steer_muxf1_I_dbg_v2_client_ssb__aon_mux_lane1_SSB_balance_INT_CLK

# Simple groups (no hierarchy) — unchanged:
ACLK
VDDCR_SOC_SMNCLK
Scope: Applies to both group and clock dimensions across all table formats (split, merge, flat) and Excel sheets (Detail_Timing, Clock_QoR). Filtering options (--select_group, --clocks, --ignore_groups) still match against the full internal path, so you can filter by any hierarchy level.

Email Options

OptionTypeDefaultDescription
--fromstring $USER Email sender address.
--tostring $USER Email recipient(s). repeatable
--subjectstring— Email subject line. "Run->Status" is appended automatically.
--send_ownerbooleanoff Also send report to the PD_OWNER of each run.
--intervalfloat— Continuous monitoring interval in hours. Script loops: generate report → send email → sleep → repeat.
Outlook optimization: The email version uses inline bgcolor attributes (no CSS <style> blocks) for faster Outlook rendering. Combined with --flat_table, this eliminates colspan/rowspan entirely.

Mirror Options

OptionTypeDefaultDescription
--mirror_dirstring— Root directory for mirrored artifacts. When set, selected files from each run directory are synced to a structured mirror layout, and all hyperlinks in HTML/email reports are automatically rewritten to point to the mirror paths.
--mirror_slimbooleanoff Enable slim mirror mode. For rpts/ and logs/, only files that are referenced as hyperlinks in the generated HTML report are synced. All other entries (tune/, tile.params, target.controls, override.params, override.controls, comment, notice, clock_display) are always synced in full. Requires --mirror_dir.

Mirror Directory Layout

Each run is mirrored under mirror_dir/tile_name/nickname/, where the tile name comes from TILES_TO_RUN in tile.params and the nickname comes from qor_name or NICKNAME in tile.params.

mirror_dir/
├── tile_A/
│   ├── baseline/                ← nickname from tile.params/qor_name
│   │   ├── rpts/
│   │   │   ├── FxPixPlace/
│   │   │   ├── FxPixCts/
│   │   │   └── ...
│   │   ├── logs/
│   │   │   ├── FxPlace.log.gz
│   │   │   └── ...
│   │   ├── tile.params
│   │   ├── target.controls
│   │   ├── comment
│   │   └── notice
│   └── exp_v2/
│       ├── rpts/
│       ├── logs/
│       └── ...
├── tile_B/
│   └── run1/
│       ├── rpts/
│       └── logs/
└── _map.json                    ← original ↔ mirror path mapping

Mirrored Entries Per Run

The following files and directories are synced from each original run directory to its mirror:

EntryTypeContent
rpts/directoryQoR reports, timing reports, routing reports, PNGs
logs/directoryStep log files (FxPlace.log.gz, FxCts.log.gz, etc.)
tune/directoryTuning data
tile.paramsfileTile configuration (TILES_TO_RUN, NICKNAME, PD_OWNER)
target.controlsfileTarget control parameters
override.paramsfileParameter overrides
override.controlsfileControl overrides
commentfileRun comment text
noticefileRun notice text
clock_displayfileClock display configuration for summary

Path Map (_map.json)

A JSON file at the mirror root records the mapping between mirror subdirectories and original run directories:

{
  "tile_A/baseline": "/nfs/proj1/magnus/runs/run_v1",
  "tile_A/exp_v2": "/nfs/proj2/runs/experiment_v2",
  "tile_B/run1": "/scratch/user/tile_b_run1"
}

This file is updated on every run and is used internally for stale directory cleanup.

URL Rewriting

When --mirror_dir is active, all hyperlinks in the generated HTML report (log viewer links, report links, PNG links) are automatically rewritten to point to the mirror paths instead of the original run directories. This is a post-extraction pass — no changes to individual extract functions are needed.

# Without --mirror_dir:
#   link → https://logviewer-atl.amd.com/nfs/proj1/magnus/runs/run_v1/logs/FxPlace.log.gz

# With --mirror_dir /web/status:
#   link → https://logviewer-atl.amd.com/web/status/tile_A/baseline/logs/FxPlace.log.gz

Incremental Sync

Mirror sync is incremental and efficient. Two strategies are used depending on availability:

Fast path — rsync delegation (preferred): At startup, the script probes for the rsync binary via which rsync. If found, each managed directory sync is delegated to rsync -a --delete src/ dst/, which transfers only changed files and removes stale ones. This is O(changed files) and handles all corner cases natively.

Fallback — Perl mtime guard: If rsync is not available, the script uses a per-directory mtime comparison before descending. On Linux, a directory's mtime advances only when entries are added or removed (not when file contents change in-place). If the source directory mtime matches the mirror directory mtime, the entire subtree is skipped without stat-ing individual files. After a sync pass, the mirror directory mtime is stamped to match the source.

Slim Mirror Mode (--mirror_slim)

By default, the full contents of rpts/ and logs/ are synced to the mirror. In projects with many report files or large compressed logs, this can copy far more data than the HTML report actually links to. Slim mirror mode addresses this by syncing only the files that are referenced as hyperlinks in the report.

Which entries are affected

EntrySlim mode behavior
rpts/Only files whose paths appear as href links in the HTML report are synced
logs/Only files whose paths appear as href links in the HTML report are synced
tune/Always synced in full (same as full mode)
tile.params, target.controlsAlways synced
override.params, override.controlsAlways synced
comment, notice, clock_displayAlways synced

Two-pass execution flow

Because the set of referenced files can only be determined after the HTML is generated, slim mode uses a different execution order compared to full mode:

StepFull modeSlim mode
1Sync mirror (full rpts/ + logs/)Generate HTML using original run-dir paths
2Rewrite tile_info URLs to mirror pathsExtract all href paths from HTML
3Generate HTML using rewritten pathsSync only referenced files to mirror
4—Rewrite HTML URL strings to mirror paths

URL rewriting in slim mode is done as a string replacement pass over the final HTML: original run-directory path prefixes are replaced with their corresponding mirror paths (longest match first to avoid partial substitutions).

Enabling slim mode

Pass --mirror_slim on the CLI, or add mirror_slim = 1 to the config file:

# Example: slim mirror config
base_dir = /path/to/project/runs
mirror_dir = /web/status/myproject
mirror_slim = 1
monitor_item = summary, timing
metrics = time, timing
Note: --mirror_slim has no effect unless --mirror_dir is also set. Files that are in the run directories but not linked in the HTML (e.g., intermediate debug reports, unused log steps) are not copied to the mirror in slim mode.

Stale Directory Cleanup

When a run is removed from monitoring (e.g., run directory deleted or no longer matched by filters), its mirror directory is automatically cleaned up:

  1. Previous _map.json is read to identify previously mirrored runs
  2. Any mirror subdirectory not in the current active set is removed
  3. Empty tile-level directories are cleaned up
Lifecycle example:
Run 1: 3 runs monitored → mirror creates tileA/baseline/, tileA/exp_v2/, tileB/run1/
Run 2: exp_v2 removed from monitoring → mirror deletes tileA/exp_v2/, updates remaining dirs (only changed files), writes new _map.json
Run 3: New run exp_v3 added → mirror creates tileA/exp_v3/, everything else unchanged

Nickname Collision Handling

If two runs for the same tile have identical nicknames (e.g., both called "baseline"), a numeric suffix is appended automatically: baseline, baseline_2, baseline_3, etc. Nicknames are also sanitized for filesystem safety (only a-z A-Z 0-9 . _ - allowed; other characters are replaced with _).

Mirror Usage Examples

# Mirror to a web-accessible directory
ucs_monitor_run_status.pl \
    --base_dir /nfs/proj/runs \
    --mirror_dir /web/status/myproject \
    --monitor_item summary timing \
    --metrics time timing

# Mirror with continuous monitoring (re-syncs every 8 hours)
ucs_monitor_run_status.pl \
    --config_file project.conf \
    --mirror_dir /web/status/daily \
    --interval 8

# Mirror specific runs from different locations
ucs_monitor_run_status.pl \
    --run /nfs/proj1/run_v1 --run /nfs/proj2/run_v2 \
    --mirror_dir /web/mirror \
    --monitor_item summary timing

Debug & Diagnostics

OptionTypeDefaultDescription
--debuginteger (0-4)0 (off) Debug verbosity level, gated by license authorization:
1 = Flow-level (stage entry/exit, I/O summary)
2 = Decision-level (branch decisions, filtering rationale)
3 = Data-level (intermediate data dumps, fuller traces)
4 = Deep-diagnosis (raw state snapshots, Dumper output)
--help / -hflag— Show help and exit.

Log file: Automatically created as ucs_monitor_run_status_<YYYYMMDD_HHMMSS>.log in the current directory. Contains timestamped entries with level, script name, stage, PID, user, and run ID.

ECO Flow Support

The script automatically detects the flow type from the PERSONALITY field in each run's tile.params and selects the appropriate stages.

PERSONALITYFlowSummary StepsDetail Timing Stages
placenroute (default) PnR FxSynthesize, FxPostFloorPlan, FxPlace, FxCts, FxOptCts, FxRoute, FxOptRoute, FxReRoute PtPreTiming, FxSynthesize, FxPlace, FxCts, FxPreOptCts, FxOptCts, FxRoute, PtRoute, FxOptRoute, FxReRoute, PtReRoute
eco ECO FxApplyEco, FxEcoRoute PtEcoRoute
fcpnr or any other PnR Treated as placenroute

ECO Summary Metrics

Steprun_timetimingroutingutilizationclock_qor
FxApplyEcoshownignoredignoredignoredignored
FxEcoRouteshownignoredshownignoredignored

Mixed PnR + ECO Reports

When monitoring both PnR and ECO runs together, the summary table shows columns for both flow types. PnR runs display ---- under ECO columns and vice versa. The detail timing table only shows stages applicable to each run's personality.

# Mixed PnR + ECO monitoring
ucs_monitor_run_status.pl \
    --run /proj/tiles/rel_NLD/tile_a/latest \
    --run /proj/tiles/rel_ECO/tile_b/latest \
    --metrics time routing --monitor_item summary timing

Scenario Name Simplification

Scenario names from Fusion Compiler and PrimeTime reports are automatically simplified for display. The full name is used internally for filtering and data processing.

Source FormatExample InputSimplified Display
Fusion setup setup_tt0p9v100c_typrc100c_FuncTT0p9v setup_FuncTT0p9v
Fusion hold hold_ffgnp1p05vm40c_rcworst_rcworstCCworst100c_FuncFFG1p05v hold_rcworstCCworst100c_FuncFFG1p05v
Fusion SI hold_..._FuncFFG1p05v_si hold_rcworstCCworst100c_FuncFFG1p05v_si
PT setup (nosi) FuncTT0p9vReRouteTyprc100cTT0P9V100CStp setup_FuncTT0p9v
PT setup (si) FuncTT0p9vReRouteSxTyprc100cTT0P9V100CStp setup_FuncTT0p9v_si
PT hold (nosi) FuncFFG1p05vReRouteRcworstCCworst100cFFGNP1P05VM40CHld hold_rcworstCCworst100c_FuncFFG1p05v
PT hold (si) FuncFFG1p05vReRouteSxRcworstCCworst100cFFGNP1P05VM40CHld hold_rcworstCCworst100c_FuncFFG1p05v_si
ECO PT FuncFFG1p05vEcoRouteTyprc100cFFGNP1P05VM40CStp setup_FuncFFG1p05v
SI / NOSI differentiation: PT directories containing Sx between the stage name and RC corner indicate SI analysis. Fusion scenarios ending with _si are the same. Both produce a _si suffix in the simplified name, so SI and NOSI results appear as separate entries in the tables.
No hardcoded mapping: Scenario simplification is pattern-based, not a lookup table. Any new scenario following the standard naming convention is handled automatically.

Config File Format (.conf)

Config files use key = value format. Lines starting with # are comments.

Array fields (comma or space separated): run, tiles, skip_tiles, owner, stage, ignore_groups, select_group, scenario, no_scenario, clocks, metrics, monitor_item, to

Scalar fields: all others (base_dir, check, subject, flat_table, etc.)

# Example: PnR monitoring config
base_dir = /path/to/project/runs
tiles = tile_a, tile_b
metrics = time, timing, routing
monitor_item = summary, timing, notice
check = setup
scenario = FuncTT, FuncFF
to = johndoe teamlead
subject = [MyProject] Daily Status
flat_table = 1
excel = 1
compare = 1

# Mirror options (optional)
mirror_dir = /web/status/myproject
mirror_slim = 1    # sync only HTML-referenced files from rpts/ and logs/
# Example: Multiple explicit runs (space-separated)
run = /proj/tiles/rel_NLD/tile_a/latest /proj/tiles/rel_NLD/tile_b/latest
metrics = time, timing, routing
monitor_item = summary, timing
flat_table = 1
# Example: ECO monitoring
run = /proj/tiles/rel_ECO/tile_a/latest /proj/tiles/rel_ECO/tile_b/latest
metrics = time, routing
monitor_item = summary, timing
subject = [ECO] Daily Status
Config directory mode: With --config_dir /path/configs/, every .conf file in the directory is processed as a separate monitoring job. Create a .conf.done file next to a config to skip it.

Usage Examples

Basic Summary

ucs_monitor_run_status.pl --monitor_item summary

Scans current directory for runs, shows run time per step.

Full Report with Email

ucs_monitor_run_status.pl \
    --base_dir /proj/magnus/runs \
    --metrics time timing routing utilization \
    --monitor_item summary timing notice \
    --to pd_team \
    --subject "[Magnus] Daily Status"

Outlook-Optimized with Excel

ucs_monitor_run_status.pl \
    --base_dir /proj/runs \
    --metrics time timing clock_qor \
    --monitor_item summary timing clock_qor \
    --flat_table --excel \
    --to userid

Continuous Monitoring (every 8 hours)

ucs_monitor_run_status.pl \
    --config_file /proj/configs/daily_check.conf \
    --interval 8

Filtered Timing: Setup Only, Specific Scenarios

ucs_monitor_run_status.pl \
    --base_dir /proj/runs \
    --monitor_item timing \
    --check setup \
    --scenario FuncTT FuncFF \
    --slack_less_than -0.01 \
    --compare

Multi-Config Directory

ucs_monitor_run_status.pl \
    --config_dir /proj/status_configs/ \
    --flat_table --excel --debug 1

Specific Runs with Merge Table

ucs_monitor_run_status.pl \
    --run /proj/run_v1 --run /proj/run_v2 --run /proj/run_v3 \
    --metrics time timing \
    --monitor_item summary timing \
    --merge_table --compare \
    --use_link

ECO Run Monitoring

ucs_monitor_run_status.pl \
    --run /proj/tiles/rel_PRE_BTO_SOC/usbadp0_s0_t/latest \
    --run /proj/tiles/rel_PRE_BTO_SOC/acp_t/latest \
    --metrics time routing --monitor_item summary timing \
    --flat_table --excel

Auto-detects PERSONALITY=eco from tile.params. Summary shows FxApplyEco (time) and FxEcoRoute (time+routing). Detail timing shows PtEcoRoute only.

Mixed PnR + ECO Comparison

ucs_monitor_run_status.pl \
    --run /proj/tiles/rel_NLD/df_tcdxg_t/latest \
    --run /proj/tiles/rel_ECO/usbadp0_s0_t/latest \
    --metrics time timing routing \
    --monitor_item summary timing \
    --merge_table --flat_table --compare

Both PnR and ECO columns appear in the merged summary. Each run shows data only under its applicable stages.

Mirror Mode (Full Sync)

ucs_monitor_run_status.pl \
    --base_dir /proj/runs \
    --mirror_dir /web/mirror/proj \
    --monitor_item summary timing \
    --metrics time timing

Slim Mirror Mode (Referenced Files Only)

# Sync only the rpts/ and logs/ files actually linked in the HTML report.
# All other entries (tune/, tile.params, comment, notice, etc.) sync in full.
ucs_monitor_run_status.pl \
    --base_dir /proj/runs \
    --mirror_dir /web/mirror/proj \
    --mirror_slim \
    --monitor_item summary timing \
    --metrics time timing

# Equivalent config file usage:
#   mirror_dir  = /web/mirror/proj
#   mirror_slim = 1
#   monitor_item = summary, timing
#   metrics = time, timing

Slim mode is especially useful for projects with large rpts/ trees where only a fraction of reports are linked in the status HTML (e.g., only the final routing and timing summary reports).

Workflow Diagram

  CLI / Config File
        |
        v
  +------------------+
  | Parse Arguments  |
  +------------------+
        |
        v
  +------------------+
  | License Check    |
  +------------------+
        |
        v
  +------------------+       +-------------------+
  | Load Configs     |------>| Config Dir Scan   |
  | (CLI / files)    |       | (.conf files)     |
  +------------------+       +-------------------+
        |
        v  (per config)
  +------------------+
  | Find Run Dirs    |  <-- base_dir / run_list / --run
  +------------------+
        |
        v
  +------------------+
  | Extract Tile     |  <-- summary metrics, timing, clock_qor, notices
  | Information      |
  +------------------+
        |
        +-- if --mirror_dir ----------------------------------------+
        |                                                            |
        |   Full mode (default)          Slim mode (--mirror_slim)  |
        |   +------------------+         +------------------+       |
        |   | Mirror Sync      |         | Generate HTML    |       |
        |   | (full rpts/logs) |         | (original paths) |       |
        |   +------------------+         +------------------+       |
        |          |                              |                  |
        |   +------------------+         +------------------+       |
        |   | Rewrite URLs     |         | Extract href     |       |
        |   | in tile_info     |         | referenced files |       |
        |   +------------------+         +------------------+       |
        |          |                              |                  |
        |          |                     +------------------+       |
        |          |                     | Mirror Sync      |       |
        |          |                     | (refs only +     |       |
        |          |                     |  always entries) |       |
        |          |                     +------------------+       |
        |          |                              |                  |
        |          v                     +------------------+       |
        |   +------------------+         | Rewrite HTML     |       |
        |   | Generate HTML    |         | URL strings      |       |
        |   +------------------+         +------------------+       |
        |          |                              |                  |
        +----------+--------------+---------------+------------------+
                                  |
                                  v
                   Stale mirror cleanup (both modes)
                                  |
                                  v
  +------------------+     +------------------+     +------------------+
  | HTML Report      |     | Excel Report     |     | QoR via fc_shell |
  | (web + email)    |     | (.xlsx)          |     | (if --qor)       |
  +------------------+     +------------------+     +------------------+
        |
        v
  +------------------+
  | Send Email       |  <-- if --to is set
  +------------------+
        |
        v
  +------------------+
  | Sleep / Repeat   |  <-- if --interval
  +------------------+

Output Files

FileLocationGenerated When
run_time_report_<timestamp>.html $base_dir/status/run_time/ Always (web version with full CSS)
ucs_monitor_run_status_<timestamp>.xlsx $base_dir/status/run_time/ When --excel is set
ucs_monitor_run_status_<timestamp>.log Current working directory Always
$base_dir/status/<timestamp>/total_extract.tcl $base_dir/status/ When --qor is set
_map.json $mirror_dir/ When --mirror_dir is set — maps mirror paths to original run directories