Skip to content
VLSI Mentor

awk Part III · Module 11 · Synthesis and Coverage Report Analysis

Area Reports

A synthesis area report is the easiest thing in this module to parse and one of the easiest to get wrong, because it contains two lines that both look like the total. One is the silicon the cells occupy and the other adds an estimate of the wiring, and the pattern most people write matches both and keeps the second. This chapter extracts the numbers that matter, checks the report's own arithmetic against itself, compares two runs, and ends on two traps in the comparison: a zero baseline that kills the program outright, and two deltas that print identically while awk says they differ.

Advanced18 min readawkPart IIISynthesisAreaFloating Point

Part III · Module 11 · Chapter 11.1 · Area Reports

1. Why This Matters

Area is the number a synthesis run is judged on. It goes into the commit message, the weekly report and the decision about whether a block fits — so it is worth being exact about which number it is.

Module 10's reports spread one record across many lines and the difficulty was joining them. An area report is the opposite: every number is on its own line with its own label, and nothing needs carrying. The difficulty moves to the labels, which overlap, and to the arithmetic, which has two traps that produce a confident wrong answer rather than an error.

2. The Report

Azvya Education Pvt. Ltd.VLSI Mentor
area.rpt — synthetic teaching data. No synthesis tool runs in this environment, so this is a constructed report in the standard shape; Chapters 11.2 and 11.3 reuse it.
****************************************
Report : area
Design : alu_core
****************************************

Library(s) Used:

    sky130_fd_sc_hd__tt_025C_1v80 (File: /pdk/sky130_tt.db)

Number of ports:                         1842
Number of nets:                          4127
Number of cells:                         3094
Number of combinational cells:           2461
Number of sequential cells:               612
Number of macros/black boxes:               0
Number of buf/inv:                        418
Number of references:                      37

Combinational area:              18422.374000
Buf/Inv area:                     2104.882000
Noncombinational area:            9371.126000
Macro/Black Box area:                0.000000
Net Interconnect area:            4218.550000

Total cell area:                 27793.500000
Total area:                      32012.050000

Every value is $NF of a labelled line, so the whole chapter is about choosing the label.

3. Two Lines Look Like the Total

Count what each candidate pattern matches:

Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
for pat in '/area:/' '/Total/' '/Total.*area/' '/Total area:/' '/^Total cell area:/'; do
  printf "  %-22s " "$pat"
  awk "$pat { n++; last = \$NF } END { printf \"%d line(s), last value %s\n\", n+0, last }" area.rpt
done
Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
  /area:/                7 line(s), last value 32012.050000
  /Total/                2 line(s), last value 32012.050000
  /Total.*area/          2 line(s), last value 32012.050000
  /Total area:/          1 line(s), last value 32012.050000
  /^Total cell area:/    1 line(s), last value 27793.500000

/Total.*area/ matches two lines. A rule that assigns on every match keeps the last one:

Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
awk '/Total.*area/ { t = $NF } END { printf "naive  /Total.*area/  -> %s\n", t }' area.rpt
awk '/^Total cell area:/ { t = $NF } END { printf "anchored              -> %s\n", t }' area.rpt
Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
naive  /Total.*area/  -> 32012.050000
anchored              -> 27793.500000

32012.050 against 27793.500 — 15.2% high. No error, no second row, nothing in the output to suggest the wrong label was read.

4. What the Two Totals Differ By

The report answers this itself:

Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
awk '/^Total cell area:/ { c = $NF } /^Total area:/ { a = $NF } /^Net Interconnect area:/ { i = $NF } END { printf "Total area - Total cell area = %.3f, Net Interconnect area = %.3f\n", a - c, i }' area.rpt
Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
Total area - Total cell area = 4218.550, Net Interconnect area = 4218.550

Exactly equal. Total area is Total cell area plus the estimated wiring, and which one you want depends on the question:

  • Total cell area is the silicon the cells occupy. It is the number to track across runs, because it is what synthesis actually controls.
  • Total area adds a pre-route estimate of interconnect. It is closer to what the block will finally need, and it is an estimate that place-and-route will replace.

Tracking the wrong one mixes a measurement with a prediction, and the prediction moves for reasons the RTL change did not cause.

5. Buf/Inv Area Is Already Inside Combinational Area

The component areas and whether they reconcile:

Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
awk '/^Combinational area:/ { c = $NF } /^Noncombinational area:/ { n = $NF } /^Buf\/Inv area:/ { b = $NF } /^Total cell area:/ { t = $NF } END { printf "comb %.3f + noncomb %.3f            = %.3f  (total cell area %.3f, diff %.3f)\n", c, n, c+n, t, c+n-t; printf "comb %.3f + noncomb %.3f + buf %.3f = %.3f  (total cell area %.3f, diff %.3f)\n", c, n, b, c+n+b, t, c+n+b-t }' area.rpt
Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
comb 18422.374 + noncomb 9371.126            = 27793.500  (total cell area 27793.500, diff 0.000)
comb 18422.374 + noncomb 9371.126 + buf 2104.882 = 29898.382  (total cell area 27793.500, diff 2104.882)

Combinational plus noncombinational is the total, to the last digit. Adding buffers overshoots by exactly the buffer area.

That is not a quirk of the fixture — it is why the line exists. Buffers and inverters are combinational cells, so their area is already counted in Combinational area; the report breaks it out separately because it is a diagnostic, not a category. A rising buf/inv number means the tool is spending area on drive strength and delay rather than on logic.

The general rule for any report like this: before summing labelled components, check them against the total the report already gives you. A diff 0.000 means your categories are a partition; anything else means they overlap or something is missing, and the overlap is usually a diagnostic line like this one.

The cell counts do not reconcile the same way:

Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
awk '/^Number of cells:/ { t = $NF } /^Number of combinational cells:/ { c = $NF } /^Number of sequential cells:/ { s = $NF } /^Number of macros/ { m = $NF } END { printf "comb %d + seq %d + macro %d = %d   vs Number of cells %d   (difference %d)\n", c, s, m, c+s+m, t, t-(c+s+m) }' area.rpt
Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
comb 2461 + seq 612 + macro 0 = 3073   vs Number of cells 3094   (difference 21)

Twenty-one cells unaccounted for. That is Chapter 11.2's subject and the reason it exists.

6. Comparing Two Runs

A second run of the same design, after a buffer-insertion pass. The second report is produced from the first so that every line except the ones that really moved is byte-identical:

Azvya Education Pvt. Ltd.VLSI Mentor
mknew.sh — synthetic teaching script. Produces the second run's report.
#!/bin/sh
# mknew.sh — produce the second run's report from the first.
#
# A second synthesis run of the same RTL after a buffer-insertion pass: more
# combinational cells, more buf/inv, and the area that follows from them. Every
# other line is left byte-identical, so `diff` shows exactly what moved and
# nothing else.
#
# Each substitution is anchored to its own line and keeps the field width, so
# the report's column alignment survives.

sed -e 's/^\(Number of cells: *\)3094$/\13302/' \
    -e 's/^\(Number of combinational cells: *\)2461$/\12669/' \
    -e 's/^\(Number of buf\/inv: *\)418$/\1534/' \
    -e 's/^\(Combinational area: *\)18422\.374000$/\119104.812000/' \
    -e 's/^\(Buf\/Inv area: *\)2104\.882000$/\12588.440000/' \
    -e 's/^\(Total cell area: *\)27793\.500000$/\128475.938000/' \
    -e 's/^\(Total area: *\)32012\.050000$/\132694.488000/' \
    area.rpt > area_new.rpt
Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
sh mknew.sh
diff area.rpt area_new.rpt
Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
12,13c12,13
< Number of cells:                         3094
< Number of combinational cells:           2461
---
> Number of cells:                         3302
> Number of combinational cells:           2669
16c16
< Number of buf/inv:                        418
---
> Number of buf/inv:                        534
19,20c19,20
< Combinational area:              18422.374000
< Buf/Inv area:                     2104.882000
---
> Combinational area:              19104.812000
> Buf/Inv area:                     2588.440000
25,26c25,26
< Total cell area:                 27793.500000
< Total area:                      32012.050000
---
> Total cell area:                 28475.938000
> Total area:                      32694.488000

The delta table, with FNR == NR reading the first file into an array — Chapter 7.4's two-file pattern:

Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
awk 'FNR == NR { if (/^(Combinational|Noncombinational|Buf\/Inv|Total cell) area:/) { k = $0; sub(/ *[0-9.]+$/, "", k); sub(/:$/, "", k); old[k] = $NF } ; next }
     /^(Combinational|Noncombinational|Buf\/Inv|Total cell) area:/ {
       k = $0; sub(/ *[0-9.]+$/, "", k); sub(/:$/, "", k)
       d = $NF - old[k]
       printf "%-24s %12.3f -> %12.3f  %+10.3f  %+7.2f%%\n", k, old[k], $NF, d, (old[k] ? 100 * d / old[k] : 0)
     }' area.rpt area_new.rpt
Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
Combinational area          18422.374 ->    19104.812    +682.438    +3.70%
Buf/Inv area                 2104.882 ->     2588.440    +483.558   +22.97%
Noncombinational area        9371.126 ->     9371.126      +0.000    +0.00%
Total cell area             27793.500 ->    28475.938    +682.438    +2.46%

The label is recovered by stripping the number off the end of the line — sub(/ *[0-9.]+$/, "", k) — which is more robust than a field count because the labels have different word counts.

7. Reading the Delta

Four rows, and together they say one thing:

Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
awk 'FNR==NR { if (/^Combinational area:/) oc=$NF; if (/^Noncombinational area:/) on=$NF; if (/^Buf\/Inv area:/) ob=$NF; if (/^Total cell area:/) ot=$NF; next }
     /^Combinational area:/ { c=$NF } /^Noncombinational area:/ { n=$NF } /^Buf\/Inv area:/ { b=$NF } /^Total cell area:/ { t=$NF }
     END { printf "total %+.3f, comb %+.3f, noncomb %+.3f\n", t-ot, c-oc, n-on
       printf "of the combinational increase, buf/inv is %+.3f = %.1f%%\n", b-ob, 100*(b-ob)/(c-oc) }' area.rpt area_new.rpt
Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
total +682.438, comb +682.438, noncomb +0.000
of the combinational increase, buf/inv is +483.558 = 70.9%

Total cell area is up 2.46%. Sequential area has not moved at all, so no registers were added or removed — the RTL's state is unchanged. The entire increase is combinational, and 71% of it is buffers and inverters.

That is the signature of a buffer-insertion pass rather than a logic change, and it is what Chapter 10.4's hold violations are fixed with: a hold failure means data arrives too early, and the remedy is to slow the path down with delay buffers. A +22.97% buf/inv row next to an unchanged sequential row is the area cost of hold closure showing up in the synthesis report.

A 2.46% total with no breakdown would not have supported any of that. The breakdown is the finding; the total is the headline.

8. Two Traps in the Arithmetic

Division by zero is fatal

Macro/Black Box area is 0.000000 in this report, because the design has no macros. A percent change against it:

Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
awk 'BEGIN { print "before"; x = 1 / 0; print "after" }' 2>&1 | head -3
Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
before
awk: division by zero
 source line number 1

after never printed. This is not a warning and not a NaN — awk stops:

Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
awk 'BEGIN { print 100 * (0 - 0) / 0 }' >/dev/null 2>/tmp/dz.txt; echo "exit status: $?"; cat /tmp/dz.txt
Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
exit status: 2
awk: division by zero
 source line number 1

Exit status 2, even for 0 / 0 where the numerator is also zero. So a single macro-free baseline row does not produce one bad cell in the table — it loses every row after it, which is why section 6's command carries (old[k] ? ... : 0).

A guard that reads the same whether the baseline is an integer zero or a formatted one:

Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
awk 'BEGIN { split("0 0.000000 9371.126", v, " "); for (i = 1; i <= 3; i++) { o = v[i] + 0; n = o + 10; printf "old=%-12s -> %s\n", v[i], (o == 0 ? "n/a (zero baseline)" : sprintf("%+.2f%%", 100 * (n - o) / o)) } }'
Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
old=0            -> n/a (zero baseline)
old=0.000000     -> n/a (zero baseline)
old=9371.126     -> +0.11%

+ 0 first, then compare against 0 — because "0.000000" == 0 is a string comparison against a constant, which Chapter 10.5 section 6 showed is the one construct to avoid.

Two equal deltas are not equal

Section 7 printed total +682.438 and comb +682.438. Those are the same number to the report's own precision, so a check that the total increase is entirely combinational looks like ==:

Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
awk 'BEGIN { a = 28475.938 - 27793.500; b = 19104.812 - 18422.374
  printf "total  diff = %.20f\n", a
  printf "comb   diff = %.20f\n", b
  printf "a == b      -> %s\n", (a == b ? "TRUE" : "FALSE")
  printf "a - b       = %.20f\n", a - b
  printf "both print as %%.3f -> %.3f and %.3f\n", a, b
  printf "within 1e-6 -> %s\n", ((a - b < 1e-6 && b - a < 1e-6) ? "TRUE" : "false") }'
Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
total  diff = 682.43799999999828287400
comb   diff = 682.43800000000192085281
a == b      -> FALSE
a - b       = -0.00000000000363797881
both print as %.3f -> 682.438 and 682.438
within 1e-6 -> TRUE

== is FALSE on two values that print identically. They differ by 3.6 × 10⁻¹², which is the accumulated error of subtracting two six-significant-figure decimals that binary floating point cannot represent exactly.

9. Common Mistakes

/Total.*area/ for the total. It matches two lines and keeps Total area — section 3.

Tracking Total area across runs. It includes a pre-route interconnect estimate; Total cell area is what synthesis controls — section 4.

Adding Buf/Inv area to the components. It is already inside Combinational area — section 5.

Summing labelled components without checking them against the total. A non-zero residual is the whole signal.

Assuming the cell categories sum to Number of cells. They do not — 21 short here, and Chapter 11.2 explains why.

An unguarded percent change. A zero baseline is fatal and exits 2, losing every later row — section 8.

"0.000000" == 0. A string comparison against a constant; apply + 0 first.

== on computed areas. Two deltas that print identically differ at the twelfth decimal — use a tolerance.

Quoting a reported area as exact. It is a pre-layout number from one library at one corner; the comparison across runs is what means something.

10. Exercises

Exercise 1 — The headline number

Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
awk '/^Total cell area:/ { print $NF }' area.rpt
awk '/^Total cell area:/ { printf "%.3f\n", $NF }' area.rpt
Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
27793.500000
27793.500

Exercise 2 — Every labelled area, with its label

Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
awk '/ area:/ { k = $0; sub(/ *[0-9.]+$/, "", k); sub(/:$/, "", k); printf "%-24s %12.3f\n", k, $NF }' area.rpt
Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
Combinational area          18422.374
Buf/Inv area                 2104.882
Noncombinational area        9371.126
Macro/Black Box area            0.000
Net Interconnect area        4218.550
Total cell area             27793.500
Total area                  32012.050

Seven rows — which is the count section 3's /area:/ reported, and the reason a pattern that loose needs the label printed beside the number.

Exercise 3 — Debug a total that is 15% too high

A script reports 32012.050 where the synthesis log says the design is 27793.500.

Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
awk '/Total.*area/ { t = $NF; n++ } END { printf "%d match(es), kept %s\n", n, t }' area.rpt
awk '/Total.*area/ { printf "  matched: %s\n", $0 }' area.rpt
Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
2 match(es), kept 32012.050000
  matched: Total cell area:                 27793.500000
  matched: Total area:                      32012.050000

Two matches, and the assignment kept the second.

Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
awk '/^Total cell area:/ { t = $NF; n++ } END { printf "%d match(es), kept %s\n", n, t }' area.rpt
Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
1 match(es), kept 27793.500000

Exercise 4 — Debug a reconciliation that fails on good data

A check asserts that the total area increase equals the combinational increase. It reports a mismatch.

Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
awk 'BEGIN { a = 28475.938 - 27793.500; b = 19104.812 - 18422.374; printf "equal? %s   (printed: %.3f vs %.3f, difference %.3f)\n", (a == b ? "yes" : "NO"), a, b, a - b }'
Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
equal? NO   (printed: 682.438 vs 682.438, difference -0.000)

Both values print 682.438 and == still says no. The difference prints as -0.000 — the same shape as the rounded slack in Chapter 10.3 section 5, and for the same reason: a quantity too small to show at this precision, with its sign surviving the rounding. Here that minus sign is the only thing in the output hinting that the two values are not identical.

Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
awk 'BEGIN { a = 28475.938 - 27793.500; b = 19104.812 - 18422.374; TOL = 1e-6; printf "within %g? %s   (actual difference %.20f)\n", TOL, ((a - b < TOL && b - a < TOL) ? "yes" : "NO"), a - b }'
Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
within 1e-06? yes   (actual difference -0.00000000000363797881)

The data reconciles; the comparison was wrong.

Exercise 5 — Engineering application

The run-over-run area summary, with the reconciliation done to a tolerance and the zero baseline guarded.

Azvya Education Pvt. Ltd.VLSI Mentor
areadiff.awk — synthetic teaching script.
# areadiff.awk — compare two synthesis area reports.
#
# Usage:  awk -f areadiff.awk area.rpt area_new.rpt
# Exit:   0 reconciled   1 total area grew   2 the breakdown does not reconcile

BEGIN { TOL = 1e-6; split("Combinational Noncombinational Total cell", want, " ") }

function label(line,   k) { k = line; sub(/ *[0-9.]+$/, "", k); sub(/:$/, "", k); return k }

FNR == NR {
    if (/ area:/) old[label($0)] = $NF
    if (/^Number of cells:/) oldcells = $NF
    next
}

/ area:/ { new[label($0)] = $NF; if (!(label($0) in seen)) { seen[label($0)] = 1; order[++n] = label($0) } }
/^Number of cells:/ { newcells = $NF }

END {
    printf "%-24s %12s %12s %10s %8s\n", "quantity", "old", "new", "delta", "change"
    for (i = 1; i <= n; i++) {
        k = order[i]; o = old[k] + 0; v = new[k] + 0
        printf "%-24s %12.3f %12.3f %+10.3f %8s\n", k, o, v, v - o,
               (o == 0 ? "n/a" : sprintf("%+.2f%%", 100 * (v - o) / o))
    }
    printf "%-24s %12d %12d %+10d %8s\n", "Number of cells", oldcells, newcells, newcells - oldcells,
           (oldcells == 0 ? "n/a" : sprintf("%+.2f%%", 100 * (newcells - oldcells) / oldcells))

    # the breakdown must reconcile against the total the report already gives
    dc = new["Combinational area"] - old["Combinational area"]
    dn = new["Noncombinational area"] - old["Noncombinational area"]
    dt = new["Total cell area"] - old["Total cell area"]
    r = dt - (dc + dn)
    printf "# reconciliation: total %+.3f vs comb %+.3f + noncomb %+.3f, residual %.3g -> %s\n",
           dt, dc, dn, r, ((r < TOL && -r < TOL) ? "OK" : "DOES NOT RECONCILE")
    if (!(r < TOL && -r < TOL)) exit 2
    if (dt > TOL) exit 1
}
Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
awk -f areadiff.awk area.rpt area_new.rpt
echo "status: $?"
Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
quantity                          old          new      delta   change
Combinational area          18422.374    19104.812   +682.438   +3.70%
Buf/Inv area                 2104.882     2588.440   +483.558  +22.97%
Noncombinational area        9371.126     9371.126     +0.000   +0.00%
Macro/Black Box area            0.000        0.000     +0.000      n/a
Net Interconnect area        4218.550     4218.550     +0.000   +0.00%
Total cell area             27793.500    28475.938   +682.438   +2.46%
Total area                  32012.050    32694.488   +682.438   +2.13%
Number of cells                  3094         3302       +208   +6.72%
# reconciliation: total +682.438 vs comb +682.438 + noncomb +0.000, residual -3.64e-12 -> OK
status: 1

The residual is printed rather than hidden — -3.64e-12, the floating-point noise from section 8 — and judged against the tolerance instead of against zero. Macro/Black Box area shows n/a rather than killing the run.

Status 1 means the area grew, which is a fact for a human to weigh, not an error. Status 2 would mean the breakdown does not add up, which is a reason to distrust the whole table — the same polarity as paths.awk in Chapter 10.2 and checks.awk in Chapter 10.4.

Comparing a report against itself is the degenerate case worth having:

Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
awk -f areadiff.awk area.rpt area.rpt | tail -2
echo "status: $?"
Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
Number of cells                  3094         3094         +0   +0.00%
# reconciliation: total +0.000 vs comb +0.000 + noncomb +0.000, residual 0 -> OK
status: 0

Zero deltas, a residual of exactly 0, and status 0. A comparison tool that cannot return "nothing changed" on identical inputs is not trustworthy on different ones — the same argument as Chapter 8.7's point that a test suite must be shown capable of passing as well as failing.

Exercise 6 — Challenge: show that the label collision survives a sanity check

A reviewer proposes validating the extractor by checking that the number it returns appears in the report and is the largest area in it. Show that both checks pass on the wrong value.

Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
awk '/Total.*area/ { t = $NF } END { print t }' area.rpt
grep -c "32012.050000" area.rpt
awk '/ area:/ { if ($NF + 0 > m) m = $NF } END { printf "largest area in the report: %.3f\n", m }' area.rpt
Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
32012.050000
1
largest area in the report: 32012.050

The value is in the report, exactly once, and it is the largest area there. Both checks pass, and it is the wrong quantity.

That is not a coincidence that could be designed out. Total area is Total cell area plus interconnect, so it is necessarily the largest number in the report — which makes "the biggest area" an attractive and permanently wrong heuristic for "the total area".

The check that works compares the match count against the expectation:

Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
awk '/^Total cell area:/ { n++ } END { printf "exactly one anchored match? %s (%d)\n", (n == 1 ? "yes" : "NO"), n+0 }' area.rpt
awk '/Total.*area/ { n++ } END { printf "exactly one loose match?    %s (%d)\n", (n == 1 ? "yes" : "NO"), n+0 }' area.rpt
Azvya Education Pvt. Ltd.VLSI Mentor
Snippet
exactly one anchored match? yes (1)
exactly one loose match?    NO (2)

One number, measured on the input, separates the two patterns — and nothing measured on the output could, because the output is a single plausible number either way. This is the same conclusion Module 10 reached from five directions and Chapter 10.7 stated outright: validate an extractor against the structure of its input, never against the shape of its output.

11. Summary

  • /Total.*area/ matches two lines and keeps Total area — 15.2% high, silently. Anchor with ^.
  • Total area − Total cell area = Net Interconnect area exactly. The first adds a pre-route estimate; track the second.
  • Buf/Inv area is inside Combinational area. Adding it overshoots by exactly the buffer area.
  • Check components against the total the report already prints. A non-zero residual means overlap or omission.
  • The cell categories do not sum to Number of cells — 21 short, which is Chapter 11.2.
  • Division by zero is fatal and exits 2, even 0 / 0, and it loses every row after it. Guard with + 0 then == 0.
  • == on two computed areas is FALSE though both print identically — they differ at the twelfth decimal. Use a tolerance; integer counts are exempt.
  • Print the residual, not a verdict, so floating-point noise is visible as noise.
  • The breakdown is the finding. +2.46% total with sequential unchanged and buf/inv +22.97% is a buffer-insertion pass, not a logic change — the area cost of hold closure from Chapter 10.4.
  • A label collision passes every check made on the output, including "it is the largest area in the report", which Total area necessarily is.

Chapter 11.2 — Cell Counts takes the twenty-one cells this chapter could not account for, and the distinction that explains them: a leaf cell and a hierarchical instance are both counted as cells, and only one of them has an area of its own.

Where this fits

Part of the awk curriculum.