The course library is a small fictional library called course, kept in course.lib. It holds fifteen cells with fixed EXAMPLE areas in library units.
A second library, nand_only.lib, holds only INV, BUF, and NAND2. Comparing mappings across the two shows what cell choice costs.
Cell | Function | Area |
|---|---|---|
INV |
| 1 |
BUF |
| 2 |
NAND2 |
| 2 |
NOR2 |
| 2 |
AND2 |
| 3 |
OR2 |
| 3 |
NAND3 |
| 3 |
NOR3 |
| 3 |
XOR2 |
| 5 |
XNOR2 |
| 5 |
AOI21 |
| 3 |
OAI21 |
| 3 |
MUX2 |
| 5 |
DFF | Rising-edge flop | 8 |
DFFR | Rising-edge flop with reset | 10 |
The text block below is an ABRIDGED excerpt from course.lib, with tables shortened to their shape and corner values. It is not the full file.
ABRIDGED excerpt from course.lib (fictional teaching library, tables shortened)
library(course) {
delay_model : table_lookup;
time_unit : "1ns";
lu_table_template(dt) {
variable_1 : input_net_transition;
variable_2 : total_output_net_capacitance;
index_1("0.01, 0.1");
index_2("0.01, 0.1");
}
cell(INV) {
area : 1;
pin(A) { direction : input; capacitance : 0.01; }
pin(Y) {
direction : output; function : "!A"; max_capacitance : 1.0;
timing() { related_pin : "A"; timing_sense : negative_unate;
cell_rise(dt) { index_1("0.01, 0.1"); index_2("0.01, 0.1");
values("0.05, ...", "0.07, ..."); } }
}
}
cell(NAND2) {
area : 2;
pin(A) { direction : input; capacitance : 0.01; }
pin(B) { direction : input; capacitance : 0.01; }
pin(Y) {
direction : output; function : "!(A*B)"; max_capacitance : 1.0;
timing() { related_pin : "A"; timing_sense : negative_unate;
cell_rise(dt) { index_1("0.01, 0.1"); index_2("0.01, 0.1");
values("0.08, ...", "0.10, ..."); } }
}
}
}Read a cell top to bottom: area first, then pin functions and capacitances, then one timing group per arc. Each delay table repeats the two index axes from the template.
A second timing group with the other input pin holds the matching table. Flop cells replace output arcs with constraint and clock-to-output groups, covered in a later lesson.
INV is 1 unit and NAND2 is 2 units. Each input pin adds 0.01 load units.
Its tables are shortened to corner values. Only full tables give exact entries for interpolation.