Full Code of ncsu-eda/FreePDK3 for AI

main 2a6dd3c6c34a cached
769 files
31.8 MB
1.5M tokens
2 symbols
1 requests
Download .txt
Showing preview only (6,185K chars total). Download the full file or copy to clipboard to get everything.
Repository: ncsu-eda/FreePDK3
Branch: main
Commit: 2a6dd3c6c34a
Files: 769
Total size: 31.8 MB

Directory structure:
gitextract_qx27svws/

├── LICENSE
├── README.md
├── doc/
│   └── FreePDK3_Release_Notes.md
├── examples/
│   └── FreePDK3_examples/
│       ├── .oalib
│       ├── and/
│       │   ├── data.dm
│       │   ├── layout/
│       │   │   ├── data.dm
│       │   │   ├── layout.oa
│       │   │   └── master.tag
│       │   ├── schematic/
│       │   │   ├── data.dm
│       │   │   ├── master.tag
│       │   │   └── sch.oa
│       │   └── symbol/
│       │       ├── master.tag
│       │       └── symbol.oa
│       ├── d_ff/
│       │   ├── layout/
│       │   │   ├── data.dm
│       │   │   ├── layout.oa
│       │   │   └── master.tag
│       │   └── schematic/
│       │       ├── master.tag
│       │       └── sch.oa
│       ├── d_latch/
│       │   ├── data.dm
│       │   ├── layout/
│       │   │   ├── data.dm
│       │   │   ├── layout.oa
│       │   │   └── master.tag
│       │   ├── schematic/
│       │   │   ├── master.tag
│       │   │   └── sch.oa
│       │   └── symbol/
│       │       ├── master.tag
│       │       └── symbol.oa
│       ├── data.dm
│       ├── inverter/
│       │   ├── data.dm
│       │   ├── layout/
│       │   │   ├── data.dm
│       │   │   ├── layout.oa
│       │   │   └── master.tag
│       │   ├── schematic/
│       │   │   ├── master.tag
│       │   │   └── sch.oa
│       │   └── symbol/
│       │       ├── master.tag
│       │       └── symbol.oa
│       ├── inverter_testbench/
│       │   ├── HSPICE_default/
│       │   │   ├── analyses.xml
│       │   │   ├── designVariables.xml
│       │   │   ├── importedFiles.xml
│       │   │   ├── master.tag
│       │   │   ├── outputs.xml
│       │   │   ├── saeState.file
│       │   │   └── state.xml
│       │   └── schematic/
│       │       ├── master.tag
│       │       └── sch.oa
│       ├── lvs_nmos/
│       │   ├── layout/
│       │   │   ├── data.dm
│       │   │   ├── layout.oa
│       │   │   └── master.tag
│       │   └── schematic/
│       │       ├── master.tag
│       │       └── sch.oa
│       ├── lvs_pmos/
│       │   ├── layout/
│       │   │   ├── data.dm
│       │   │   ├── layout.oa
│       │   │   └── master.tag
│       │   └── schematic/
│       │       ├── master.tag
│       │       └── sch.oa
│       ├── nand/
│       │   ├── data.dm
│       │   ├── layout/
│       │   │   ├── data.dm
│       │   │   ├── layout.oa
│       │   │   └── master.tag
│       │   ├── schematic/
│       │   │   ├── master.tag
│       │   │   └── sch.oa
│       │   └── symbol/
│       │       ├── master.tag
│       │       └── symbol.oa
│       ├── nor/
│       │   ├── layout/
│       │   │   ├── data.dm
│       │   │   ├── layout.oa
│       │   │   └── master.tag
│       │   └── schematic/
│       │       ├── master.tag
│       │       └── sch.oa
│       ├── or/
│       │   ├── data.dm
│       │   ├── layout/
│       │   │   ├── data.dm
│       │   │   ├── layout.oa
│       │   │   └── master.tag
│       │   ├── schematic/
│       │   │   ├── master.tag
│       │   │   └── sch.oa
│       │   └── symbol/
│       │       ├── master.tag
│       │       └── symbol.oa
│       ├── xor/
│       │   ├── layout/
│       │   │   ├── data.dm
│       │   │   ├── layout.oa
│       │   │   └── master.tag
│       │   └── schematic/
│       │       ├── master.tag
│       │       └── sch.oa
│       └── xor_double/
│           ├── layout/
│           │   ├── data.dm
│           │   ├── layout.oa
│           │   └── master.tag
│           └── schematic/
│               ├── master.tag
│               └── sch.oa
├── hspice/
│   └── models/
│       └── fet.mod
├── icv/
│   ├── FreePDK3_main.drc.rs
│   ├── FreePDK3_main.lvs.rs
│   ├── FreePDK3_main.lvs.rs.user_functions
│   └── Include/
│       ├── FreePDK3.act.drc.rs
│       ├── FreePDK3.antenna.drc.rs
│       ├── FreePDK3.bpr.drc.rs
│       ├── FreePDK3.dummy.drc.rs
│       ├── FreePDK3.gate.drc.rs
│       ├── FreePDK3.gcon.drc.rs
│       ├── FreePDK3.gcut.drc.rs
│       ├── FreePDK3.m0a.drc.rs
│       ├── FreePDK3.m0b.drc.rs
│       ├── FreePDK3.m1.drc.rs
│       ├── FreePDK3.m10.drc.rs
│       ├── FreePDK3.m11.drc.rs
│       ├── FreePDK3.m12.drc.rs
│       ├── FreePDK3.m13.drc.rs
│       ├── FreePDK3.m2.drc.rs
│       ├── FreePDK3.m3.drc.rs
│       ├── FreePDK3.m4.drc.rs
│       ├── FreePDK3.m5.drc.rs
│       ├── FreePDK3.m6.drc.rs
│       ├── FreePDK3.m7.drc.rs
│       ├── FreePDK3.m8.drc.rs
│       ├── FreePDK3.m9.drc.rs
│       ├── FreePDK3.nimpim.drc.rs
│       ├── FreePDK3.nw.drc.rs
│       ├── FreePDK3.rdl.drc.rs
│       ├── FreePDK3.v0a.drc.rs
│       ├── FreePDK3.v0b.drc.rs
│       ├── FreePDK3.v1.drc.rs
│       ├── FreePDK3.v10.drc.rs
│       ├── FreePDK3.v11.drc.rs
│       ├── FreePDK3.v12.drc.rs
│       ├── FreePDK3.v2.drc.rs
│       ├── FreePDK3.v3.drc.rs
│       ├── FreePDK3.v4.drc.rs
│       ├── FreePDK3.v5.drc.rs
│       ├── FreePDK3.v6.drc.rs
│       ├── FreePDK3.v7.drc.rs
│       ├── FreePDK3.v8.drc.rs
│       ├── FreePDK3.v9.drc.rs
│       ├── FreePDK3.vbpr.drc.rs
│       └── FreePDK3.vrdl.drc.rs
├── starrc/
│   ├── FreePDK3_RCtyp.TLUPlus/
│   │   ├── .FreePDK3_RCtyp.tmp
│   │   ├── .filelist
│   │   ├── .format
│   │   ├── .itf
│   │   ├── ACT.BPR.M0B
│   │   ├── ACT.BPR.M1
│   │   ├── ACT.BPR.M2
│   │   ├── ACT.BPR.M3
│   │   ├── ACT.BPR.M4
│   │   ├── ACT.BPR.M5
│   │   ├── ACT.GATE.M0B
│   │   ├── ACT.GATE.M1
│   │   ├── ACT.GATE.M2
│   │   ├── ACT.GATE.M3
│   │   ├── ACT.GATE.M4
│   │   ├── ACT.GATE.M5
│   │   ├── ACT.M0A.M0B
│   │   ├── ACT.M0A.M1
│   │   ├── ACT.M0A.M2
│   │   ├── ACT.M0A.M3
│   │   ├── ACT.M0A.M4
│   │   ├── ACT.M0A.M5
│   │   ├── ACT.substrate.M0B
│   │   ├── ACT.substrate.M1
│   │   ├── ACT.substrate.M2
│   │   ├── ACT.substrate.M3
│   │   ├── ACT.substrate.M4
│   │   ├── ACT.substrate.M5
│   │   ├── BPR.substrate.ACT
│   │   ├── BPR.substrate.GATE
│   │   ├── BPR.substrate.M0A
│   │   ├── BPR.substrate.M0B
│   │   ├── BPR.substrate.M1
│   │   ├── BPR.substrate.M2
│   │   ├── GATE.BPR.ACT
│   │   ├── GATE.BPR.M0A
│   │   ├── GATE.BPR.M0B
│   │   ├── GATE.BPR.M1
│   │   ├── GATE.BPR.M2
│   │   ├── GATE.BPR.M3
│   │   ├── GATE.substrate.ACT
│   │   ├── GATE.substrate.M0A
│   │   ├── GATE.substrate.M0B
│   │   ├── GATE.substrate.M1
│   │   ├── GATE.substrate.M2
│   │   ├── GATE.substrate.M3
│   │   ├── M0A.BPR.ACT
│   │   ├── M0A.BPR.M0B
│   │   ├── M0A.BPR.M1
│   │   ├── M0A.BPR.M2
│   │   ├── M0A.BPR.M3
│   │   ├── M0A.BPR.M4
│   │   ├── M0A.GATE.ACT
│   │   ├── M0A.GATE.M0B
│   │   ├── M0A.GATE.M1
│   │   ├── M0A.GATE.M2
│   │   ├── M0A.GATE.M3
│   │   ├── M0A.GATE.M4
│   │   ├── M0A.substrate.ACT
│   │   ├── M0A.substrate.M0B
│   │   ├── M0A.substrate.M1
│   │   ├── M0A.substrate.M2
│   │   ├── M0A.substrate.M3
│   │   ├── M0A.substrate.M4
│   │   ├── M0B.ACT.M1
│   │   ├── M0B.ACT.M2
│   │   ├── M0B.ACT.M3
│   │   ├── M0B.ACT.M4
│   │   ├── M0B.ACT.M5
│   │   ├── M0B.ACT.M6
│   │   ├── M0B.BPR.M1
│   │   ├── M0B.BPR.M2
│   │   ├── M0B.BPR.M3
│   │   ├── M0B.BPR.M4
│   │   ├── M0B.BPR.M5
│   │   ├── M0B.BPR.M6
│   │   ├── M0B.GATE.M1
│   │   ├── M0B.GATE.M2
│   │   ├── M0B.GATE.M3
│   │   ├── M0B.GATE.M4
│   │   ├── M0B.GATE.M5
│   │   ├── M0B.GATE.M6
│   │   ├── M0B.M0A.M1
│   │   ├── M0B.M0A.M2
│   │   ├── M0B.M0A.M3
│   │   ├── M0B.M0A.M4
│   │   ├── M0B.M0A.M5
│   │   ├── M0B.M0A.M6
│   │   ├── M0B.substrate.M1
│   │   ├── M0B.substrate.M2
│   │   ├── M0B.substrate.M3
│   │   ├── M0B.substrate.M4
│   │   ├── M0B.substrate.M5
│   │   ├── M0B.substrate.M6
│   │   ├── M1.ACT.M2
│   │   ├── M1.ACT.M3
│   │   ├── M1.ACT.M4
│   │   ├── M1.ACT.M5
│   │   ├── M1.ACT.M6
│   │   ├── M1.ACT.M7
│   │   ├── M1.BPR.M2
│   │   ├── M1.BPR.M3
│   │   ├── M1.BPR.M4
│   │   ├── M1.BPR.M5
│   │   ├── M1.BPR.M6
│   │   ├── M1.BPR.M7
│   │   ├── M1.GATE.M2
│   │   ├── M1.GATE.M3
│   │   ├── M1.GATE.M4
│   │   ├── M1.GATE.M5
│   │   ├── M1.GATE.M6
│   │   ├── M1.GATE.M7
│   │   ├── M1.M0A.M2
│   │   ├── M1.M0A.M3
│   │   ├── M1.M0A.M4
│   │   ├── M1.M0A.M5
│   │   ├── M1.M0A.M6
│   │   ├── M1.M0A.M7
│   │   ├── M1.M0B.M2
│   │   ├── M1.M0B.M3
│   │   ├── M1.M0B.M4
│   │   ├── M1.M0B.M5
│   │   ├── M1.M0B.M6
│   │   ├── M1.M0B.M7
│   │   ├── M1.substrate.M2
│   │   ├── M1.substrate.M3
│   │   ├── M1.substrate.M4
│   │   ├── M1.substrate.M5
│   │   ├── M1.substrate.M6
│   │   ├── M1.substrate.M7
│   │   ├── M10.M4
│   │   ├── M10.M4.M11
│   │   ├── M10.M4.M12
│   │   ├── M10.M4.M13
│   │   ├── M10.M4.RDL
│   │   ├── M10.M5
│   │   ├── M10.M5.M11
│   │   ├── M10.M5.M12
│   │   ├── M10.M5.M13
│   │   ├── M10.M5.RDL
│   │   ├── M10.M6
│   │   ├── M10.M6.M11
│   │   ├── M10.M6.M12
│   │   ├── M10.M6.M13
│   │   ├── M10.M6.RDL
│   │   ├── M10.M7
│   │   ├── M10.M7.M11
│   │   ├── M10.M7.M12
│   │   ├── M10.M7.M13
│   │   ├── M10.M7.RDL
│   │   ├── M10.M8
│   │   ├── M10.M8.M11
│   │   ├── M10.M8.M12
│   │   ├── M10.M8.M13
│   │   ├── M10.M8.RDL
│   │   ├── M10.M9
│   │   ├── M10.M9.M11
│   │   ├── M10.M9.M12
│   │   ├── M10.M9.M13
│   │   ├── M10.M9.RDL
│   │   ├── M11.M10
│   │   ├── M11.M10.M12
│   │   ├── M11.M10.M13
│   │   ├── M11.M10.RDL
│   │   ├── M11.M5
│   │   ├── M11.M5.M12
│   │   ├── M11.M5.M13
│   │   ├── M11.M5.RDL
│   │   ├── M11.M6
│   │   ├── M11.M6.M12
│   │   ├── M11.M6.M13
│   │   ├── M11.M6.RDL
│   │   ├── M11.M7
│   │   ├── M11.M7.M12
│   │   ├── M11.M7.M13
│   │   ├── M11.M7.RDL
│   │   ├── M11.M8
│   │   ├── M11.M8.M12
│   │   ├── M11.M8.M13
│   │   ├── M11.M8.RDL
│   │   ├── M11.M9
│   │   ├── M11.M9.M12
│   │   ├── M11.M9.M13
│   │   ├── M11.M9.RDL
│   │   ├── M12.M10
│   │   ├── M12.M10.M13
│   │   ├── M12.M10.RDL
│   │   ├── M12.M11
│   │   ├── M12.M11.M13
│   │   ├── M12.M11.RDL
│   │   ├── M12.M6
│   │   ├── M12.M6.M13
│   │   ├── M12.M6.RDL
│   │   ├── M12.M7
│   │   ├── M12.M7.M13
│   │   ├── M12.M7.RDL
│   │   ├── M12.M8
│   │   ├── M12.M8.M13
│   │   ├── M12.M8.RDL
│   │   ├── M12.M9
│   │   ├── M12.M9.M13
│   │   ├── M12.M9.RDL
│   │   ├── M13.M10
│   │   ├── M13.M10.RDL
│   │   ├── M13.M11
│   │   ├── M13.M11.RDL
│   │   ├── M13.M12
│   │   ├── M13.M12.RDL
│   │   ├── M13.M7
│   │   ├── M13.M7.RDL
│   │   ├── M13.M8
│   │   ├── M13.M8.RDL
│   │   ├── M13.M9
│   │   ├── M13.M9.RDL
│   │   ├── M2.ACT.M3
│   │   ├── M2.ACT.M4
│   │   ├── M2.ACT.M5
│   │   ├── M2.ACT.M6
│   │   ├── M2.ACT.M7
│   │   ├── M2.ACT.M8
│   │   ├── M2.BPR.M3
│   │   ├── M2.BPR.M4
│   │   ├── M2.BPR.M5
│   │   ├── M2.BPR.M6
│   │   ├── M2.BPR.M7
│   │   ├── M2.BPR.M8
│   │   ├── M2.GATE.M3
│   │   ├── M2.GATE.M4
│   │   ├── M2.GATE.M5
│   │   ├── M2.GATE.M6
│   │   ├── M2.GATE.M7
│   │   ├── M2.GATE.M8
│   │   ├── M2.M0A.M3
│   │   ├── M2.M0A.M4
│   │   ├── M2.M0A.M5
│   │   ├── M2.M0A.M6
│   │   ├── M2.M0A.M7
│   │   ├── M2.M0A.M8
│   │   ├── M2.M0B.M3
│   │   ├── M2.M0B.M4
│   │   ├── M2.M0B.M5
│   │   ├── M2.M0B.M6
│   │   ├── M2.M0B.M7
│   │   ├── M2.M0B.M8
│   │   ├── M2.M1.M3
│   │   ├── M2.M1.M4
│   │   ├── M2.M1.M5
│   │   ├── M2.M1.M6
│   │   ├── M2.M1.M7
│   │   ├── M2.M1.M8
│   │   ├── M3.ACT.M4
│   │   ├── M3.ACT.M5
│   │   ├── M3.ACT.M6
│   │   ├── M3.ACT.M7
│   │   ├── M3.ACT.M8
│   │   ├── M3.ACT.M9
│   │   ├── M3.GATE.M4
│   │   ├── M3.GATE.M5
│   │   ├── M3.GATE.M6
│   │   ├── M3.GATE.M7
│   │   ├── M3.GATE.M8
│   │   ├── M3.GATE.M9
│   │   ├── M3.M0A.M4
│   │   ├── M3.M0A.M5
│   │   ├── M3.M0A.M6
│   │   ├── M3.M0A.M7
│   │   ├── M3.M0A.M8
│   │   ├── M3.M0A.M9
│   │   ├── M3.M0B.M4
│   │   ├── M3.M0B.M5
│   │   ├── M3.M0B.M6
│   │   ├── M3.M0B.M7
│   │   ├── M3.M0B.M8
│   │   ├── M3.M0B.M9
│   │   ├── M3.M1.M4
│   │   ├── M3.M1.M5
│   │   ├── M3.M1.M6
│   │   ├── M3.M1.M7
│   │   ├── M3.M1.M8
│   │   ├── M3.M1.M9
│   │   ├── M3.M2.M4
│   │   ├── M3.M2.M5
│   │   ├── M3.M2.M6
│   │   ├── M3.M2.M7
│   │   ├── M3.M2.M8
│   │   ├── M3.M2.M9
│   │   ├── M4.ACT.M10
│   │   ├── M4.ACT.M5
│   │   ├── M4.ACT.M6
│   │   ├── M4.ACT.M7
│   │   ├── M4.ACT.M8
│   │   ├── M4.ACT.M9
│   │   ├── M4.M0A.M10
│   │   ├── M4.M0A.M5
│   │   ├── M4.M0A.M6
│   │   ├── M4.M0A.M7
│   │   ├── M4.M0A.M8
│   │   ├── M4.M0A.M9
│   │   ├── M4.M0B.M10
│   │   ├── M4.M0B.M5
│   │   ├── M4.M0B.M6
│   │   ├── M4.M0B.M7
│   │   ├── M4.M0B.M8
│   │   ├── M4.M0B.M9
│   │   ├── M4.M1.M10
│   │   ├── M4.M1.M5
│   │   ├── M4.M1.M6
│   │   ├── M4.M1.M7
│   │   ├── M4.M1.M8
│   │   ├── M4.M1.M9
│   │   ├── M4.M2.M10
│   │   ├── M4.M2.M5
│   │   ├── M4.M2.M6
│   │   ├── M4.M2.M7
│   │   ├── M4.M2.M8
│   │   ├── M4.M2.M9
│   │   ├── M4.M3.M10
│   │   ├── M4.M3.M5
│   │   ├── M4.M3.M6
│   │   ├── M4.M3.M7
│   │   ├── M4.M3.M8
│   │   ├── M4.M3.M9
│   │   ├── M5.ACT.M10
│   │   ├── M5.ACT.M11
│   │   ├── M5.ACT.M6
│   │   ├── M5.ACT.M7
│   │   ├── M5.ACT.M8
│   │   ├── M5.ACT.M9
│   │   ├── M5.M0B.M10
│   │   ├── M5.M0B.M11
│   │   ├── M5.M0B.M6
│   │   ├── M5.M0B.M7
│   │   ├── M5.M0B.M8
│   │   ├── M5.M0B.M9
│   │   ├── M5.M1.M10
│   │   ├── M5.M1.M11
│   │   ├── M5.M1.M6
│   │   ├── M5.M1.M7
│   │   ├── M5.M1.M8
│   │   ├── M5.M1.M9
│   │   ├── M5.M2.M10
│   │   ├── M5.M2.M11
│   │   ├── M5.M2.M6
│   │   ├── M5.M2.M7
│   │   ├── M5.M2.M8
│   │   ├── M5.M2.M9
│   │   ├── M5.M3.M10
│   │   ├── M5.M3.M11
│   │   ├── M5.M3.M6
│   │   ├── M5.M3.M7
│   │   ├── M5.M3.M8
│   │   ├── M5.M3.M9
│   │   ├── M5.M4.M10
│   │   ├── M5.M4.M11
│   │   ├── M5.M4.M6
│   │   ├── M5.M4.M7
│   │   ├── M5.M4.M8
│   │   ├── M5.M4.M9
│   │   ├── M6.M0B.M10
│   │   ├── M6.M0B.M11
│   │   ├── M6.M0B.M12
│   │   ├── M6.M0B.M7
│   │   ├── M6.M0B.M8
│   │   ├── M6.M0B.M9
│   │   ├── M6.M1.M10
│   │   ├── M6.M1.M11
│   │   ├── M6.M1.M12
│   │   ├── M6.M1.M7
│   │   ├── M6.M1.M8
│   │   ├── M6.M1.M9
│   │   ├── M6.M2.M10
│   │   ├── M6.M2.M11
│   │   ├── M6.M2.M12
│   │   ├── M6.M2.M7
│   │   ├── M6.M2.M8
│   │   ├── M6.M2.M9
│   │   ├── M6.M3.M10
│   │   ├── M6.M3.M11
│   │   ├── M6.M3.M12
│   │   ├── M6.M3.M7
│   │   ├── M6.M3.M8
│   │   ├── M6.M3.M9
│   │   ├── M6.M4.M10
│   │   ├── M6.M4.M11
│   │   ├── M6.M4.M12
│   │   ├── M6.M4.M7
│   │   ├── M6.M4.M8
│   │   ├── M6.M4.M9
│   │   ├── M6.M5.M10
│   │   ├── M6.M5.M11
│   │   ├── M6.M5.M12
│   │   ├── M6.M5.M7
│   │   ├── M6.M5.M8
│   │   ├── M6.M5.M9
│   │   ├── M7.M1.M10
│   │   ├── M7.M1.M11
│   │   ├── M7.M1.M12
│   │   ├── M7.M1.M13
│   │   ├── M7.M1.M8
│   │   ├── M7.M1.M9
│   │   ├── M7.M2.M10
│   │   ├── M7.M2.M11
│   │   ├── M7.M2.M12
│   │   ├── M7.M2.M13
│   │   ├── M7.M2.M8
│   │   ├── M7.M2.M9
│   │   ├── M7.M3.M10
│   │   ├── M7.M3.M11
│   │   ├── M7.M3.M12
│   │   ├── M7.M3.M13
│   │   ├── M7.M3.M8
│   │   ├── M7.M3.M9
│   │   ├── M7.M4.M10
│   │   ├── M7.M4.M11
│   │   ├── M7.M4.M12
│   │   ├── M7.M4.M13
│   │   ├── M7.M4.M8
│   │   ├── M7.M4.M9
│   │   ├── M7.M5.M10
│   │   ├── M7.M5.M11
│   │   ├── M7.M5.M12
│   │   ├── M7.M5.M13
│   │   ├── M7.M5.M8
│   │   ├── M7.M5.M9
│   │   ├── M7.M6.M10
│   │   ├── M7.M6.M11
│   │   ├── M7.M6.M12
│   │   ├── M7.M6.M13
│   │   ├── M7.M6.M8
│   │   ├── M7.M6.M9
│   │   ├── M8.M2.M10
│   │   ├── M8.M2.M11
│   │   ├── M8.M2.M12
│   │   ├── M8.M2.M13
│   │   ├── M8.M2.M9
│   │   ├── M8.M2.RDL
│   │   ├── M8.M3.M10
│   │   ├── M8.M3.M11
│   │   ├── M8.M3.M12
│   │   ├── M8.M3.M13
│   │   ├── M8.M3.M9
│   │   ├── M8.M3.RDL
│   │   ├── M8.M4.M10
│   │   ├── M8.M4.M11
│   │   ├── M8.M4.M12
│   │   ├── M8.M4.M13
│   │   ├── M8.M4.M9
│   │   ├── M8.M4.RDL
│   │   ├── M8.M5.M10
│   │   ├── M8.M5.M11
│   │   ├── M8.M5.M12
│   │   ├── M8.M5.M13
│   │   ├── M8.M5.M9
│   │   ├── M8.M5.RDL
│   │   ├── M8.M6.M10
│   │   ├── M8.M6.M11
│   │   ├── M8.M6.M12
│   │   ├── M8.M6.M13
│   │   ├── M8.M6.M9
│   │   ├── M8.M6.RDL
│   │   ├── M8.M7.M10
│   │   ├── M8.M7.M11
│   │   ├── M8.M7.M12
│   │   ├── M8.M7.M13
│   │   ├── M8.M7.M9
│   │   ├── M8.M7.RDL
│   │   ├── M9.M3
│   │   ├── M9.M3.M10
│   │   ├── M9.M3.M11
│   │   ├── M9.M3.M12
│   │   ├── M9.M3.M13
│   │   ├── M9.M3.RDL
│   │   ├── M9.M4
│   │   ├── M9.M4.M10
│   │   ├── M9.M4.M11
│   │   ├── M9.M4.M12
│   │   ├── M9.M4.M13
│   │   ├── M9.M4.RDL
│   │   ├── M9.M5
│   │   ├── M9.M5.M10
│   │   ├── M9.M5.M11
│   │   ├── M9.M5.M12
│   │   ├── M9.M5.M13
│   │   ├── M9.M5.RDL
│   │   ├── M9.M6
│   │   ├── M9.M6.M10
│   │   ├── M9.M6.M11
│   │   ├── M9.M6.M12
│   │   ├── M9.M6.M13
│   │   ├── M9.M6.RDL
│   │   ├── M9.M7
│   │   ├── M9.M7.M10
│   │   ├── M9.M7.M11
│   │   ├── M9.M7.M12
│   │   ├── M9.M7.M13
│   │   ├── M9.M7.RDL
│   │   ├── M9.M8
│   │   ├── M9.M8.M10
│   │   ├── M9.M8.M11
│   │   ├── M9.M8.M12
│   │   ├── M9.M8.M13
│   │   ├── M9.M8.RDL
│   │   ├── RDL.M10
│   │   ├── RDL.M11
│   │   ├── RDL.M12
│   │   ├── RDL.M13
│   │   ├── RDL.M8
│   │   └── RDL.M9
│   ├── FreePDK3_RCtyp.itf
│   ├── FreePDK3_RCtyp.nxtgrd
│   ├── Makefile
│   └── grdgenxo_nxtgrd.out
└── syncust/
    ├── Makefile
    ├── NCSU_TechLib_FreePDK3/
    │   ├── .oalib
    │   ├── BPR_M0A/
    │   │   └── layout/
    │   │       ├── data.dm
    │   │       ├── layout.oa
    │   │       └── master.tag
    │   ├── GATE_M0B/
    │   │   └── layout/
    │   │       ├── data.dm
    │   │       ├── layout.oa
    │   │       └── master.tag
    │   ├── M0A_M0B/
    │   │   └── layout/
    │   │       ├── data.dm
    │   │       ├── layout.oa
    │   │       └── master.tag
    │   ├── M0B_M1/
    │   │   └── layout/
    │   │       ├── data.dm
    │   │       ├── layout.oa
    │   │       └── master.tag
    │   ├── M10_M11/
    │   │   └── layout/
    │   │       ├── data.dm
    │   │       ├── layout.oa
    │   │       └── master.tag
    │   ├── M11_M12/
    │   │   └── layout/
    │   │       ├── data.dm
    │   │       ├── layout.oa
    │   │       └── master.tag
    │   ├── M12_M13/
    │   │   └── layout/
    │   │       ├── data.dm
    │   │       ├── layout.oa
    │   │       └── master.tag
    │   ├── M13_RDL/
    │   │   └── layout/
    │   │       ├── data.dm
    │   │       ├── layout.oa
    │   │       └── master.tag
    │   ├── M1_M2/
    │   │   └── layout/
    │   │       ├── data.dm
    │   │       ├── layout.oa
    │   │       └── master.tag
    │   ├── M2_M3/
    │   │   └── layout/
    │   │       ├── data.dm
    │   │       ├── layout.oa
    │   │       └── master.tag
    │   ├── M3_M4/
    │   │   └── layout/
    │   │       ├── data.dm
    │   │       ├── layout.oa
    │   │       └── master.tag
    │   ├── M4_M5/
    │   │   └── layout/
    │   │       ├── data.dm
    │   │       ├── layout.oa
    │   │       └── master.tag
    │   ├── M5_M6/
    │   │   └── layout/
    │   │       ├── data.dm
    │   │       ├── layout.oa
    │   │       └── master.tag
    │   ├── M6_M7/
    │   │   └── layout/
    │   │       ├── data.dm
    │   │       ├── layout.oa
    │   │       └── master.tag
    │   ├── M7_M8/
    │   │   └── layout/
    │   │       ├── data.dm
    │   │       ├── layout.oa
    │   │       └── master.tag
    │   ├── M8_M9/
    │   │   └── layout/
    │   │       ├── data.dm
    │   │       ├── layout.oa
    │   │       └── master.tag
    │   ├── M9_M10/
    │   │   └── layout/
    │   │       ├── data.dm
    │   │       ├── layout.oa
    │   │       └── master.tag
    │   ├── NCSU_TechLib_FreePDK3.layermap
    │   ├── autoLoad.file
    │   ├── display.drf
    │   ├── nmos/
    │   │   ├── ams/
    │   │   │   ├── master.tag
    │   │   │   └── symbol.oa
    │   │   ├── auCdl/
    │   │   │   ├── master.tag
    │   │   │   └── symbol.oa
    │   │   ├── auLvs/
    │   │   │   ├── master.tag
    │   │   │   └── symbol.oa
    │   │   ├── data.dm
    │   │   ├── hspiceD/
    │   │   │   ├── master.tag
    │   │   │   └── symbol.oa
    │   │   ├── layout/
    │   │   │   ├── data.dm
    │   │   │   ├── layout.oa
    │   │   │   └── master.tag
    │   │   ├── spectre/
    │   │   │   ├── master.tag
    │   │   │   └── symbol.oa
    │   │   └── symbol/
    │   │       ├── data.dm
    │   │       ├── master.tag
    │   │       └── symbol.oa
    │   ├── nmos4/
    │   │   ├── ams/
    │   │   │   ├── master.tag
    │   │   │   └── symbol.oa
    │   │   ├── auCdl/
    │   │   │   ├── master.tag
    │   │   │   └── symbol.oa
    │   │   ├── auLvs/
    │   │   │   ├── master.tag
    │   │   │   └── symbol.oa
    │   │   ├── data.dm
    │   │   ├── hspiceD/
    │   │   │   ├── master.tag
    │   │   │   └── symbol.oa
    │   │   ├── spectre/
    │   │   │   ├── master.tag
    │   │   │   └── symbol.oa
    │   │   └── symbol/
    │   │       ├── data.dm
    │   │       ├── master.tag
    │   │       └── symbol.oa
    │   ├── pmos/
    │   │   ├── ams/
    │   │   │   ├── master.tag
    │   │   │   └── symbol.oa
    │   │   ├── auCdl/
    │   │   │   ├── master.tag
    │   │   │   └── symbol.oa
    │   │   ├── auLvs/
    │   │   │   ├── master.tag
    │   │   │   └── symbol.oa
    │   │   ├── data.dm
    │   │   ├── hspiceD/
    │   │   │   ├── master.tag
    │   │   │   └── symbol.oa
    │   │   ├── layout/
    │   │   │   ├── data.dm
    │   │   │   ├── layout.oa
    │   │   │   └── master.tag
    │   │   ├── spectre/
    │   │   │   ├── master.tag
    │   │   │   └── symbol.oa
    │   │   └── symbol/
    │   │       ├── data.dm
    │   │       ├── master.tag
    │   │       └── symbol.oa
    │   └── pmos4/
    │       ├── ams/
    │       │   ├── master.tag
    │       │   └── symbol.oa
    │       ├── auCdl/
    │       │   ├── master.tag
    │       │   └── symbol.oa
    │       ├── auLvs/
    │       │   ├── master.tag
    │       │   └── symbol.oa
    │       ├── data.dm
    │       ├── hspiceD/
    │       │   ├── master.tag
    │       │   └── symbol.oa
    │       ├── spectre/
    │       │   ├── master.tag
    │       │   └── symbol.oa
    │       └── symbol/
    │           ├── data.dm
    │           ├── master.tag
    │           └── symbol.oa
    ├── Tcl/
    │   └── utils/
    │       └── updateTech.tcl
    ├── cdf/
    │   ├── loadAll.tcl
    │   ├── nmos.cdf
    │   ├── nmos4.cdf
    │   ├── pmos.cdf
    │   └── pmos4.cdf
    ├── lib.defs
    ├── scripts/
    │   └── callbacks/
    │       └── callbacks.tcl
    └── techfiles/
        └── NCSU_TechLib_FreePDK3_CC.tf

================================================
FILE CONTENTS
================================================

================================================
FILE: LICENSE
================================================
   FreePDK3(TM) Predictive Process Design Kit

Copyright (c) 2021, North Carolina State University
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.

3. The names “North Carolina State University”, “NCSU” and any
trade-name, personal name, trademark, trade device, service mark,
symbol, image, icon, or any abbreviation, contraction or simulation
thereof owned by North Carolina State University must not be used to
endorse or promote products derived from this software without prior
written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.



================================================
FILE: README.md
================================================
FreePDK3 <sup>TM</sup> Predictive Process Design Kit
=====================================================
version 1.0 (2021-08-30)

Copyright (c) 2021 North Carolina State University,
All Rights Reserved.

Please see the file LICENSE in this directory for license.
You may not use these files except in compliance with the License.

## Welcome to the FreePDK <sup>TM</sup> 3nm Free, Open-Source Process Design Kit 

This initiative is brought to you by NC State Univeristy and Synopsys.

This version of the kit was created by the following at NC State University:
* Sushant Sadangi              - Design Rules, Layer Stack, and ICV Rules
* Viswanatha Pasumarthy        - Star-RC Models
* W. Shepherd Pitts            - HSPICE Models
* W. Rhett Davis               - Custom Compiler Support and Project Management

Many thanks to the following at Synopsys for technical and financial support:
* Ron Duncan                      - Process technology advice and ICV Support
* Luis Francisco & Yen-Sung Chen  - ICV Rules Templates and Coding Support
* Olaf Schneider                  - Custom Compiler PDK and Scripting Support
* Jonathan White & Patrick Haspel - Project Management


## Quick Design Kit Usage Instructions

  1) Create or modify the file lib.defs in your current directory
     and ensure that it includes the following line:

          INCLUDE $PDK_DIR/syncust/lib.defs

     ...where $PDK_DIR is replaced with the path to the directory
     containing this file.  Note that the environmnet variable
     PDK_DIR does not need to be set.

  2) Source your setup scripts for Synopsys Custom Compiler, IC Validator,
     Star-RC, HSPICE, and Custom WaveView

  3) Start Synopsys Custom Compiler with the command `custom_compiler &`

## Contents 

| Directory  | Contents                                                       |
| ---------- | -------------------------------------------------------------- |
| syncust/   | Technology libraries and scripts for Synopsys Custom Compiler  |
| icv/       | DRC and LVS rules for Synopsys IC Validator                    |
| starrc/    | Parasitic extraction models for Synopsys StarRC                |
| hspice/    | Simulation models for Synopsys HSPICE                          |
| examples/  | Example library with layouts and schematics                    |
| doc/       | Design Rule Manual and Release Notes                           |


More documentation and tutorials for this kit
can be found at <http://www.eda.ncsu.edu/FreePDK>

*Please send all questions and comments to <eda_help@ncsu.edu>*




================================================
FILE: doc/FreePDK3_Release_Notes.md
================================================
FreePDK3 Release Notes
======================

## Version 1.0 (2021-08-30)

* Included in this release
  * Technology library and display resources for Synopsys Custom Compiler
      (Tested with Custom Compiler Q-2020.03-SP2)
  * IC Validator DRC & LVS Rules (Tested with ICV R-2020.09)
  * StarRC extraction Models (Tested with StarRC R-2020.09)
  * HSPICE Simulation Models (Tested with HSPICE Q-2020.03-SP2)
* Issues with this release
  * Design Rules
    * The ANTENNA rule is implemented, but no protection-diode structure 
	     exists.  Therefore, some other means to fix the violation would be 
	     required for long run lengths (such as "stapling" to a lower metal 
	     layer).  We plan to release an updated kit with a protection-diode.  
      Until then, this rule can be disabled by editing the file 
      icv/FreePDK3_main.drc.rs by inserting comment characters "//" in 
	     front of the line that includes FreePDK3.antenna.drc.rs.
	* Preliminary double patterning rules have been added for metal layers
	  1-3 and 7-9.  Rule Mx.7 decomposes each layer into two masks and
	  stores the result in a file called m#_dpt_output.gds.  Rule Mx.8 
	  checks to ensure that density requirements are met.  These rules 
	  are otherwise undocumented, buecause we are still tuning them and 
	  expect them to change in a future release.
  * Circuit Simulation Models
    * Preliminary HSPICE models have been added, based on a simple 
	     Sentaurus simulation.  This model includes a single nanosheet wrapped
	     in gate metal with no source or drain regions.  Our simulations are
	     showing much better performance than we would have expected, so please
	     use these models only as a first glimpse of a gate-all-around FET.  
	     More work is needed to properly tune these models.  Please contact us
	     if you would like to help with this task.
  * Parasitic Extraction Models
    * StarRC extraction models are also are provided for a typical process.
      We anticipate supporting corner models in a future release.
	* StarRC models are complete down to the V0A layer, but the lower layers
	  need additional work.  In particular, we anticipate one or more of
	  the following changes in a future release:
	  * Separate GATE layers in ICV LVS rules for device and field,
	    with the LAYER_TYPE properly set, to avoid double-counting the GATE capacitance (Rule 2, p. 8-13 in StarRC User Guide)
	  * a MULTIGATE statement to model the gate all around the nanosheet 
	    (p. 12-4 in StarRC User Guide)
	  * TRENCH_CONTACT layer-types to properly model the M0A layer
	  * Proper modeling of the conformal dielectric of the buried power-rail
     to capture substrate coupling capacitance


================================================
FILE: examples/FreePDK3_examples/.oalib
================================================
<?xml version="1.0"?>

<Library DMSystem="oaDMFileSys">
    <oaDMFileSys libReadOnly="No"
                 origFileSystem="Unix"/>
</Library>


================================================
FILE: examples/FreePDK3_examples/and/layout/master.tag
================================================
-- Master.tag File, Rev:1.0
layout.oa


================================================
FILE: examples/FreePDK3_examples/and/schematic/master.tag
================================================
-- Master.tag File, Rev:1.0
sch.oa


================================================
FILE: examples/FreePDK3_examples/and/symbol/master.tag
================================================
-- Master.tag File, Rev:1.0
symbol.oa


================================================
FILE: examples/FreePDK3_examples/d_ff/layout/master.tag
================================================
-- Master.tag File, Rev:1.0
layout.oa


================================================
FILE: examples/FreePDK3_examples/d_ff/schematic/master.tag
================================================
-- Master.tag File, Rev:1.0
sch.oa


================================================
FILE: examples/FreePDK3_examples/d_latch/layout/master.tag
================================================
-- Master.tag File, Rev:1.0
layout.oa


================================================
FILE: examples/FreePDK3_examples/d_latch/schematic/master.tag
================================================
-- Master.tag File, Rev:1.0
sch.oa


================================================
FILE: examples/FreePDK3_examples/d_latch/symbol/master.tag
================================================
-- Master.tag File, Rev:1.0
symbol.oa


================================================
FILE: examples/FreePDK3_examples/inverter/layout/master.tag
================================================
-- Master.tag File, Rev:1.0
layout.oa


================================================
FILE: examples/FreePDK3_examples/inverter/schematic/master.tag
================================================
-- Master.tag File, Rev:1.0
sch.oa


================================================
FILE: examples/FreePDK3_examples/inverter/symbol/master.tag
================================================
-- Master.tag File, Rev:1.0
symbol.oa


================================================
FILE: examples/FreePDK3_examples/inverter_testbench/HSPICE_default/analyses.xml
================================================
<?xml version="1.0"?>
<!--Created by Custom Compiler (TM), build , on Tue Jul  6 17:25:21 2021-->
<file-format name="stateCategory" version="1.0">
 <collection name="analyses">
  <object name="analyses" version="1" type="saAnalysis">
   <attribute name="advanced" type="giBoolean" value="0"/>
   <attribute name="card" type="giString" value=""/>
   <attribute name="definition" type="giString" value="tran"/>
   <attribute name="description" type="giString" value=""/>
   <attribute name="doRestore" type="giBoolean" value="0"/>
   <attribute name="doSave" type="giBoolean" value="0"/>
   <attribute name="enabled" type="giBoolean" value="1"/>
   <attribute name="method" type="giString" value="Temp Sweep"/>
   <attribute name="name" type="giString" value="tran"/>
   <attribute name="numIntervals" type="giString" value="1"/>
   <collection name="options"/>
   <attribute name="otherOptions" type="giString" value=""/>
   <attribute name="restorePoint" type="giString" value=""/>
   <attribute name="runLevels" type="giString" value=""/>
   <attribute name="saveList" type="giString" value=""/>
   <attribute name="soa" type="giBoolean" value="0"/>
   <attribute name="start" type="giString" value="0"/>
   <attribute name="step" type="giString" value="1p"/>
   <attribute name="step2" type="giString" value=""/>
   <attribute name="step3" type="giString" value=""/>
   <attribute name="step4" type="giString" value=""/>
   <attribute name="step5" type="giString" value=""/>
   <attribute name="stop" type="giString" value="200p"/>
   <attribute name="stop2" type="giString" value=""/>
   <attribute name="stop3" type="giString" value=""/>
   <attribute name="stop4" type="giString" value=""/>
   <attribute name="stop5" type="giString" value=""/>
   <attribute name="tempStep" type="giString" value=""/>
   <attribute name="tempValues" type="giString" value=""/>
   <attribute name="uic" type="giBoolean" value="0"/>
   <attribute name="useCard" type="giBoolean" value="0"/>
  </object>
 </collection>
</file-format>


================================================
FILE: examples/FreePDK3_examples/inverter_testbench/HSPICE_default/designVariables.xml
================================================
<?xml version="1.0"?>
<!--Created by Custom Compiler (TM), build , on Tue Jul  6 17:25:21 2021-->
<file-format name="stateCategory" version="1.0">
 <object name="designVariables" version="1" type="saDesignVariables">
  <attribute name="variableSet" type="giString" value="default"/>
  <collection name="variableSets">
   <object name="variableSets" version="1" type="saDesignVariableSet">
    <collection name="designVariables">
     <object name="designVariables" version="1" type="saDesignVariable">
      <attribute name="description" type="giString" value=""/>
      <attribute name="name" type="giString" value="VDD_VAL"/>
      <attribute name="useLocal" type="giBoolean" value="1"/>
      <attribute name="value" type="giString" value="0.8"/>
      <attribute name="variableType" type="enVariableType" value="none"/>
     </object>
    </collection>
    <attribute name="name" type="giString" value="default"/>
   </object>
  </collection>
 </object>
</file-format>


================================================
FILE: examples/FreePDK3_examples/inverter_testbench/HSPICE_default/importedFiles.xml
================================================
<?xml version="1.0"?>
<!--Created by Custom Compiler (TM), build , on Tue Jul  6 17:25:21 2021-->
<file-format name="stateCategory" version="1.0">
 <object name="importedFiles" version="1" type="saImportedFiles">
  <collection name="files"/>
  <attribute name="lastImportTime" type="giString" value=""/>
 </object>
</file-format>


================================================
FILE: examples/FreePDK3_examples/inverter_testbench/HSPICE_default/master.tag
================================================
-- Master.tag File, Rev:1.0
saeState.file


================================================
FILE: examples/FreePDK3_examples/inverter_testbench/HSPICE_default/outputs.xml
================================================
<?xml version="1.0"?>
<!--Created by Custom Compiler (TM), build , on Tue Jul  6 17:25:21 2021-->
<file-format name="stateCategory" version="1.0">
 <object name="outputs" version="1" type="saOutputs">
  <collection name="customPlotModes">
   <object name="customPlotModes" type="wfCustomPlotMode">
    <attribute name="config" type="giString" value="### Custom WaveView session file (version Q-2020.03-SP2 build Aug 26, ) ###&#xa;### saved at 17:07:24 on Tue Jul  6 2021 ###&#xa;wdf 0 &quot;/home/wdavis/ece546/run/fpk3/simulation/FreePDK3_examples,inverter_testbench,schematic/history_1/simulation/default/HSPICE/nominal/results/resultsMap.xml&quot; load=used &quot;title=tran:tran&quot; &quot;atype=tran:tran&quot; &#xa;scalar list&#xa;waveview_begin 1  stack  offset=0 name_b=81 mntr_b=81 name_width=66 &quot;name=tran&quot; showtitle=true &quot;wvtitle=tran&quot; &#xa;  panel_begin linear pidx=0 spath=name+file xlabel=&quot;TIME(sec)&quot; ylabel=&quot;V&quot; &#xa;    line src=wdf lidx=0 fidx=0 &quot;delim=.&quot; sigtype=1 &quot;name=v(a)&quot; attr=3:0:1:0 alias=&quot;v(/A)&quot; disp=show &#xa;    line src=wdf lidx=1 fidx=0 &quot;delim=.&quot; sigtype=1 &quot;name=v(out)&quot; attr=128:1:1:0 user_color=204:0:255 alias=&quot;v(/OUT)&quot; disp=show &#xa;  panel_end&#xa;waveview_end&#xa;browserClosed&#xa;&#xa;#Custom Plot Section&#xa;simulation_begin test=default history=-1 idx=1&#xa;run_type 0&#xa;view_list&#xa;  1 tran&#xa;end_view_list&#xa;probe_list&#xa;  v(/A) alias=&#xa;  v(/OUT) alias=&#xa;end_probe_list&#xa;original_sim&#xa;sim_id=default&#xa;history_point=-1&#xa;sim_idx=1&#xa;sim_dir=/home/wdavis/ece546/run/fpk3/simulation/FreePDK3_examples,inverter_testbench,schematic/history_1/simulation/default/HSPICE/nominal/results&#xa;from_virtuoso=0&#xa;is_output=1&#xa;is_mtb=0&#xa;hasViewer=0&#xa;{&quot;sim_id&quot;:&quot;default&quot;,&quot;sae_session&quot;:&quot;saeSession0&quot;,&quot;sae_session_desc&quot;:&quot;&quot;,&quot;directory&quot;:&quot;/home/wdavis/ece546/run/fpk3/simulation/FreePDK3_examples,inverter_testbench,schematic/history_1/simulation/default/HSPICE/nominal/results&quot;,&quot;results_directory&quot;:&quot;./simulation&quot;,&quot;results_absdirectory&quot;:&quot;/home/wdavis/ece546/run/fpk3/simulation&quot;,&quot;is_mc_multiple_run&quot;:&quot;0&quot;,&quot;test_suite_info&quot;:&quot;FreePDK3_examples:inverter_testbench:schematic&quot;,&quot;history_index&quot;:&quot;-1&quot;,&quot;is_mtb&quot;:&quot;0&quot;,&quot;id&quot;:&quot;1&quot;,&quot;child&quot;:&quot;0&quot;,&quot;description&quot;:&quot;&quot;,&quot;design_str&quot;:&quot;&quot;,&quot;simulator&quot;:&quot;&quot;,&quot;is_initial&quot;:&quot;0&quot;,&quot;is_append_run&quot;:&quot;0&quot;,&quot;isSaeAging&quot;:&quot;0&quot;,&quot;sonoma&quot;:&quot;0&quot;,&quot;sonomaInc&quot;:&quot;0&quot;,&quot;incPartial&quot;:&quot;full&quot;,&quot;rerun&quot;:&quot;0&quot;,&quot;modelIncPath&quot;:&quot;/home/wdavis/ece546/FreePDK3/hspice/models&quot;,&quot;isbreviate_historyname&quot;:&quot;true&quot;,&quot;history_check&quot;:&quot;false&quot;,&quot;ischange_historyname&quot;:&quot;false&quot;,&quot;autoPlot&quot;:&quot;1&quot;,&quot;equation_list&quot;:[{&quot;equa_id&quot;:&quot;equa#0&quot;,&quot;index&quot;:&quot;1&quot;,&quot;equa_name&quot;:&quot;&quot;,&quot;equa_schem&quot;:&quot;&quot;,&quot;type&quot;:&quot;&quot;,&quot;resultType&quot;:&quot;&quot;,&quot;anaName&quot;:&quot;&quot;,&quot;enable&quot;:true,&quot;is_plot&quot;:true,&quot;plotType&quot;:&quot;auto&quot;,&quot;logicRadix&quot;:&quot;auto&quot;,&quot;color&quot;:&quot;&quot;,&quot;units&quot;:&quot;&quot;,&quot;ParamConditions&quot;:&quot;&quot;,&quot;isGlobal&quot;:&quot;true&quot;,&quot;x_axis&quot;:&quot;&quot;,&quot;x_axis_scale&quot;:&quot;auto&quot;,&quot;y_axis_scale&quot;:&quot;auto&quot;,&quot;goal&quot;:&quot;&quot;,&quot;show_in_rv&quot;:&quot;0&quot;,&quot;description&quot;:&quot;&quot;,&quot;saveImage&quot;:&quot;0&quot;,&quot;precision&quot;:&quot;0&quot;,&quot;poor&quot;:&quot;&quot;,&quot;poorHigh&quot;:&quot;&quot;,&quot;poorLow&quot;:&quot;&quot;,&quot;measExpr&quot;:&quot;&quot;,&quot;eqnIdx&quot;:&quot;&quot;}],&quot;probe_list&quot;:[{&quot;probe_id&quot;:&quot;probe#0&quot;,&quot;index&quot;:&quot;2&quot;,&quot;signal_alias&quot;:&quot;&quot;,&quot;signal_name&quot;:&quot;v(/A)&quot;,&quot;signal_type&quot;:&quot;net&quot;,&quot;resultType&quot;:&quot;tran&quot;,&quot;anaName&quot;:&quot;&quot;,&quot;enable&quot;:true,&quot;is_plot&quot;:true,&quot;plotType&quot;:&quot;auto&quot;,&quot;logicRadix&quot;:&quot;auto&quot;,&quot;color&quot;:&quot;255:0:0&quot;,&quot;units&quot;:&quot;&quot;,&quot;ParamConditions&quot;:&quot;&quot;,&quot;isGlobal&quot;:&quot;false&quot;,&quot;x_axis&quot;:&quot;&quot;,&quot;x_axis_scale&quot;:&quot;auto&quot;,&quot;y_axis_scale&quot;:&quot;auto&quot;,&quot;show_in_rv&quot;:&quot;1&quot;,&quot;description&quot;:&quot;&quot;,&quot;saveImage&quot;:&quot;0&quot;,&quot;eqnIdx&quot;:&quot;0.01&quot;,&quot;poor&quot;:&quot;0%&quot;,&quot;poorHigh&quot;:&quot;&quot;,&quot;poorLow&quot;:&quot;&quot;,&quot;goal&quot;:&quot;&quot;,&quot;precision&quot;:&quot;6&quot;},{&quot;probe_id&quot;:&quot;probe#1&quot;,&quot;index&quot;:&quot;3&quot;,&quot;signal_alias&quot;:&quot;&quot;,&quot;signal_name&quot;:&quot;v(/OUT)&quot;,&quot;signal_type&quot;:&quot;net&quot;,&quot;resultType&quot;:&quot;tran&quot;,&quot;anaName&quot;:&quot;&quot;,&quot;enable&quot;:true,&quot;is_plot&quot;:true,&quot;plotType&quot;:&quot;auto&quot;,&quot;logicRadix&quot;:&quot;auto&quot;,&quot;color&quot;:&quot;204:0:255&quot;,&quot;units&quot;:&quot;&quot;,&quot;ParamConditions&quot;:&quot;&quot;,&quot;isGlobal&quot;:&quot;false&quot;,&quot;x_axis&quot;:&quot;&quot;,&quot;x_axis_scale&quot;:&quot;auto&quot;,&quot;y_axis_scale&quot;:&quot;auto&quot;,&quot;show_in_rv&quot;:&quot;1&quot;,&quot;description&quot;:&quot;&quot;,&quot;saveImage&quot;:&quot;0&quot;,&quot;eqnIdx&quot;:&quot;0.02&quot;,&quot;poor&quot;:&quot;0%&quot;,&quot;poorHigh&quot;:&quot;&quot;,&quot;poorLow&quot;:&quot;&quot;,&quot;goal&quot;:&quot;&quot;,&quot;precision&quot;:&quot;6&quot;}],&quot;model_list&quot;:[],&quot;design_variables_list&quot;:[],&quot;analyses_list&quot;:[],&quot;modelGrp_list&quot;:[],&quot;corner_list&quot;:[],&quot;monte_list&quot;:[],&quot;sweep_list&quot;:[],&quot;chart_list&quot;:[]}&#xa;end_original_sim&#xa;original_map&#xa;{&quot;sae_session&quot;:&quot;saeSession0&quot;,&quot;win_id&quot;:&quot;15&quot;,&quot;map_list&quot;:[{&quot;schemName&quot;:&quot;v(/A)&quot;,&quot;waveName&quot;:&quot;v(a)&quot;,&quot;resultID&quot;:&quot;resFile0&quot;,&quot;resultType&quot;:&quot;tran&quot;,&quot;analysisName&quot;:&quot;tran&quot;,&quot;dataType&quot;:&quot;&quot;,&quot;time&quot;:&quot;&quot;,&quot;paramName&quot;:&quot;&quot;,&quot;type&quot;:&quot;anytype&quot;,&quot;display_type&quot;:&quot;analogv&quot;,&quot;paramConditions&quot;:&quot;&quot;,&quot;bits&quot;:&quot;&quot;,&quot;lo&quot;:&quot;0.0&quot;,&quot;hi&quot;:&quot;0.0&quot;,&quot;expr_index&quot;:&quot;2&quot;,&quot;is_expression&quot;:false},{&quot;schemName&quot;:&quot;v(/OUT)&quot;,&quot;waveName&quot;:&quot;v(out)&quot;,&quot;resultID&quot;:&quot;resFile0&quot;,&quot;resultType&quot;:&quot;tran&quot;,&quot;analysisName&quot;:&quot;tran&quot;,&quot;dataType&quot;:&quot;&quot;,&quot;time&quot;:&quot;&quot;,&quot;paramName&quot;:&quot;&quot;,&quot;type&quot;:&quot;anytype&quot;,&quot;display_type&quot;:&quot;analogv&quot;,&quot;paramConditions&quot;:&quot;&quot;,&quot;bits&quot;:&quot;&quot;,&quot;lo&quot;:&quot;0.0&quot;,&quot;hi&quot;:&quot;0.0&quot;,&quot;expr_index&quot;:&quot;3&quot;,&quot;is_expression&quot;:false}],&quot;result_list&quot;:[{&quot;file_name&quot;:&quot;resultsMap.xml&quot;,&quot;resultID&quot;:&quot;resFile0&quot;}]}&#xa;end_original_map&#xa;simulation_end&#xa;"/>
    <attribute name="name" type="giString" value="last"/>
   </object>
  </collection>
  <attribute name="importMeasures" type="giBoolean" value="1"/>
  <attribute name="outputSet" type="giString" value="default"/>
  <collection name="outputSets">
   <object name="outputSets" version="1" type="saOutputSet">
    <collection name="histogramCharts"/>
    <attribute name="name" type="giString" value="default"/>
    <collection name="outputs">
     <object name="outputs" version="1" type="saOutput">
      <attribute name="analyses" type="giString" value=""/>
      <attribute name="description" type="giString" value=""/>
      <attribute name="errorMessage" type="giString" value=""/>
      <attribute name="expr" type="giString" value="v(/A)"/>
      <attribute name="goalExpression" type="giString" value=" None "/>
      <attribute name="hasSpec" type="giBoolean" value="0"/>
      <attribute name="imageTitle" type="giString" value="%e %c %s %m %t"/>
      <collection name="mappedExpressions">
       <object name="mappedExpressions" type="wfExpression">
        <attribute name="analysisName" type="giString" value=""/>
        <attribute name="color" type="giString" value="255:0:0"/>
        <attribute name="enabled" type="giBoolean" value="1"/>
        <attribute name="exprIndex" type="giInt" value="2"/>
        <attribute name="expression" type="giString" value="v(/A)"/>
        <attribute name="global" type="giBoolean" value="0"/>
        <attribute name="isPlotted" type="giBoolean" value="0"/>
        <attribute name="logicRadix" type="enLogicRadixType" value="auto"/>
        <attribute name="modifier" type="giString" value=""/>
        <attribute name="name" type="giString" value=""/>
        <attribute name="params" type="giString" value=""/>
        <attribute name="plot" type="giBoolean" value="1"/>
        <attribute name="plotType" type="enGraphType" value="auto"/>
        <attribute name="resultType" type="giString" value="tran"/>
        <attribute name="type" type="enOutputType" value="net"/>
        <attribute name="units" type="giString" value=""/>
        <collection name="values"/>
       </object>
      </collection>
      <attribute name="name" type="giString" value=""/>
      <attribute name="outputType" type="enOutputType" value="net"/>
      <attribute name="plot" type="giBoolean" value="1"/>
      <attribute name="plotType" type="enGraphType" value="auto"/>
      <attribute name="precision" type="giInt" value="6"/>
      <attribute name="probe" type="giString" value="plotpacket0"/>
      <attribute name="resultsViewer" type="giBoolean" value="1"/>
      <attribute name="save" type="giBoolean" value="1"/>
      <attribute name="saveImage" type="giBoolean" value="0"/>
      <collection name="specs">
       <object name="specs" version="1" type="saSpecification">
        <attribute name="analysis" type="giString" value=""/>
        <attribute name="enabled" type="giBoolean" value="1"/>
        <attribute name="extGoalType" type="enGoalType" value="Greater Than"/>
        <attribute name="goal" type="giString" value=""/>
        <attribute name="goalHigh" type="giString" value=""/>
        <attribute name="goalLow" type="giString" value=""/>
        <attribute name="goalType" type="enGoalType" value="Greater Than"/>
        <attribute name="poor" type="giString" value="0%"/>
        <attribute name="poorHigh" type="giString" value="0%"/>
        <attribute name="poorLow" type="giString" value="0%"/>
       </object>
      </collection>
      <attribute name="suffix" type="giString" value=""/>
      <attribute name="units" type="giString" value=""/>
     </object>
     <object name="outputs" version="1" type="saOutput">
      <attribute name="analyses" type="giString" value=""/>
      <attribute name="description" type="giString" value=""/>
      <attribute name="errorMessage" type="giString" value=""/>
      <attribute name="expr" type="giString" value="v(/OUT)"/>
      <attribute name="goalExpression" type="giString" value=" None "/>
      <attribute name="hasSpec" type="giBoolean" value="0"/>
      <attribute name="imageTitle" type="giString" value="%e %c %s %m %t"/>
      <collection name="mappedExpressions">
       <object name="mappedExpressions" type="wfExpression">
        <attribute name="analysisName" type="giString" value=""/>
        <attribute name="color" type="giString" value="204:0:255"/>
        <attribute name="enabled" type="giBoolean" value="1"/>
        <attribute name="exprIndex" type="giInt" value="3"/>
        <attribute name="expression" type="giString" value="v(/OUT)"/>
        <attribute name="global" type="giBoolean" value="0"/>
        <attribute name="isPlotted" type="giBoolean" value="0"/>
        <attribute name="logicRadix" type="enLogicRadixType" value="auto"/>
        <attribute name="modifier" type="giString" value=""/>
        <attribute name="name" type="giString" value=""/>
        <attribute name="params" type="giString" value=""/>
        <attribute name="plot" type="giBoolean" value="1"/>
        <attribute name="plotType" type="enGraphType" value="auto"/>
        <attribute name="resultType" type="giString" value="tran"/>
        <attribute name="type" type="enOutputType" value="net"/>
        <attribute name="units" type="giString" value=""/>
        <collection name="values"/>
       </object>
      </collection>
      <attribute name="name" type="giString" value=""/>
      <attribute name="outputType" type="enOutputType" value="net"/>
      <attribute name="plot" type="giBoolean" value="1"/>
      <attribute name="plotType" type="enGraphType" value="auto"/>
      <attribute name="precision" type="giInt" value="6"/>
      <attribute name="probe" type="giString" value="plotpacket1"/>
      <attribute name="resultsViewer" type="giBoolean" value="1"/>
      <attribute name="save" type="giBoolean" value="1"/>
      <attribute name="saveImage" type="giBoolean" value="0"/>
      <collection name="specs">
       <object name="specs" version="1" type="saSpecification">
        <attribute name="analysis" type="giString" value=""/>
        <attribute name="enabled" type="giBoolean" value="1"/>
        <attribute name="extGoalType" type="enGoalType" value="Greater Than"/>
        <attribute name="goal" type="giString" value=""/>
        <attribute name="goalHigh" type="giString" value=""/>
        <attribute name="goalLow" type="giString" value=""/>
        <attribute name="goalType" type="enGoalType" value="Greater Than"/>
        <attribute name="poor" type="giString" value="0%"/>
        <attribute name="poorHigh" type="giString" value="0%"/>
        <attribute name="poorLow" type="giString" value="0%"/>
       </object>
      </collection>
      <attribute name="suffix" type="giString" value=""/>
      <attribute name="units" type="giString" value=""/>
     </object>
    </collection>
    <collection name="qqCharts"/>
    <attribute name="reductionString" type="giString" value=""/>
    <collection name="scatterCharts"/>
   </object>
  </collection>
  <attribute name="plotMode" type="giString" value="replace"/>
 </object>
</file-format>


================================================
FILE: examples/FreePDK3_examples/inverter_testbench/HSPICE_default/saeState.file
================================================


================================================
FILE: examples/FreePDK3_examples/inverter_testbench/HSPICE_default/state.xml
================================================
<?xml version="1.0"?>
<!--Created by Custom Compiler (TM), build , on Tue Jul  6 17:25:21 2021-->
<file-format name="stateData" version="1.0">
 <attribute name="description" type="giString" value=""/>
 <attribute name="design" type="dmCellView" value="FreePDK3_examples/inverter_testbench/schematic"/>
 <attribute name="enabled" type="giBoolean" value="1"/>
 <attribute name="name" type="giString" value="HSPICE_default"/>
 <attribute name="openaccessState" type="dmCellView" value="FreePDK3_examples/inverter_testbench/HSPICE_default"/>
 <attribute name="simulator" type="giString" value="HSPICE"/>
 <comment></comment>
 <resultsDir>./simulation</resultsDir>
 <integration version="1"/>
</file-format>


================================================
FILE: examples/FreePDK3_examples/inverter_testbench/schematic/master.tag
================================================
-- Master.tag File, Rev:1.0
sch.oa


================================================
FILE: examples/FreePDK3_examples/lvs_nmos/layout/master.tag
================================================
-- Master.tag File, Rev:1.0
layout.oa


================================================
FILE: examples/FreePDK3_examples/lvs_nmos/schematic/master.tag
================================================
-- Master.tag File, Rev:1.0
sch.oa


================================================
FILE: examples/FreePDK3_examples/lvs_pmos/layout/master.tag
================================================
-- Master.tag File, Rev:1.0
layout.oa


================================================
FILE: examples/FreePDK3_examples/lvs_pmos/schematic/master.tag
================================================
-- Master.tag File, Rev:1.0
sch.oa


================================================
FILE: examples/FreePDK3_examples/nand/layout/master.tag
================================================
-- Master.tag File, Rev:1.0
layout.oa


================================================
FILE: examples/FreePDK3_examples/nand/schematic/master.tag
================================================
-- Master.tag File, Rev:1.0
sch.oa


================================================
FILE: examples/FreePDK3_examples/nand/symbol/master.tag
================================================
-- Master.tag File, Rev:1.0
symbol.oa


================================================
FILE: examples/FreePDK3_examples/nor/layout/master.tag
================================================
-- Master.tag File, Rev:1.0
layout.oa


================================================
FILE: examples/FreePDK3_examples/nor/schematic/master.tag
================================================
-- Master.tag File, Rev:1.0
sch.oa


================================================
FILE: examples/FreePDK3_examples/or/layout/master.tag
================================================
-- Master.tag File, Rev:1.0
layout.oa


================================================
FILE: examples/FreePDK3_examples/or/schematic/master.tag
================================================
-- Master.tag File, Rev:1.0
sch.oa


================================================
FILE: examples/FreePDK3_examples/or/symbol/master.tag
================================================
-- Master.tag File, Rev:1.0
symbol.oa


================================================
FILE: examples/FreePDK3_examples/xor/layout/master.tag
================================================
-- Master.tag File, Rev:1.0
layout.oa

================================================
FILE: examples/FreePDK3_examples/xor/schematic/master.tag
================================================
-- Master.tag File, Rev:1.0
sch.oa


================================================
FILE: examples/FreePDK3_examples/xor_double/layout/master.tag
================================================
-- Master.tag File, Rev:1.0
layout.oa

================================================
FILE: examples/FreePDK3_examples/xor_double/schematic/master.tag
================================================
-- Master.tag File, Rev:1.0
sch.oa

================================================
FILE: hspice/models/fet.mod
================================================
* FreePDK3 HSPICE Models
*
* Copyright (c) 2021, North Carolina State University
* All Rights Reserved.
*
* Please see the file LICENSE included with this distribution for license.
* You may not use these files except in compliance with the License.
*
***
*
* created 2021-06-07 by W. Shepherd Pitts
* with Mystic version R-2020.09 and hspice version vQ-2020.03-SP2
*


.lib nfet_typ
.model nfet nmos
+L=1.5e-08
+DEVTYPE=1
+EASUB=4.0727
+NI0SUB=1.1055e+16
+BG0SUB=1.1242
+NC0SUB=2.9951e+25
+phig=4.20331
+RDSW=50
+RDSWMIN=50
+cdscd=0.0848377
+vsat=171625
+ua=7.64261e-44
+pdibl2=0.100167
+PCLM=1e-10
+PCLMG=0
+level=72
+VERSION=108
+BULKMOD=0
+CAPMOD=1
+IGCMOD=0
+IGBMOD=0
+GIDLMOD=0
+COREMOD=0
+GEOMOD=2
+CGEOMOD=0
+IIMOD=0
+RDSMOD=0
+TNOM=25
+XL=0
+LINT=0
+LL=0
+LLC=0
+LLN=1
+DLC=0
+EOT=6e-10
+tfin=2.1e-08
+hfin=5e-09
+FPITCH=3e-08
+FECH=1
+NF=1
+NFIN=1
+NBODY=2e+24
+nsd=4e+26
+NGATE=0
+LPHIG=0
+LRDSW=0
+ARDSW=0
+BRDSW=1e-08
+PRWG=0
+CIT=0
+cdsc=0.259764
+LCDSC=0
+LCDSCD=0
+DVT0=0
+LDVT0=0
+DVT1=0.7
+LDVT1=0
+PHIN=0
+LPHIN=0
+eta0=0
+LETA0=0
+DSUB=1.06
+LDSUB=0
+K1RSCE=0
+LK1RSCE=0
+LPE0=0
+LLPE0=0
+QMFACTOR=1
+qm0=0.183201
+LVSAT=0
+AVSAT=0
+BVSAT=6e-08
+AVSAT1=0
+BVSAT1=6e-08
+ksativ=0.686606
+LKSATIV=0
+DELTAVSAT=1
+mexp=2.27912
+LMEXP=0
+AMEXP=0
+BMEXP=1
+PTWG=0
+LPTWG=0
+APTWG=0
+BPTWG=6e-08
+u0=0.10408
+LU0=0
+etamob=0.603037
+UP=0
+LUP=0
+LPA=1
+LUA=0
+AUA=0
+BUA=6e-08
+eu=2.67223
+LEU=0
+ud=0.852325
+LUD=0
+AUD=0
+BUD=5e-08
+ucs=4.60156
+LUCS=0
+PDIBL1=1e-09
+LPDIBL1=0
+LPDIBL2=0
+DROUT=1.06
+LDROUT=0
+pvag=7.72289
+LPVAG=0
+LPCLM=0
+CFS=0
+cgsl=2.97032e-11
+dvtp0=0.0413392
+dvtp1=1
+cgso=1.29723e-10
+cgdo=1.29723e-10
+cgdl=2.97032e-11
+ckappas=2.54301
+deltawcv=-1.29e-08
+qmtcencv=0.933868
+ckappad=2.54301
*+ PHIG = 4
*+ EOT = 0.5E-9
*+ TFIN=15.0e-09
*+ HFIN=35.0e-09
*+ NBODY=2e23
*+ NSD=1e26
.endl nfet_typ

.lib pfet_typ
.model pfet pmos
+L=1.5e-08
+DEVTYPE=0
+EASUB=4.1312
+NI0SUB=4.3638e+16
+BG0SUB=1.0379
+NC0SUB=2.0734e+25
+phig=4.95287
+RDSW=30
+RDSWMIN=30
+cdscd=9.25471e-19
+vsat=124579
+ua=0.971815
+pdibl2=0.0323113
+PCLM=1e-09
+PCLMG=0.1
+CHARGEWF=0
+level=72
+VERSION=108
+BULKMOD=0
+CAPMOD=1
+IGCMOD=0
+IGBMOD=0
+GIDLMOD=0
+COREMOD=0
+GEOMOD=2
+CGEOMOD=0
+IIMOD=0
+RDSMOD=0
+TNOM=25
+XL=0
+LINT=0
+LL=0
+LLC=0
+LLN=1
+DLC=0
+EOT=6e-10
+tfin=2.1e-08
+hfin=5e-09
+FPITCH=3e-08
+FECH=1
+NF=1
+NFIN=1
+NBODY=2e+24
+nsd=4e+26
+NGATE=0
+LPHIG=0
+LRDSW=0
+ARDSW=0
+BRDSW=1e-08
+PRWG=0
+CIT=0
+cdsc=0.302194
+LCDSC=0
+LCDSCD=0
+DVT0=0
+LDVT0=0
+DVT1=0.7
+LDVT1=0
+PHIN=0
+LPHIN=0
+eta0=0
+LETA0=0
+DSUB=1.06
+LDSUB=0
+K1RSCE=0
+LK1RSCE=0
+LPE0=0
+LLPE0=0
+QMFACTOR=1
+qm0=1.3303
+LVSAT=0
+AVSAT=0
+BVSAT=6e-08
+AVSAT1=0
+BVSAT1=6e-08
+ksativ=0.287155
+LKSATIV=0
+DELTAVSAT=1
+mexp=2.38307
+LMEXP=0
+AMEXP=0
+BMEXP=1
+PTWG=0
+LPTWG=0
+APTWG=0
+BPTWG=6e-08
+u0=0.010376
+LU0=0
+etamob=2.88968
+UP=0
+LUP=0
+LPA=1
+LUA=0
+AUA=0
+BUA=6e-08
+eu=1.10349
+LEU=0
+ud=0.00839155
+LUD=0
+AUD=0
+BUD=5e-08
+ucs=5.15424e-23
+LUCS=0
+PDIBL1=1e-09
+LPDIBL1=0
+LPDIBL2=0
+DROUT=1.06
+LDROUT=0
+pvag=0.302124
+LPVAG=0
+LPCLM=0
+CFS=0
+cgsl=1.78811e-10
+dvtp0=-0.0132114
+dvtp1=1
+cgso=2.35129e-19
+cgdo=2.35129e-19
+cgdl=1.78811e-10
+ckappas=0.823716
+deltawcv=2.49198e-08
+qmtcencv=0.138682
+ckappad=0.823716
*+ PHIG = 4.71037658684
*+ EOT = 0.5E-9
*+ TFIN=15.0e-09
*+ HFIN=35.0e-09
*+ NBODY=2e23
*+ NSD=1e26
.endl pfet_typ



================================================
FILE: icv/FreePDK3_main.drc.rs
================================================
// 3nm FreePDK(TM) ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.



#define SELECTABLE_VIOLATION_NAMES
#define ICV_ENABLE_WIDE_ANGLED
#include <icv.rh>
#include "string.rh"

error_options( 
error_limit_per_check   = 
#if d_ENV_ERROR_LIMITATION == dx_UNLIMITED
ERROR_LIMIT_UNLIMITED
#else
1000
#endif
,report_empty_violations = true
);

//FreePDK3 Variables
	ANTENNA_RATIO = 50;
//FreePDK3 Variables

//FreePDK3 Functions
	out_color1 : string = "color1_out";
	out_color2 : string = "color1_out";

	color_balance_func_M : function (void) returning void
	{
		_den_con_1 = < 0.230;
		_den_con_2 = > 0.770;
		areaL1 = den_polygon_area("out_color1", clip = false);   
		areaL2 = den_polygon_area("out_color2", clip = false);
		ratio = areaL1 / (areaL1 + areaL2);
		if ( (double_constraint_overlap(_den_con_1, ratio) ||  double_constraint_overlap(_den_con_2, ratio)) && !isinf(ratio) && !isnan(ratio) && dblne(ratio, 100.00) && dblne(ratio, 0.0)) {
				den_save_window(
								error_names = { "ratio", "areaL1", "areaL2" },
								values      = { ratio, areaL1, areaL2 }
				);
		}
	}

//FreePDK3 Functions

// Assign layer section
aBPR                   = assign({ {0, 0} });
aVBPR                  = assign({ {1, 0} });
aNW                    = assign({ {2, 0} });
aACT                   = assign({ {3, 0} });
aGATE                  = assign({ {4, 0} });
aGCUT                  = assign({ {5, 0} });
aDUMMY                 = assign({ {6, 0} });
aNIM                   = assign({ {7, 0} });
aPIM                   = assign({ {8, 0} });
aM0A                   = assign({ {9, 0} });
aV0A                   = assign({ {10, 0} });
aGCON                  = assign({ {11, 0} });
aM0B                   = assign({ {12, 0} });
aV0B                   = assign({ {13, 0} });
aM1                    = assign({ {14, 0} });
aM1_color1             = assign({ {14, 11}});
aM1_color2             = assign({ {14, 12}});
aV1                    = assign({ {15, 0} });
aM2                    = assign({ {16, 0} });
aM2_color1             = assign({ {16, 11}});
aM2_color2             = assign({ {16, 12}});
aV2                    = assign({ {17, 0} });
aM3                    = assign({ {18, 0} });
aM3_color1             = assign({ {18, 11}});
aM3_color2             = assign({ {18, 12}});
aV3                    = assign({ {19, 0} });
aM4                    = assign({ {20, 0} });
aV4                    = assign({ {21, 0} });
aM5                    = assign({ {22, 0} });
aV5                    = assign({ {23, 0} });
aM6                    = assign({ {24, 0} });
aV6                    = assign({ {25, 0} });
aM7                    = assign({ {26, 0} });
aM7_color1             = assign({ {26, 11}});
aM7_color2             = assign({ {26, 12}});
aV7                    = assign({ {27, 0} });
aM8                    = assign({ {28, 0} });
aM8_color1             = assign({ {28, 11}});
aM8_color2             = assign({ {28, 12}});
aV8                    = assign({ {29, 0} });
aM9                    = assign({ {30, 0} });
aM9_color1             = assign({ {30, 11}});
aM9_color2             = assign({ {30, 12}});
aV9                    = assign({ {31, 0} });
aM10                   = assign({ {32, 0} });
aV10                   = assign({ {33, 0} });
aM11                   = assign({ {34, 0} });
aV11                   = assign({ {35, 0} });
aM12                   = assign({ {36, 0} });
aV12                   = assign({ {37, 0} });
aM13                   = assign({ {38, 0} });
aVRDL                  = assign({ {39, 0} });
aRDL                   = assign({ {40, 0} });



//connection database


//cdb_v0a = connect(connect_items = {{{aV0A, aM0A, aM0B}}});
//cdb_gcon = connect(connect_items = {{{aGCON, aGATE}}});
//cdb_gate = connect (connect_items = {{{aGATE, aACT}}});

CONNECT_DB : connect_database = NULL_CONNECT_DATABASE;

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ aBPR, aM0A }, aVBPR, NONE, SHIELDED_OVERLAP }} );

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ aM0A, aM0B }, aV0A, NONE, SHIELDED_OVERLAP }} );

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ aM0B, aM1 }, aV0B, NONE, SHIELDED_OVERLAP }} );

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ aM1, aM2 }, aV1, NONE, SHIELDED_OVERLAP }} );

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ aM2, aM3 }, aV2, NONE, SHIELDED_OVERLAP }} );

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ aM3, aM4 }, aV3, NONE, SHIELDED_OVERLAP }} );

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ aM4, aM5 }, aV4, NONE, SHIELDED_OVERLAP }} );

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ aM5, aM6 }, aV5, NONE, SHIELDED_OVERLAP }} );

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ aM6, aM7 }, aV6, NONE, SHIELDED_OVERLAP }} );

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ aM7, aM8 }, aV7, NONE, SHIELDED_OVERLAP }} );

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ aM8, aM9 }, aV8, NONE, SHIELDED_OVERLAP }} );

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ aM9, aM10 }, aV9, NONE, SHIELDED_OVERLAP }} );

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ aM10, aM11 }, aV10, NONE, SHIELDED_OVERLAP }} );

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ aM11, aM12 }, aV11, NONE, SHIELDED_OVERLAP }} );

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ aM12, aM13 }, aV12, NONE, SHIELDED_OVERLAP }} );

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ aM13, aRDL }, aVRDL, NONE, SHIELDED_OVERLAP }} );

gPOLY = ( ( aGATE ) ) not aGCUT;
gCHANNEL = gPOLY and aACT;
gN_GATE = gCHANNEL and aNIM; 
gP_GATE = gCHANNEL and aPIM;

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ gPOLY, aM0B }, aGCON, NONE, SHIELDED_OVERLAP }} ); 

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ gPOLY, aACT }}} ); 

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ aGATE, aGCON }}} );

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ gN_GATE, aGCON }}} );

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ gP_GATE, aGCON }}} );

gP_GATE_or_gN_GATE = gP_GATE or gN_GATE;

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ gP_GATE_or_gN_GATE , aGCON }}} );



#include "Include/FreePDK3.bpr.drc.rs"
#include "Include/FreePDK3.nimpim.drc.rs" 
#include "Include/FreePDK3.act.drc.rs"
#include "Include/FreePDK3.gcut.drc.rs"
#include "Include/FreePDK3.nw.drc.rs"
#include "Include/FreePDK3.vbpr.drc.rs"
#include "Include/FreePDK3.gcon.drc.rs"
#include "Include/FreePDK3.v0a.drc.rs" 
#include "Include/FreePDK3.v0b.drc.rs"
#include "Include/FreePDK3.m0a.drc.rs"
#include "Include/FreePDK3.m0b.drc.rs"
#include "Include/FreePDK3.gate.drc.rs"
#include "Include/FreePDK3.dummy.drc.rs"
#include "Include/FreePDK3.m1.drc.rs"
#include "Include/FreePDK3.v1.drc.rs"
#include "Include/FreePDK3.m2.drc.rs"
#include "Include/FreePDK3.v2.drc.rs"
#include "Include/FreePDK3.m3.drc.rs"
#include "Include/FreePDK3.v3.drc.rs"
#include "Include/FreePDK3.m4.drc.rs"
#include "Include/FreePDK3.v4.drc.rs"
#include "Include/FreePDK3.m5.drc.rs"
#include "Include/FreePDK3.v5.drc.rs"
#include "Include/FreePDK3.m6.drc.rs"
#include "Include/FreePDK3.v6.drc.rs"
#include "Include/FreePDK3.m7.drc.rs"
#include "Include/FreePDK3.v7.drc.rs"
#include "Include/FreePDK3.m8.drc.rs"
#include "Include/FreePDK3.v8.drc.rs"
#include "Include/FreePDK3.m9.drc.rs"
#include "Include/FreePDK3.v9.drc.rs"
#include "Include/FreePDK3.m10.drc.rs"
#include "Include/FreePDK3.v10.drc.rs"
#include "Include/FreePDK3.m11.drc.rs"
#include "Include/FreePDK3.v11.drc.rs"
#include "Include/FreePDK3.m12.drc.rs"
#include "Include/FreePDK3.v12.drc.rs"
#include "Include/FreePDK3.m13.drc.rs"
#include "Include/FreePDK3.vrdl.drc.rs"
#include "Include/FreePDK3.rdl.drc.rs"
#include "Include/FreePDK3.antenna.drc.rs"


================================================
FILE: icv/FreePDK3_main.lvs.rs
================================================
// 3nm FreePDK(TM) ICV LVS Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.


#define ICV_ENABLE_LVS_SEN_EXCLUDE_TOLERANCE
#include <icv.rh>

#ifdef VERSION_LT
#if VERSION_LT(2020, 9, 0, 0)
#error This PXL runset was generated to run with ICV version 2020.09 and newer.
#endif
#endif

#ifdef OVERRIDE_FILE
#include "override_file.rs"
#endif

layout_case_sensitive : boolean = false;
layout_preserve_case : boolean = false;
run_options_uppercase : boolean = !layout_case_sensitive && !layout_preserve_case;


//vFIN_HEIGHT : const double = 30e-9;

vFIN_WIDTH : const double = 8e-9;

//vFIN_SEPARATION : const double = 40e-9;

vWFIN_D : const double = 8e-9;

vWFIN_S : const double = 8e-9;

CONNECT_DB : connect_database = NULL_CONNECT_DATABASE;
soft_connect_layers : list of soft_connect_item_s = { };
abort_on_softchk : boolean = false;
infinity : const double = 1.0 / 0.0;

cal_text_layer_item_h : newtype hash of string to text_layer_item_s;
cal_text_layer_items_h : newtype hash of string to list of text_layer_item_s;

attach_text_net_items : cal_text_layer_items_h = {};
connect_text_net_items : cal_text_layer_item_h = {};
presort_text_net_items : list of text_layer_item_s = {};
merge_open_net_names_items : list of string = { "" };

user_functions_path : string = "FreePDK3_main.lvs.rs.user_functions"; 
vLVS_POWER_NAMES : list of string = { "VDD", "vdd", "vdd!", "VDD!" };
vLVS_GROUND_NAMES : list of string = { "VSS", "GND!", "gnd!", "vss" };

/* Begin of Equation Code-Based Functions definitions */

collect_text_net_items : published function (
    attach_items : cal_text_layer_items_h,
    connect_items : cal_text_layer_item_h,
    presort_items : list of text_layer_item_s
)

returning text_net_items : list of text_layer_item_s
{
    /* Initialize the output list. */
    text_net_items = {};

    /* Append the ATTACH-based items. */
    foreach (text_layer_items in attach_items.values()) {
        foreach (text_layer_item in text_layer_items) {
            text_net_items.push_back(text_layer_item);
        }
    }

    /* Append the CONNECT-based items which are not already present
     * because of an ATTACH.
     */
    foreach (text_layer_str in connect_items.keys()) {
        if (!attach_items.contains_key(text_layer_str)) {
            text_net_items.push_back(connect_items[text_layer_str]);
        }
    }

    /* Append the TEXT-based items. */
    foreach (text_layer_item in presort_items) {
        text_net_items.push_back(text_layer_item);
    }
}

/* End of Equation Code-Based Functions definitions */

/* Begin of Common Device Functions definitions */                                   //Needs to be determined
dev_func_MY_FET_PROPERTIES : function (void) returning void
{
    vADEJ   : double;
    vASEJ   : double;
    vL      : double;
    vLFIN_D : double;
    vLFIN_S : double;
    vNFIN   : double;
    vPDEJ   : double;
    vPSEJ   : double;
    vW      : double;

    vGATE = dev_recognition_layer();
    vS = dev_pin("SRC");
    vD = dev_pin("DRN");

    vL = ( ( dev_polygon_perim ( vGATE ) - dev_touch_length ( vGATE , vS ) - dev_touch_length ( vGATE , vD ) ) * 0.5 );
    vW = ( ( dev_touch_length ( vGATE , vS ) + dev_touch_length ( vGATE , vD ) ) * 0.5 );
    vNFIN = 1;
    vLFIN_D = ( ( dev_polygon_perim ( vD ) - ( 2 * dev_touch_length ( vGATE , vD ) ) ) * 0.5 );
    vLFIN_S = ( ( dev_polygon_perim ( vS ) - ( 2 * dev_touch_length ( vGATE , vS ) ) ) * 0.5 );
    vADEJ = ( vNFIN * vWFIN_D * vLFIN_D );
    vASEJ = ( vNFIN * vWFIN_S * vLFIN_S );
    vPDEJ = ( ( 2 * vLFIN_D * vNFIN ) + ( vWFIN_D * vNFIN ) );
    vPSEJ = ( ( 2 * vLFIN_S * vNFIN ) + ( vWFIN_S * vNFIN ) );
    if ( dblcmp( vLFIN_D, vLFIN_S, DBL_GT ) ) {
        vLFIN_D = ( vLFIN_D * 0.5 );
        vADEJ = ( vNFIN * vWFIN_D * vLFIN_D );
        vPDEJ = ( 2 * vLFIN_D * vNFIN );
    }
    if ( dblcmp( vLFIN_S, vLFIN_D, DBL_GT ) ) {
        vLFIN_S = ( vLFIN_S * 0.5 );
        vASEJ = ( vNFIN * vWFIN_S * vLFIN_S );
        vPSEJ = ( 2 * vLFIN_S * vNFIN );
    }


    dev_save_double_properties({
        { "W", vW },
        { "L", vL },
        { "nfin", vNFIN },
        { "ADEJ", vADEJ },
        { "ASEJ", vASEJ },
        { "PDEJ", vPDEJ },
        { "PSEJ", vPSEJ }
    });
}
/* End of Common Device Functions definitions */

library(
    cell         = "cell",
    format       = GDSII,
    library_name = "inlib"
);

schematic_db = schematic(
    schematic_file = {{"sch", SPICE}}
);

run_options(
    lvs_netlist_flow = SPICE,
    lvs_user_unit    = METER,
    uppercase        = run_options_uppercase
);

compatibility_options(
    drc = { { orphan_edge_membership = NONE } }
);

error_options(
    error_limit_per_check   = 1000,
    report_empty_violations = true
);

gds_options(
    duplicate_cell = DROP
);

resolution_options(
    drc_angle_precision  = 0.0,
    drc_length_precision = 0.0,
    internal_resolution  = 0.0005,
    spacing_tolerance    = 0.0
);

layout_drawn_options(
    self_intersect_action = FILL
);

layout_grid_options(
    check_45 = {},
    check_90 = {}
);

text_options(
    allow_all_numeric             = true,
    colon_text                    = REGULAR_TEXT,
    layout_ground                 = vLVS_GROUND_NAMES,
    layout_power                  = vLVS_POWER_NAMES,
    replace_text_characters_regex = { { { { search_string = "[\\s\\*\"={},]", replace_string = "_" } } } },
    semicolon_text                = REGULAR_TEXT
);

net_options(
    schematic_ground = vLVS_GROUND_NAMES,
    schematic_power  = vLVS_POWER_NAMES
);

lvs_options(
    spice_multiplier_names = { "M" }
);

////////////////////////////////////////////////////////////////////////////////////
//
//    3nm Free PDK  Rules
//
////////////////////////////////////////////////////////////////////////////////////

//assigning layer numbers for wire, text, via
aBPR		= assign({ { 0 } });
tBPR		= assign_text({ { 0 } });
aVBPR		= assign({ { 1 } });
aNW			= assign({ { 2 } });
aACT		= assign({ { 3 } });
aGATE		= assign({ { 4 } });
aGCUT      	= assign({ { 5 } });
aDUMMY		= assign({ { 6 } });
aNIM       	= assign({ { 7 } });
aPIM       	= assign({ { 8 } });
aM0A       	= assign({ { 9 } });
tM0A		= assign_text({ { 9 } });
aV0A       	= assign({ { 10 } });
aGCON      	= assign({ { 11 } });
aM0B       	= assign({ { 12 } });
tM0B		= assign_text({ { 12 } });
aV0B       	= assign({ { 13 } });
aM1        	= assign({ { 14 } });
tM1		    = assign_text({ { 14 } });
aV1			= assign({ { 15 } });
aM2			= assign({ { 16 } });
tM2		    = assign_text({ { 16 } });
aV2         = assign({ { 17 } });
aM3         = assign({ { 18 } }); 
tM3         = assign_text({ { 18 } }); 
aV3         = assign({ { 19 } }); 
aM4         = assign({ { 20 } }); 
tM4         = assign_text({ { 20 } }); 
aV4         = assign({ { 21 } }); 
aM5         = assign({ { 22 } }); 
tM5         = assign_text({ { 22 } }); 
aV5         = assign({ { 23 } }); 
aM6         = assign({ { 24 } }); 
tM6         = assign_text({ { 24 } }); 
aV6         = assign({ { 25 } }); 
aM7         = assign({ { 26 } }); 
tM7         = assign_text({ { 26 } }); 
aV7         = assign({ { 27 } }); 
aM8         = assign({ { 28 } }); 
tM8         = assign_text({ { 28 } }); 
aV8         = assign({ { 29 } }); 
aM9         = assign({ { 30 } }); 
tM9         = assign_text({ { 30 } }); 
aV9         = assign({ { 31 } }); 
aM10        = assign({ { 32 } }); 
tM10        = assign_text({ { 32 } }); 
aV10        = assign({ { 33 } }); 
aM11        = assign({ { 34 } }); 
tM11        = assign_text({ { 34 } }); 
aV11        = assign({ { 35 } }); 
aM12        = assign({ { 36 } }); 
tM12        = assign_text({ { 36 } }); 
aV12        = assign({ { 37 } }); 
aM13        = assign({ { 38 } }); 
tM13        = assign_text({ { 38 } }); 
aVRDL       = assign({ { 39 } }); 
aRDL       = assign({ { 40 } }); 
tRDL       = assign_text({ { 40 } }); 



//linking text to metal in that layer
//connect_text_net_items["<text layer name>"] = { <assigned layer>, <text layer> }; //used to attach text layer to assigned layer
connect_text_net_items["tBPR"] = { aBPR, tBPR };
connect_text_net_items["tM0A"] = { aM0A, tM0A };
connect_text_net_items["tM0B"] = { aM0B, tM0B };
connect_text_net_items["tM1"] = { aM1, tM1 };
connect_text_net_items["tM2"] = { aM2, tM2 };
connect_text_net_items["tM3"] = { aM3, tM3 };
connect_text_net_items["tM4"] = { aM4, tM4 };
connect_text_net_items["tM5"] = { aM5, tM5 };
connect_text_net_items["tM6"] = { aM6, tM6 };
connect_text_net_items["tM7"] = { aM7, tM7 };
connect_text_net_items["tM8"] = { aM8, tM8 };
connect_text_net_items["tM9"] = { aM9, tM9 };
connect_text_net_items["tM10"] = { aM10, tM10 };
connect_text_net_items["tM11"] = { aM11, tM11 };
connect_text_net_items["tM12"] = { aM12, tM12 };
connect_text_net_items["tM13"] = { aM13, tM13 };
connect_text_net_items["tRDL"] = { aRDL, tRDL };



//connecting layers with vias
CONNECT_DB = incremental_connect( CONNECT_DB, {{{ aBPR, aM0A }, aVBPR, NONE, SHIELDED_OVERLAP }} );

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ aM0A, aM0B }, aV0A, NONE, SHIELDED_OVERLAP }} );

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ aM0B, aM1 }, aV0B, NONE, SHIELDED_OVERLAP }} );

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ aM1, aM2 }, aV1, NONE, SHIELDED_OVERLAP }} );

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ aM2, aM3 }, aV2, NONE, SHIELDED_OVERLAP }} );

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ aM3, aM4 }, aV3, NONE, SHIELDED_OVERLAP }} );

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ aM4, aM5 }, aV4, NONE, SHIELDED_OVERLAP }} );

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ aM5, aM6 }, aV5, NONE, SHIELDED_OVERLAP }} );

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ aM6, aM7 }, aV6, NONE, SHIELDED_OVERLAP }} );

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ aM7, aM8 }, aV7, NONE, SHIELDED_OVERLAP }} );

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ aM8, aM9 }, aV8, NONE, SHIELDED_OVERLAP }} );

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ aM9, aM10 }, aV9, NONE, SHIELDED_OVERLAP }} );

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ aM10, aM11 }, aV10, NONE, SHIELDED_OVERLAP }} );

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ aM11, aM12 }, aV11, NONE, SHIELDED_OVERLAP }} );

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ aM12, aM13 }, aV12, NONE, SHIELDED_OVERLAP }} );

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ aM13, aRDL }, aVRDL, NONE, SHIELDED_OVERLAP }} );



// gPOLY_temp = ( ( aGATE ) ) not aGCUT;
gPOLY = (( ( aGATE ) ) not aGCUT) not aDUMMY; // excluding poly area overlapped by DUMMY layer

CONNECT_DB = incremental_connect( CONNECT_DB, {{{ gPOLY, aM0B }, aGCON, NONE, SHIELDED_OVERLAP }} ); 

text_net_items = collect_text_net_items( attach_text_net_items, connect_text_net_items, presort_text_net_items );
if (!text_net_items.empty()) {
    CONNECT_DB = text_net( CONNECT_DB, text_layer_items = text_net_items, use_text = TOP, attach_text = ALL, opens = MERGE_CONNECTED_AND_TOP, merge_open_net_names = merge_open_net_names_items, rename_open_nets = KEEP_ONE );
}

//gPOLY = ( ( aGATE ) ) not aGCUT;

//soft_connect_layers.push_back( { aDUMMY, { gPOLY } } ); 

gBULK = cell_extent( cell_list = { "*" }, exclude_text_layers = false, extent_layers = USED_ASSIGN_LAYERS );

gPWELL = gBULK not aNW;

gN_ACTIVE_AREA = gPWELL and aACT;

gN_FIN_AREA = gN_ACTIVE_AREA and aNIM;

gNGATE1 = gN_FIN_AREA and gPOLY;

// gNFINS_temp = gN_FIN_AREA not gNGATE1;

gNFINS = (gN_FIN_AREA not gNGATE1) not aDUMMY; // excluding fin area overlapped by DUMMY layer

soft_connect_layers.push_back( { aM0A, { gNFINS } } );

gNWELL = gBULK and aNW;

gP_ACTIVE_AREA = gNWELL and aACT;//changed from M0A to ACT

gP_FIN_AREA = gP_ACTIVE_AREA and aPIM;

gPGATE1 = gP_FIN_AREA and gPOLY;

//gPFINS_temp = gP_FIN_AREA not gPGATE1;

gPFINS = (gP_FIN_AREA not gPGATE1) not aDUMMY; // excluding fin area overlapped by DUMMY layer

soft_connect_layers.push_back( { aM0A, { gPFINS } } );

gVPW1 = aPIM and aACT;

gVPW = gVPW1 and gPWELL;

soft_connect_layers.push_back( { aM0A, { gPWELL }, gVPW } );

gVNW1 = aNIM and aM0A;

gVNW = gVNW1 and gNWELL;

soft_connect_layers.push_back( { aM0A, { gNWELL }, gVNW } );

if (!soft_connect_layers.empty()) {
   CONNECT_DB = soft_connect( CONNECT_DB, soft_connect_layers, conflict_resolution = TRAPEZOID_COUNT );
}

//SOFTCHK_gPOLY_LOWER @= { @ "SOFTCHK_gPOLY_LOWER";
    //soft_connect_check( CONNECT_DB, gPOLY, LOWER );
//}
//if (abort_on_softchk && !violation_empty(SOFTCHK_gPOLY_LOWER)) {
    //error("SOFTCHK_gPOLY_LOWER produced violations.  Exiting.");
//}

CONNECT_DB = create_ports(CONNECT_DB, { {aBPR, aBPR}, {aM0A, aM0A}, {aM0B, aM0B}, {aM1, aM1}, {aM2, aM2}, {aM3, aM3}, {aM4, aM4}, {aM5, aM5}, {aM6, aM6}, {aM7, aM7}, {aM8, aM8}, {aM9, aM9}, {aM10, aM10}, {aM11, aM11}, {aM12, aM12}, {aM13, aM13}, {aRDL, aRDL} });

dev_matrix : device_matrix = init_device_matrix(CONNECT_DB);

nmos( bulk_relationship = INTERACT, device_name = "nmos", drain = gNFINS, gate = gPOLY, matrix = dev_matrix, properties = { { "W" }, { "L" }, { "nfin" }, { "ADEJ" }, { "ASEJ" }, { "PDEJ" }, { "PSEJ" } }, property_function = dev_func_MY_FET_PROPERTIES, recognition_layer = ( gNGATE1 interacting gPWELL ), simulation_model_name = "nmos", source = gNFINS );

pmos( bulk_relationship = INTERACT, device_name = "pmos", drain = gPFINS, gate = gPOLY, matrix = dev_matrix, properties = { { "W" }, { "L" }, { "nfin" }, { "ADEJ" }, { "ASEJ" }, { "PDEJ" }, { "PSEJ" } }, property_function = dev_func_MY_FET_PROPERTIES, recognition_layer = ( gPGATE1 interacting gNWELL ), simulation_model_name = "pmos", source = gPFINS );

//removed from NMOS for ignoring bulk terminal - optional_pins = { { device_layer = gPWELL,  pin_compared = false}  },

//removed from PMOS for ignoring bulk terminal - optional_pins = { { device_layer = gNWELL,  pin_compared = false } },

device_db = extract_devices(dev_matrix);

layout_netlist_db = netlist( device_db = device_db, include_empty_cells = NONE, precision = 6 );
compare_settings = init_compare_matrix();
filter_off(state = compare_settings, device_type = CAPACITOR);
filter_off(state = compare_settings, device_type = RESISTOR);
filter_off(state = compare_settings, device_type = NMOS);
filter_off(state = compare_settings, device_type = PMOS);
filter_off(state = compare_settings, device_type = NP);
filter_off(state = compare_settings, device_type = PN);
filter_off(state = compare_settings, device_type = NPN);
filter_off(state = compare_settings, device_type = PNP);
merge_parallel(state = compare_settings, device_type = NPN, property_functions = { { "default_par_wl_props"} });
merge_parallel(state = compare_settings, device_type = PNP, property_functions = { { "default_par_wl_props"} });
merge_parallel(state = compare_settings, device_type = CAPACITOR, property_functions = { { "default_par_cap_props"} });
merge_parallel(state = compare_settings, device_type = NP);
merge_parallel(state = compare_settings, device_type = PN);
merge_parallel(state = compare_settings, device_type = NMOS, property_functions = { { "default_par_mos_props"} });
merge_parallel(state = compare_settings, device_type = PMOS, property_functions = { { "default_par_mos_props"} });
merge_parallel(state = compare_settings, device_type = RESISTOR, property_functions = { { "default_par_wl_props"} });
merge_series(state = compare_settings, device_type = CAPACITOR);
merge_series_off(state = compare_settings, device_type = NMOS);
merge_series_off(state = compare_settings, device_type = PMOS);
merge_series(state = compare_settings, device_type = RESISTOR, property_functions = { { "default_ser_wl_props"} });

recognize_gate(state = compare_settings, type = ALL);
short_equivalent_nodes(state = compare_settings, device_type = NMOS, exclude_tolerances = { { "W", [ -infinity, infinity ], RELATIVE, RATIO } });
short_equivalent_nodes(state = compare_settings, device_type = PMOS, exclude_tolerances = { { "W", [ -infinity, infinity ], RELATIVE, RATIO } });

compare(
   user_functions_file = search_include_path("FreePDK3_main.lvs.rs.user_functions"),
   state = compare_settings,
   schematic = schematic_db,
   layout = layout_netlist_db
);


//add pex functions here - vpasuma

pex_matrix = init_pex_layer_matrix(device_db);
pex_conducting_layer_map(pex_matrix, gNWELL, "SUBSTRATE", tagname="SUBSTRATENWELL");
pex_conducting_layer_map(pex_matrix, gPWELL, "SUBSTRATE", tagname="SUBSTRATEPWELL");
pex_conducting_layer_map(pex_matrix, gVNW, "SUBSTRATE", tagname="SUBSTRATEVNW");
pex_conducting_layer_map(pex_matrix, gVPW, "SUBSTRATE", tagname="SUBSTRATEVPW");
pex_conducting_layer_map(pex_matrix, gNFINS, "ACT", tagname="ACTNFINS");
pex_conducting_layer_map(pex_matrix, gPFINS, "ACT", tagname="ACTPFINS");
pex_conducting_layer_map(pex_matrix, gPOLY, "GATE", tagname="GATEPOLY");
pex_conducting_layer_map(pex_matrix, aM0A, "M0A", tagname="M0A");
pex_conducting_layer_map(pex_matrix, aM0B, "M0B", tagname="M0B");
pex_conducting_layer_map(pex_matrix, aM1, "M1", tagname="M1");
pex_conducting_layer_map(pex_matrix, aM2, "M2", tagname="M2");
pex_conducting_layer_map(pex_matrix, aM3, "M3", tagname="M3");
pex_conducting_layer_map(pex_matrix, aM4, "M4", tagname="M4");
pex_conducting_layer_map(pex_matrix, aM5, "M5", tagname="M5");
pex_conducting_layer_map(pex_matrix, aM6, "M6", tagname="M6");
pex_conducting_layer_map(pex_matrix, aM7, "M7", tagname="M7");
pex_conducting_layer_map(pex_matrix, aM8, "M8", tagname="M8");
pex_conducting_layer_map(pex_matrix, aM9, "M9", tagname="M9");
pex_conducting_layer_map(pex_matrix, aM10, "M10", tagname="M10");
pex_conducting_layer_map(pex_matrix, aM11, "M11", tagname="M11");
pex_conducting_layer_map(pex_matrix, aM12, "M12", tagname="M12");
pex_conducting_layer_map(pex_matrix, aM13, "M13", tagname="M13");
pex_conducting_layer_map(pex_matrix, aRDL, "RDL", tagname="RDL");
pex_conducting_layer_map(pex_matrix, aBPR, "BPR", tagname="BPR"); //Modified by Sushant

pex_via_layer_map(pex_matrix, aVBPR, "VBPR", tagname="VBPR"); //Modified by Sushant
pex_via_layer_map(pex_matrix, aGCON, "GCON", tagname="GCON");
pex_via_layer_map(pex_matrix, aV0A, "V0A", tagname="V0A");
pex_via_layer_map(pex_matrix, aV0B, "V0B", tagname="V0B");
pex_via_layer_map(pex_matrix, aV1, "V1", tagname="V1");
pex_via_layer_map(pex_matrix, aV2, "V2", tagname="V2");
pex_via_layer_map(pex_matrix, aV3, "V3", tagname="V3");
pex_via_layer_map(pex_matrix, aV4, "V4", tagname="V4");
pex_via_layer_map(pex_matrix, aV5, "V5", tagname="V5");
pex_via_layer_map(pex_matrix, aV6, "V6", tagname="V6");
pex_via_layer_map(pex_matrix, aV7, "V7", tagname="V7");
pex_via_layer_map(pex_matrix, aV8, "V8", tagname="V8");
pex_via_layer_map(pex_matrix, aV9, "V9", tagname="V9");
pex_via_layer_map(pex_matrix, aV10, "V10", tagname="V10");
pex_via_layer_map(pex_matrix, aV11, "V11", tagname="V11");
pex_via_layer_map(pex_matrix, aV12, "V12", tagname="V12");
pex_via_layer_map(pex_matrix, aVRDL, "VRDL", tagname="VRDL");


pex_layout_library_handle = gds_library("pex.gds");
pex_layout_library_layer_map_handle = pex_library_layer_map_file("pex.gds.layer.map");
pex_spice_netlist_file_handle = spice_netlist_file("pex.sp");
pex_cell_extents_file_handle = pex_cell_extents_file("pex.cell.extents");
pex_cell_port_file_handle = pex_cell_port_file("pex.cell.port");
pex_process_handle = pex_process_map_file("pex.process.map");
pex_report_handle = pex_runset_report_file("pex_runset_report");


pex_generate_database(
    pex_matrix = pex_matrix,
    pex_library = pex_layout_library_handle,
    pex_library_layer_map = pex_layout_library_layer_map_handle,
    pex_netlist_file = pex_spice_netlist_file_handle,
    pex_cell_extents_file = pex_cell_extents_file_handle,
    pex_cell_port_file = pex_cell_port_file_handle,
    pex_process_map_file = pex_process_handle,
    pex_runset_report_file = pex_report_handle
);



================================================
FILE: icv/FreePDK3_main.lvs.rs.user_functions
================================================
// 3nm FreePDK(TM) ICV LVS Functions
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.


#include <icv_compare.rh>
#include <math.rh>
#include <string.rh>


default_par_mos_props : entrypoint function (void) returning void
{
    vDEV_ID = lvs_current_device();

    vP_valid = lvs_sum_of_products(vDEV_ID, "W", "L", vP);
    vQ_valid = lvs_sum_of_divisions(vDEV_ID, "W", "L", vQ);
    if (vP_valid && vQ_valid) {
        vW = sqrt(vP*vQ);
        vL = sqrt(vP/vQ);
        lvs_save_double_property("W", vW);
        lvs_save_double_property("L", vL);
    }

    vAS_valid = lvs_sum(vDEV_ID, "AS", vAS);
    if (vAS_valid) {
        lvs_save_double_property("AS", vAS);
    }

    vAD_valid = lvs_sum(vDEV_ID, "AD", vAD);
    if (vAD_valid) {
        lvs_save_double_property("AD", vAD);
    }

    vPS_valid = lvs_sum(vDEV_ID, "PS", vPS);
    if (vPS_valid) {
        lvs_save_double_property("PS", vPS);
    }

    vPD_valid = lvs_sum(vDEV_ID, "PD", vPD);
    if (vPD_valid) {
        lvs_save_double_property("PD", vPD);
    }
}

default_par_cap_props : entrypoint function (void) returning void
{
    vDEV_ID = lvs_current_device();

    vP_valid = lvs_sum_of_products(vDEV_ID, "W", "L", vP);
    vQ_valid = lvs_sum_of_divisions(vDEV_ID, "W", "L", vQ);
    if (vP_valid && vQ_valid) {
        vW = sqrt(vP*vQ);
        vL = sqrt(vP/vQ);
        lvs_save_double_property("W", vW);
        lvs_save_double_property("L", vL);
    }

    vA_valid = lvs_sum(vDEV_ID, "A", vA);
    if (vA_valid) {
        lvs_save_double_property("A", vA);
    }

    vP_valid = lvs_sum(vDEV_ID, "P", vP);
    if (vP_valid) {
        lvs_save_double_property("P", vP);
    }
}

default_par_wl_props : entrypoint function (void) returning void
{
    vDEV_ID = lvs_current_device();

    vP_valid = lvs_sum_of_products(vDEV_ID, "W", "L", vP);
    vQ_valid = lvs_sum_of_divisions(vDEV_ID, "W", "L", vQ);

    if (vP_valid && vQ_valid) {
        vW = sqrt(vP * vQ);
        vL = sqrt(vP / vQ);
        lvs_save_double_property("W", vW);
        lvs_save_double_property("L", vL);
    }
}

default_ser_wl_props : entrypoint function (void) returning void
{
    vDEV_ID = lvs_current_device();

    vP_valid = lvs_sum_of_products(vDEV_ID, "L", "W", vP);
    vQ_valid = lvs_sum_of_divisions(vDEV_ID, "L", "W", vQ);

    if (vP_valid && vQ_valid) {
        vW = sqrt(vP / vQ);
        vL = sqrt(vP * vQ);
        lvs_save_double_property("W", vW);
        lvs_save_double_property("L", vL);
    }
}



================================================
FILE: icv/Include/FreePDK3.act.drc.rs
================================================
// 3nm FreePDK(TM) ACT ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rACT_1 @= { @ "ACT.1 : Minimum vertical width of ACT >= 21 nm";
// Sushant
	internal1( aACT, < 0.021, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = VERTICAL, orthogonal = BOTH );
}

rACT_2 @= { @ "ACT.2 : Minimum vertical spacing of ACT >= 21.5 nm";
    external1(aACT, < 0.0215, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = VERTICAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
}

rACT_3 @= { @ "ACT.3 : Minimum horizontal width of ACT >= 84 nm";
// Sushant 
	internal1( aACT, < 0.084, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = HORIZONTAL, orthogonal = BOTH );
}

rACT_4 @= { @ "ACT.4 : ACT should be continuous";
	gACT_1i = aACT and aDUMMY;
    // check for the distance between two ACT polygons inside DUMMY; flag as violation if smaller than width of DUMMY
    external1(gACT_1i, < 0.015, direction = HORIZONTAL, extension = NONE);
	external1(aACT, < 1, direction = HORIZONTAL, extension = NONE);
}

rACT_5 @= { @ "ACT.5 : Minimum vertical spacing between ACT and BPR >= 10 nm";
    external2(aACT, aBPR, < 0.010, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = VERTICAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT);   
}

rACT_6 @= { @ "ACT.6 : ACT may not bend";
    not_rectangles(aACT);
}

rACT_7 @= { @ "ACT.7 : ACT must end inside a DUMMY layer";
// TBD
	gACT_lineend = angle_edge(aACT, ==90); 
	gACT_lineend not_edge aDUMMY;
}


================================================
FILE: icv/Include/FreePDK3.antenna.drc.rs
================================================
// 3nm FreePDK(TM) ANTENNA ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

nar_funcs_e : newtype enum of {
    UNKNOWN,
    NAR_SAVE_NET_10
};
nar_void_func_s : newtype struct of {
    func : function (void) returning void;
};

nar_void_func_h : newtype hash of nar_funcs_e to nar_void_func_s;

nar_constrained_area_s : newtype struct of {
    area    : constraint of double = > 0;
    layer1  : string               = "";
    factor1 : double               = 1.0;
    layer2  : string               = "";
    factor2 : double               = 1.0;
};

nar_constrained_areas_h : newtype hash of string to nar_constrained_area_s;

net_area_ratio : published function (
    cdb_in            : connect_database,
    con               : constraint of double,
    layer_groups      : layer_groups_h,
    denominator_start : integer,
    denominator_end   : integer,
    constrained_areas : nar_constrained_areas_h = { },
    func_enum         : nar_funcs_e             = UNKNOWN,
    expr_is_default   : boolean                 = false
)
    returning void
{
    nar_funcs   : nar_void_func_h = { };
    nar_func    : function (void) returning void;
    con2any     : list of polygon_layer = { };
    not_con2any : list of polygon_layer = { };
    n_layer_0   : polygon_layer;

    /* Declare and register equation code function. */
    nar_save_net_10 : function (void) returning void
    {
        areaL1 = ns_net_area("layer1");
        areaL2 = ns_net_area("layer2");
        areaL3 = ns_net_area("layer3");
        areaL4 = ns_net_area("layer4");
        areaL5 = ns_net_area("layer5");
        areaL6 = ns_net_area("layer6");
        areaL7 = ns_net_area("layer7");
        areaL8 = ns_net_area("layer8");
        areaL9 = ns_net_area("layer9");
        areaL10 = ns_net_area("layer10");

        con_eq_zero : boolean = ((con.category() == CONSTRAINT_EQ) && dbleq(con.lo(), 0));
        if (( ( areaL9 + areaL10 ) > 0) || con_eq_zero) {
            ratio = ( ( areaL9 + areaL10 ) > 0) ? (( areaL1 + areaL2 + areaL3 + areaL4 + areaL5 + areaL6 + areaL7 + areaL8 ) / ( areaL9 + areaL10 )) : 0;

            if (dblccon(con, ratio)) {
                ns_save_net({"ratio"}, {ratio});
            }
        }
    }
    nar_funcs[NAR_SAVE_NET_10] = { nar_save_net_10 };

    /* Lookup the net_function to use in this num/den instance. */
    nar_func = nar_funcs[func_enum].func;

    n_layer_0 = layer_groups["layer1"][0];

    if (expr_is_default && (layer_groups.size() > 1)) {
        d_layers : list of polygon_layer = { };

        for (i = denominator_start to denominator_end) {
            d_layers.push_back(layer_groups["layer" + i][0]);
        }

        if ((con.category() == CONSTRAINT_EQ) && !((con.lo() > 0.0) || (con.lo() < 0.0))) {
            not_con2any = d_layers;
        }
        else {
            con2any = d_layers;
        }
    }

    net_select(
        connect_sequence     = cdb_in,
        net_function         = nar_func,
        layer_groups         = layer_groups,
        connected_to_all     = { n_layer_0 },
        connected_to_any     = con2any,
        not_connected_to_any = not_con2any,
        output_from_layers   = { n_layer_0 },
        error_net_output     = ALL
    );
}

rANTENNA_1 @= { @ "ANT.1 : ANTENNA Ratio of Maximum Allowed GATE Area to transistor Gate Area is 50 :1";
   //Sushant 
   net_area_ratio( CONNECT_DB, > ANTENNA_RATIO, { "layer1" => gPOLY, "layer2" => aGCON, "layer3" => aM0A, "layer4" => aM1, "layer5" => aM2, "layer6" => aM3, "layer7" => aM4, "layer8" => aM5, "layer9" => gN_GATE, "layer10" => gP_GATE, "layer11" => gP_GATE_or_gN_GATE }, 9, 10, {  }, NAR_SAVE_NET_10, true );
}

================================================
FILE: icv/Include/FreePDK3.bpr.drc.rs
================================================
// 3nm FreePDK(TM) BPR ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rBPR_1 @= { @ "BRP.1 : BPR vertical width = 31.5 nm";
   gGRBPR1_check = internal1( aBPR, == 0.0315, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = VERTICAL, orthogonal = BOTH ); 
	aBPR not gGRBPR1_check;
}

rBPR_2 @= { @ "BPR.2 : Minimum vertical spacing between BPR layers >= 84 nm";
// TBD
	external1(aBPR, < 0.084, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = VERTICAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 

}

rBPR_3 @= { @ "BPR.3 : BPR must be continuous";
// TBD
	external1(aBPR, < 1, direction = HORIZONTAL, extension = NONE);
}

rBPR_4 @= { @ "BPR.4 : BPR may not bend";
// Sushant
	not_rectangles(aBPR);
}



================================================
FILE: icv/Include/FreePDK3.dummy.drc.rs
================================================
// 3nm FreePDK(TM) DUMMY ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

// Sushant
rDUMMY_1 @= { @ "DUMMY.1 : DUMMY exact horizontal width = 15 nm";
    // Sushant
	gGRDUMMY1_check = internal1( aDUMMY, == 0.015, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = HORIZONTAL, orthogonal = BOTH );
	aDUMMY not gGRDUMMY1_check;
}

rDUMMY_2 @= { @ "DUMMY.2 : DUMMY minimum vertical length >= 40 nm";
    // Sushant
	internal1( aDUMMY, < 0.040, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = VERTICAL, orthogonal = BOTH );
}

rDUMMY_3 @= { @ "DUMMY.3 : Minimum vertical space >= 115.5 nm";
    // Sushant
	//TBD
	external1(aDUMMY, < 0.1155, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = VERTICAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
}

rDUMMY_4 @= { @ "DUMMY.4 : DUMMY may not bend";
    // Sushant
	not_rectangles(aDUMMY);
}

rDUMMY_5 @= { @ "DUMMY.5: DUMMY must completely overlap GATE"; 
	aDUMMY not_inside aGATE;
}

rDUMMY_6 @= { @ "DUMMY.6 : Dummy horizontal edge maynot lie inside ACTIVE"; 
	gDUMMY_h = angle_edge( aDUMMY, ==0);
	and_edge(gDUMMY_h, aACT);
}


================================================
FILE: icv/Include/FreePDK3.gate.drc.rs
================================================
// 3nm FreePDK(TM) GATE ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

// Sushant

rGATE_1 @= { @ "GATE.1 : GATE exact horizontal width = 15 nm";
    // Sushant
	gGRGATE1_check = internal1( aGATE, == 0.015, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = HORIZONTAL, orthogonal = BOTH );
	aGATE not gGRGATE1_check;
}

rGATE_2 @= { @ "GATE.2 : Minimum horizontal spacing between GATE or DUMMY layers >= 27 nm";
    // Sushant
	external1(aGATE, < 0.027, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = HORIZONTAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
	external2(aDUMMY, aGATE, < 0.027, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = HORIZONTAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
}

rGATE_3 @= { @ "GATE.3 : GATE may not bend";
    // Sushant
	not_rectangles(aGATE);
}

rGATE_4 @= { @ "GATE.4 : GATE min extension past ACT in vertical direction >= 21.5 nm";
    // TBD
	enclose( aACT, aGATE, < 0.0215, extension = NONE, direction = VERTICAL);
}


rGATE_5 @= { @ "GATE.5 : GATE minimum vertical length >= 40 nm";
    // Sushant
	internal1( aGATE, < 0.040, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = VERTICAL, orthogonal = BOTH );
}

rGATE_6 @= { @ "GATE.6 : GATE may not be discontinuous along the vertical axis. Use GCUT layer to mark cuts in the GATE ";
    // Sushant
	external1(aGATE, < 1, direction = VERTICAL, extension = NONE);	
}

rGATE_7 @= { @ "GATE.7 : ACT layer vertical edge may not lie inside, or coincide with, the GATE layer ";
    // Sushant
	//gACT_v = angle_edge( aACT, == 90);
    //and_edge( gACT_v, aGATE);

}

rGATE_8 @= { @ "GATE.8 : Minimum horizontal spacing between ACT and GATE (not cut by GCUT and not interacting with ACT) >= 6 nm";
    // Sushant
	external2( aGATE, aACT, < 0.006, connectivity = DIFFERENT_NET, extension = RADIAL, intersecting = { }, intersection_angle = < 90, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT, connect_sequence = CONNECT_DB);
}





================================================
FILE: icv/Include/FreePDK3.gcon.drc.rs
================================================
// 3nm FreePDK(TM) GCON ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rGCON_1 @= { @ "GCON.1 : Exact VERTICAL width of GCON = 13 nm";
    //Sushant
	gGRGCON1_check = internal1( aGCON, == 0.013, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = VERTICAL, orthogonal = BOTH );
	aGCON not gGRGCON1_check;
}

rGCON_2 @= { @ "GCON.2 : Exact HORIZONTAL length of GCON = 15 nm";
    //Sushant
	gGRGCON2_check = internal1( aGCON, == 0.015, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = HORIZONTAL, orthogonal = BOTH );
	aGCON not gGRGCON2_check;
}

rGCON_3 @= { @ "GCON.3 : GCON must overlap gate";
    not_interacting( aGCON, aGATE, include_touch = NONE );
}

rGCON_4 @= { @ "GCON.4 : GCON extention past M0B in vertical direction >= 1 nm";
    //Sushant
//	gGRGCON4_check = enclose( aGCON, aM0B, distance < 1, direction = HORIZONTAL );
//    aGCON not gGRGCON4_check;
	enclose( aM0B, aGCON, < 0.001, extension = NONE, direction = VERTICAL);
}

rGCON_5 @= { @ "GCON.5 : Minimum horizontal spacing between two GCON layer >= 25 nm";
    //Sushant
	external1(aGCON, < 0.025, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = HORIZONTAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT);
}

rGCON_6 @= { @ "GCON.6 : Minimum vertical spacing between two GCON layer >= 28 nm";
    //Sushant
	external1(aGCON, < 0.028, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = VERTICAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT);  
}

rGCON_7 @= { @ "GCON.7 : Minimum spacing between GCON and M0A layer polygons >= 6 nm";
    //Sushant
	external2(aGCON, aM0A, < 0.006, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = HORIZONTAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 	
}

rGCON_8 @= { @ "GCON.8 : Minimum horizontal spacing between GCON and GATE layer >= 25 nm";
    //Sushant
	external2( aGCON, aGATE, < 0.025, connectivity = DIFFERENT_NET, extension = RADIAL, intersecting = { }, intersection_angle = < 90, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT, connect_sequence = CONNECT_DB);
}

rGCON_9 @= { @ "GCON.9 : Minimum vertical spacing between GCON and GCUT >= 13.5 nm";
    //Sushant
	external2(aGCON, aGCUT, < 0.0135, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = VERTICAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT);
}

rGCON_10 @= { @ "GCON.10 : Minimum GCON Area >= 180 nm^2";
    //Sushant
	area( aGCON, < 0.000180);
}

rGCON_11 @= { @ "GCON.11 : GCON may not bend";
    //Sushant
	not_rectangles(aGCON);
}

rGCON_12 @= { @ "GCON.12 : Minumum area of overlap between GCON and M0B >= 165 nm^2";
    gGCON12 = interacting( aGCON, aM0B );
    area( gGCON12, < 0.000165 );
}

rGCON_13 @= { @ "GCON.13 : Minimum area of overlap between GCON and GATE  >= 195 nm^2";
    //Sushant
	gGCON13 = interacting( aGCON, aGATE );
    area( gGCON13, < 0.000195 );
}

rGCON_14 @= { @ "GCON.14 : GCON may not  interact with GCUT or DUMMY";
    //Sushant
	gGRGCON14_check = or(aGCUT, aDUMMY);
    interacting( aGCON, gGRGCON14_check, include_touch = ALL);
}



================================================
FILE: icv/Include/FreePDK3.gcut.drc.rs
================================================
// 3nm FreePDK(TM) GCUT ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rGCUT_1 @= { @ "GCUT.1 : Exact vertical width of GCUT(shape is oriented horizontally) = 10.5 nm";
    //Sushant
	gGRGCUT1_check = internal1( aGCUT, == 0.0105, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = VERTICAL, orthogonal = BOTH );
	aGCUT not gGRGCUT1_check;
}

rGCUT_2 @= { @ "GCUT.2 : Minimum horizontal length of GCUT(shape is oriented horizontally) >= 42 nm";
    //Sushant
	internal1( aGCUT, < 0.042, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = HORIZONTAL, orthogonal = BOTH );

}

rGCUT_3 @= { @ "GCUT.3 : Minimum horizontal space of GCUT >= 69 nm";
    //Sushant
	external1(aGCUT, < 0.069, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = HORIZONTAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
}

rGCUT_4 @= { @ "GCUT.4 : GCUT minimum space to ACT >= 20.5 nm";
    //Sushant
	external2(aGCUT, aACT, < 0.0205, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = VERTICAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT);
}

rGCUT_5 @= { @ "GCUT.5 : GCUT may not bend";
    //Sushant
	not_rectangles(aGCUT);
}

rGCUT_6 @= { @ "GCUT.6 : GCUT vertical edge must coinside with DUMMY vertical edge";
    gGCUT_v = angle_edge( aGCUT, == 90);
    and_edge( gGCUT_v, aDUMMY, false);
}

rGCUT_7 @= { @ "GCUT.7 : GCUT layer may not exist without the layer GATE";
    //Sushant
	not_cutting(aGCUT, aGATE, count > 0);
}

rGCUT_8 @= { @ "GCUT.8 : GCUT layer vertical edge may not lie inside, or coincide with, the GATE layer ";
    //Sushant
	//gGCUT_v = angle_edge( aGCUT, == 90);
    //and_edge( gGCUT_v, aGATE);
}

rGCUT_9 @= { @ "GCUT.9 : GCUT may not interact with ACT";
    //Sushant
	//gGRGCUT9_check = or(aACT);
	interacting( aGCUT, aACT, include_touch = ALL);
}

rGCUT_10 @= { @ "GCUT.10 : Minimum vertical spacing between two GCUT layer >= 105 nm";
    //Sushant
	external1(aGCUT, < 0.105, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = VERTICAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT);   
}





================================================
FILE: icv/Include/FreePDK3.m0a.drc.rs
================================================
// 3nm FreePDK(TM) M0A ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rM0A_1 @= { @ "M0A.1 : Minimum horizontal width of M0A >= 15 nm";
    //Sushant
	internal1( aM0A, < 0.015, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = HORIZONTAL, orthogonal = BOTH );
}

rM0A_2 @= { @ "M0A.2 : Minimum spacing of M0A to GATE >= 6 nm";
    //Sushant
	external2(aM0A, aGATE, < 0.006, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = HORIZONTAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
}

rM0A_3 @= { @ "M0A.3 : Minimum extension of ACT past M0A (horizontal direction) >= 5 nm";
    //Sushant
	sACT_VERTICAL_EDGES = angle_edge( aACT, == 90 );
    sM0A_VERTICAL_EDGES = angle_edge( aM0A, == 90 );
    enclose_error( sM0A_VERTICAL_EDGES, sACT_VERTICAL_EDGES, < 0.005, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT );

}

rM0A_4 @= { @ "M0A.4 : Minimun vertical length of M0A >= 21.5 nm";
    //Sushant
	internal1( aM0A, < 0.0215, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = VERTICAL, orthogonal = BOTH );
}

rM0A_5 @= { @ "M0A.5 : Minimum vertical spacing of M0A >= 10 nm";
    //Sushant
	external1(aM0A, < 0.010, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = VERTICAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
}

rM0A_6 @= { @ "M0A.6 : M0A may not bend";
    //Sushant
	not_rectangles(aM0A);
}

rM0A_7 @= { @ "M0A.7 : Minimum vertical overlap between M0A and ACTIVE  >= 11 nm";
    //Sushant
	gGRM0A7_check = and(aM0A, aACT);
	internal1 (gGRM0A7_check, < 0.011, direction = VERTICAL, extension = NONE);

}

rM0A_8 @= { @ "M0A.8 : M0A may not exitst without ACTIVE ";
    //Sushant
	//gGRM0A8_check = and(aM0A, aACT);
	//area(gGRM0A8_check, < 0.000165);
	//not_inside(aM0A, aACT);
	//aM0A_p = df_polygon_layer(aM0A);
	//aM0A_ACT_p = df_polygon_layer(gGRM0A8_check);
	//gGRM0A8_check1 = df_polygon_count(aM0A_p);
	//gGRM0A8_check2 = df_polygon_count(aM0A_ACT_p);
	//gGRM0A8_check1 != gGRM0A8_check2;
	not_cutting(aM0A, aACT, count > 0);
}

rM0A_9 @= { @ "M0A.9 : Minimum M0A area >= 322.5 nm^2";
    //Sushant
	area( aM0A, < 0.0003225);
}


================================================
FILE: icv/Include/FreePDK3.m0b.drc.rs
================================================
// 3nm FreePDK(TM) M0B ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rM0B_1 @= { @ "M0B.1 : Minimum Vertical width of M0B >= 11 nm";
    //Sushant
	internal1( aM0B, < 0.011, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = VERTICAL, orthogonal = BOTH );	
}

rM0B_2 @= { @ "M0B.2 : Minimum Vertical spacing of M0B >= 10 nm";
    //Sushant
	external1(aM0B, < 0.010, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = VERTICAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
}

rM0B_3 @= { @ "M0B.3 : Minimum Horizontal width of M0B >= 22 nm";
    //Sushant
	internal1( aM0B, < 0.022, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = HORIZONTAL, orthogonal = BOTH );
}

rM0B_4 @= { @ "M0B.4 : M0B minimum horizontal spacing >= 20 nm";
    //Sushant
	external1(aM0B, < 0.020, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = HORIZONTAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
}

rM0B_5 @= { @ "M0B.5 : M0B may not bend";
    //Sushant
	not_rectangles(aM0B);	
}

rM0B_6 @= { @ "M0B.6 : Minimum extention of MOB past GCON in horizontal direction >= 3.5 nm";
    //Sushant
	sM0B_VERTICAL_EDGES = angle_edge( aM0B, == 90 );
    sGCON_VERTICAL_EDGES = angle_edge( aGCON, == 90 );
    enclose_error( sGCON_VERTICAL_EDGES, sM0B_VERTICAL_EDGES, < 0.0035, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT );
}

rM0B_7 @= { @ "M0B.7 : Minimum extention of MOB past V0A >= 6 nm";
    //Sushant
	
}

rM0B_8 @= { @ "M0B.8 : Minimum M0B area >= 242 nm^2";
    //Sushant
	area( aM0B, < 0.000242);
}


================================================
FILE: icv/Include/FreePDK3.m1.drc.rs
================================================
// 3nm FreePDK(TM) M1 ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rM1_1 @= { @ "M1.1 : METAL1 width minimum >= 14nm";
    //Sushant
	internal1( aM1, < 0.014, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = HORIZONTAL, orthogonal = BOTH );
}

rM1_2 @= { @ "M1.2 : METAL1 spacing minimum >= 14nm";
    //Sushant
	external1(aM1, < 0.014, extension = RADIAL, intersecting = { }, intersection_angle = < 90, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
}


m1_w_015 =wide(aM1, distance >= 0.015); //Extract polygons wider than 15nm
m1_w_030 =wide(aM1, distance >= 0.030); //Extract polygons wider than 30nm


m1_w_045 =wide(aM1, distance >= 0.045); //Extract polygons wider than 45nm
m1_w_135 =wide(aM1, distance >= 0.135);	//Extract polygons wider than 135nm
m1_w_405 = wide(aM1, distance >= 0.405);// Extract polygons wider than 405nm

m1_w_045_135 = m1_w_045 not m1_w_135; //Extract polygons wider than 45 but less than 135nm
m1_w_135_405 = m1_w_135 not m1_w_405; //Extract polygons wider than 135 but less than 405nm


rM1_4 @= { @ "M1.4 : Minimum spacing of METAL1 wider than 45nm and longer than 45nm >= 45nm";
    //Sushant
    m1_045 = aM1 not m1_w_045_135; //Extract polygons with width less than 45nm and greater than 135nm
	
	//find parallel polygons - one with width within 45nm and 135nm and the other with width less than 45 or greater than 135nm and check if the spacing is less than 45nm. (also check the parallel run length should be >= 45nm)
	mLAYER_1_1 = external2(m1_w_045_135,m1_045,distance < 0.045, extension = NONE,projection_length >= 0.045, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL); 
	//find parallel polygons - both with width within 45nm and 135nm and check if the spacing is less than 45nm. (also check the parallel run length should be >= 45nm)
	mLAYER_1_2 = external1(m1_w_045_135,distance < 0.045, extension = NONE,projection_length >= 0.045, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_1_1 or mLAYER_1_2;
}

rM1_5 @= { @ "M1.5 : Minimum spacing of METAL1 wider than 135nm and longer than 135nm >= 135nm";
    //Sushant
    m1_135 = aM1 not m1_w_135_405; //Extract polygons with width less than 135nm and greater than 405nm
	
	//find parallel polygons - one with width within 135nm and 405nm and the other with width less than 135 or greater than 405nm and check if the spacing is less than 135nm. (also check the parallel run length should be >= 135nm)
	mLAYER_1_3 = external2(m1_w_135_405,m1_135,distance < 0.135, extension = NONE,projection_length >= 0.135, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	//find parallel polygons - both with width within 135nm and 405nm and check if the spacing is less than 135nm. (also check the parallel run length should be >= 135nm)
	mLAYER_1_4 = external1(m1_w_135_405,distance < 0.135, extension = NONE,projection_length >= 0.135, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_1_3 or mLAYER_1_4;	
}

rM1_6 @= { @ "M1.6 : Minimum spacing of METAL1 wider than 405nm and longer than 405nm >= 405nm";
    //Sushant
	
	//find parallel polygons - one with width greater than 405nm and check if the spacing is less than 405nm. (also check the parallel run length should be >= 405nm)
	mLAYER_1_5 = external2(m1_w_405,aM1,distance < 0.405, extension = NONE,projection_length >= 0.405, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	//find parallel polygons - both with width greater than 405nm and check if the spacing is less than 405nm. (also check the parallel run length should be >= 405nm)
	mLAYER_1_6 = external1(m1_w_405,distance < 0.405, extension = NONE,projection_length >= 0.405, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_1_5 or mLAYER_1_6;	
}

rM1_7 @= { @ "M1.7 : Double patterning Error";
    //Sushant
	
	m1_Links = external1_error(aM1, < 0.015, extension = RADIAL, intersecting = { }, intersection_angle = < 90, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
	m1_conflict = two_color(aM1, m1_Links, aM1_color1, aM1_color2, even_loops, pre_color_layer ,output_even_loops = true, output_type=ODD_LOOP_INSIDE_RING, color_preference = BALANCED ); 
	copy(m1_conflict);
	color_output = gds_library("m1_dpt_output.gds");
	write_gds(color_output, layers = {{aM1, {1}}, {aM1_color1, {2}}, {aM1_color2, {3}}, {m1_conflict, {4}}});	
}

rM1_8 @= { @ "M1.8 : Density Balancing Rule: The density of decomposed metals should be between 23 and 77%";
	//Sushant 
	density(window_layer = chip_extent(), // The polygon layer that defines the boundaries where layers are processed for density calculations
            layer_hash         = {//"nodes"      => tmp_nodes,
								 "out_color1" => aM1_color1,
								 "out_color2" => aM1_color2,},
            window_function    = color_balance_func_M,
            merge_errors = true );

}



================================================
FILE: icv/Include/FreePDK3.m10.drc.rs
================================================
// 3nm FreePDK(TM) M10 ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rM10_1 @= { @ "M10.1 : METAL10 width minimum >= 80nm";
    //Sushant
	internal1( aM10, < 0.08, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = VERTICAL, orthogonal = BOTH );
}

rM10_2 @= { @ "M10.2 : METAL10 spacing minimum >= 80nm";
    //Sushant
	external1(aM10, < 0.08, extension = RADIAL, intersecting = { }, intersection_angle = < 90, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
}

rM10_3 @= { @ "M10.3 : METAL10 maximum width in vertical direction = 4000nm";
    //Sushant
    m10_w_4000 = internal1( aM10, < 4.0005, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = VERTICAL, orthogonal = BOTH );
	aM10 not m10_w_4000;	
}

m10_w_240 =wide(aM10, distance >= 0.240);
m10_w_720 =wide(aM10, distance >= 0.720);	
m10_w_2160 = wide(aM10, distance >= 2.160);

m10_w_240_720 = m10_w_240 not m10_w_720;
m10_w_720_2160 = m10_w_720 not m10_w_2160;


rM10_4 @= { @ "M10.4 : Minimum spacing of METAL10 wider than 240nm and longer than 240nm >= 240nm";
    //Sushant
    m10_240 = aM10 not m10_w_240_720;
	mLAYER_10_1 = external2(m10_w_240_720,m10_240,distance < 0.240, extension = NONE,projection_length >= 0.240, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_10_2 = external1(m10_w_240_720,distance < 0.240, extension = NONE,projection_length >= 0.240, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_10_1 or mLAYER_10_2;
}

rM10_5 @= { @ "M10.5 : Minimum spacing of METAL10 wider than 720nm and longer than 720nm >= 720nm";
    //Sushant
    m10_720 = aM10 not m10_w_720_2160;
	mLAYER_10_3 = external2(m10_w_720_2160,m10_720,distance < 0.720, extension = NONE,projection_length >= 0.720, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_10_4 = external1(m10_w_720_2160,distance < 0.720, extension = NONE,projection_length >= 0.720, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_10_3 or mLAYER_10_4;	
}

rM10_6 @= { @ "M10.6 : Minimum spacing of METAL10 wider than 2160nm and longer than 2160nm >= 2160nm";
    //Sushant
	mLAYER_10_5 = external2(m10_w_2160,aM10,distance < 2.160, extension = NONE,projection_length >= 2.160, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_10_6 = external1(m10_w_2160,distance < 2.160, extension = NONE,projection_length >= 2.160, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_10_5 or mLAYER_10_6;	
}

================================================
FILE: icv/Include/FreePDK3.m11.drc.rs
================================================
// 3nm FreePDK(TM) M11 ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rM11_1 @= { @ "M11.1 : METAL11 width minimum >= 80nm";
    //Sushant
	internal1( aM11, < 0.08, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = HORIZONTAL, orthogonal = BOTH );
}

rM11_2 @= { @ "M11.2 : METAL11 spacing minimum >= 80nm";
    //Sushant
	external1(aM11, < 0.08, extension = RADIAL, intersecting = { }, intersection_angle = < 90, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
}

rM11_3 @= { @ "M11.3 : METAL11 maximum width in horizontal direction = 4000nm";
    //Sushant
    m11_w_4000 = internal1( aM11, < 4.0005, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = HORIZONTAL, orthogonal = BOTH );
	aM11 not m11_w_4000;
}

m11_w_240 =wide(aM11, distance >= 0.240);
m11_w_720 =wide(aM11, distance >= 0.720);	
m11_w_2160 = wide(aM11, distance >= 2.160);

m11_w_240_720 = m11_w_240 not m11_w_720;
m11_w_720_2160 = m11_w_720 not m11_w_2160;


rM11_4 @= { @ "M11.4 : Minimum spacing of METAL11 wider than 240nm and longer than 240nm >= 240nm";
    //Sushant
    m11_240 = aM11 not m11_w_240_720;
	mLAYER_11_1 = external2(m11_w_240_720,m11_240,distance < 0.240, extension = NONE,projection_length >= 0.240, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_11_2 = external1(m11_w_240_720,distance < 0.240, extension = NONE,projection_length >= 0.240, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_11_1 or mLAYER_11_2;
}

rM11_5 @= { @ "M11.5 : Minimum spacing of METAL11 wider than 720nm and longer than 720nm >= 720nm";
    //Sushant
    m11_720 = aM11 not m11_w_720_2160;
	mLAYER_11_3 = external2(m11_w_720_2160,m11_720,distance < 0.720, extension = NONE,projection_length >= 0.720, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_11_4 = external1(m11_w_720_2160,distance < 0.720, extension = NONE,projection_length >= 0.720, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_11_3 or mLAYER_11_4;	
}

rM11_6 @= { @ "M11.6 : Minimum spacing of METAL11 wider than 2160nm and longer than 2160nm >= 2160nm";
    //Sushant
	mLAYER_11_5 = external2(m11_w_2160,aM11,distance < 2.160, extension = NONE,projection_length >= 2.160, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_11_6 = external1(m11_w_2160,distance < 2.160, extension = NONE,projection_length >= 2.160, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_11_5 or mLAYER_11_6;	
}

================================================
FILE: icv/Include/FreePDK3.m12.drc.rs
================================================
// 3nm FreePDK(TM) M12 ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rM12_1 @= { @ "M12.1 : METAL12 width minimum >= 160nm";
    //Sushant
	internal1( aM12, < 0.16, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = VERTICAL, orthogonal = BOTH );
}

rM12_2 @= { @ "M12.2 : METAL12 spacing minimum >= 160nm";
    //Sushant
	external1(aM12, < 0.16, extension = RADIAL, intersecting = { }, intersection_angle = < 90, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
}

rM12_3 @= { @ "M12.3 : METAL12 maximum width in vertical direction = 8000nm";
    //Sushant
    m12_w_8000 = internal1( aM12, < 8.0005, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = VERTICAL, orthogonal = BOTH );
	aM12 not m12_w_8000;	
}

m12_w_480 =wide(aM12, distance >= 0.480);
m12_w_1440 =wide(aM12, distance >= 1.440);	
m12_w_4320 = wide(aM12, distance >= 4.320);

m12_w_480_1440 = m12_w_480 not m12_w_1440;
m12_w_1440_4320 = m12_w_1440 not m12_w_4320;


rM12_4 @= { @ "M12.4 : Minimum spacing of METAL12 wider than 480nm and longer than 480nm >= 480nm";
    //Sushant
    m12_480 = aM12 not m12_w_480_1440;
	mLAYER_12_1 = external2(m12_w_480_1440,m12_480,distance < 0.480, extension = NONE,projection_length >= 0.480, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_12_2 = external1(m12_w_480_1440,distance < 0.480, extension = NONE,projection_length >= 0.480, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_12_1 or mLAYER_12_2;
}

rM12_5 @= { @ "M12.5 : Minimum spacing of METAL12 wider than 1440nm and longer than 1440nm >= 1440nm";
    //Sushant
    m12_1440 = aM12 not m12_w_1440_4320;
	mLAYER_12_3 = external2(m12_w_1440_4320,m12_1440,distance < 1.440, extension = NONE,projection_length >= 1.440, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_12_4 = external1(m12_w_1440_4320,distance < 1.440, extension = NONE,projection_length >= 1.440, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_12_3 or mLAYER_12_4;	
}

rM12_6 @= { @ "M12.6 : Minimum spacing of METAL12 wider than 4320nm and longer than 4320nm >= 4320nm";
    //Sushant
	mLAYER_12_5 = external2(m12_w_4320,aM12,distance < 4.320, extension = NONE,projection_length >= 4.320, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_12_6 = external1(m12_w_4320,distance < 4.320, extension = NONE,projection_length >= 4.320, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_12_5 or mLAYER_12_6;	
}

================================================
FILE: icv/Include/FreePDK3.m13.drc.rs
================================================
// 3nm FreePDK(TM) M13 ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rM13_1 @= { @ "M13.1 : METAL13 width minimum >= 160nm";
    //Sushant
	internal1( aM13, < 0.16, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = HORIZONTAL, orthogonal = BOTH );
}

rM13_2 @= { @ "M13.2 : METAL13 spacing minimum >= 160nm";
    //Sushant
	external1(aM13, < 0.16, extension = RADIAL, intersecting = { }, intersection_angle = < 90, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
}

rM13_3 @= { @ "M13.3 : METAL13 maximum width in horizontal direction = 8000nm";
    //Sushant
    m13_w_8000 = internal1( aM13, < 8.0005, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = HORIZONTAL, orthogonal = BOTH );
	aM13 not m13_w_8000;
}

m13_w_480 =wide(aM13, distance >= 0.480);
m13_w_1440 =wide(aM13, distance >= 1.440);	
m13_w_4320 = wide(aM13, distance >= 4.320);

m13_w_480_1440 = m13_w_480 not m13_w_1440;
m13_w_1440_4320 = m13_w_1440 not m13_w_4320;


rM13_4 @= { @ "M13.4 : Minimum spacing of METAL13 wider than 480nm and longer than 480nm >= 480nm";
    //Sushant
    m13_480 = aM13 not m13_w_480_1440;
	mLAYER_13_1 = external2(m13_w_480_1440,m13_480,distance < 0.480, extension = NONE,projection_length >= 0.480, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_13_2 = external1(m13_w_480_1440,distance < 0.480, extension = NONE,projection_length >= 0.480, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_13_1 or mLAYER_13_2;
}

rM13_5 @= { @ "M13.5 : Minimum spacing of METAL13 wider than 1440nm and longer than 1440nm >= 1440nm";
    //Sushant
    m13_1440 = aM13 not m13_w_1440_4320;
	mLAYER_13_3 = external2(m13_w_1440_4320,m13_1440,distance < 1.440, extension = NONE,projection_length >= 1.440, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_13_4 = external1(m13_w_1440_4320,distance < 1.440, extension = NONE,projection_length >= 1.440, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_13_3 or mLAYER_13_4;	
}

rM13_6 @= { @ "M13.6 : Minimum spacing of METAL13 wider than 4320nm and longer than 4320nm >= 4320nm";
    //Sushant
	mLAYER_13_5 = external2(m13_w_4320,aM13,distance < 4.320, extension = NONE,projection_length >= 4.320, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_13_6 = external1(m13_w_4320,distance < 4.320, extension = NONE,projection_length >= 4.320, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_13_5 or mLAYER_13_6;	
}

================================================
FILE: icv/Include/FreePDK3.m2.drc.rs
================================================
// 3nm FreePDK(TM) M2 ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rM2_1 @= { @ "M2.1 : METAL2 width minimum >= 14nm";
    //Sushant
	internal1( aM2, < 0.014, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = VERTICAL, orthogonal = BOTH );
}

rM2_2 @= { @ "M2.2 : METAL2 spacing minimum >= 14nm";
    //Sushant
	external1(aM2, < 0.014, extension = RADIAL, intersecting = { }, intersection_angle = < 90,  look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
}

m2_w_015 =wide(aM2, distance >= 0.015); 
m2_w_030 =wide(aM2, distance >= 0.030); 

rM2_3 @= { @ "M2.3 : METAL2 maximum width in vertical direction = 750nm";
    //Sushant	
	m2_w_750 = internal1( aM2, < 0.7505, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = VERTICAL, orthogonal = BOTH );
	aM2 not m2_w_750;
}

m2_w_045 =wide(aM2, distance >= 0.045);
m2_w_135 =wide(aM2, distance >= 0.135);	
m2_w_405 = wide(aM2, distance >= 0.405);

m2_w_045_135 = m2_w_045 not m2_w_135;
m2_w_135_405 = m2_w_135 not m2_w_405;


rM2_4 @= { @ "M2.4 : Minimum spacing of METAL2 wider than 45nm and longer than 45nm >= 45nm";
    //Sushant
    m2_045 = aM2 not m2_w_045_135;
	mLAYER_2_1 = external2(m2_w_045_135,m2_045,distance < 0.045, extension = NONE,projection_length >= 0.045, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_2_2 = external1(m2_w_045_135,distance < 0.045, extension = NONE,projection_length >= 0.045, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_2_1 or mLAYER_2_2;
}

rM2_5 @= { @ "M2.5 : Minimum spacing of METAL2 wider than 135nm and longer than 135nm >= 135nm";
    //Sushant
    m2_135 = aM2 not m2_w_135_405;
	mLAYER_2_3 = external2(m2_w_135_405,m2_135,distance < 0.135, extension = NONE,projection_length >= 0.135, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_2_4 = external1(m2_w_135_405,distance < 0.135, extension = NONE,projection_length >= 0.135, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_2_3 or mLAYER_2_4;	
}

rM2_6 @= { @ "M2.6 : Minimum spacing of METAL2 wider than 405nm and longer than 405nm >= 405nm";
    //Sushant
	mLAYER_2_5 = external2(m2_w_405,aM2,distance < 0.405, extension = NONE,projection_length >= 0.405, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_2_6 = external1(m2_w_405,distance < 0.405, extension = NONE,projection_length >= 0.405, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_2_5 or mLAYER_2_6;	
}

rM2_7 @= { @ "M2.7 : Double patterning Error";
    //Sushant
	m2_Links = external1_error(aM2, < 0.015, extension = RADIAL, intersecting = { }, intersection_angle = < 90,  look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
	m2_conflict = two_color(aM2, m2_Links, aM2_color1, aM2_color2, even_loops, pre_color_layer ,output_even_loops = true, output_type=ODD_LOOP_INSIDE_RING, color_preference = BALANCED ); 
	copy(m2_conflict);
	color_output = gds_library("m2_dpt_output.gds");
	write_gds(color_output, layers = {{aM2, {1}}, {aM2_color1, {2}}, {aM2_color2, {3}}, {m2_conflict, {4}}});
}

rM2_8 @= { @ "M2.8 : Density Balancing Rule: The density of decomposed metals should be between 23 and 77%";
	//Sushant 
	density(window_layer = chip_extent(), // The polygon layer that defines the boundaries where layers are processed for density calculations
            layer_hash         = {//"nodes"      => tmp_nodes,
								 "out_color1" => aM2_color1,
								 "out_color2" => aM2_color2,},
            window_function    = color_balance_func_M,
            merge_errors = true );

}

================================================
FILE: icv/Include/FreePDK3.m3.drc.rs
================================================
// 3nm FreePDK(TM) M3 ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rM3_1 @= { @ "M3.1 : METAL3 width minimum >= 15nm";
    //Sushant
	internal1( aM3, < 0.015, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = HORIZONTAL, orthogonal = BOTH );
}

rM3_2 @= { @ "M3.2 : METAL3 spacing minimum >= 15nm";
    //Sushant
	external1(aM3, < 0.015, extension = RADIAL, intersecting = { }, intersection_angle = < 90, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
}

rM3_3 @= { @ "M3.3 : METAL3 maximum width in horizontal direction = 750nm";
    //Sushant	
	m3_w_750 = internal1( aM3, < 0.7505, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = HORIZONTAL, orthogonal = BOTH );
	aM3 not m3_w_750;	
}

m3_w_045 =wide(aM3, distance >= 0.045);
m3_w_135 =wide(aM3, distance >= 0.135);	
m3_w_405 = wide(aM3, distance >= 0.405);

m3_w_045_135 = m3_w_045 not m3_w_135;
m3_w_135_405 = m3_w_135 not m3_w_405;


rM3_4 @= { @ "M3.4 : Minimum spacing of METAL3 wider than 45nm and longer than 45nm >= 45nm";
    //Sushant
    m3_045 = aM3 not m3_w_045_135;
	mLAYER_3_1 = external2(m3_w_045_135,m3_045,distance < 0.045, extension = NONE,projection_length >= 0.045, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_3_2 = external1(m3_w_045_135,distance < 0.045, extension = NONE,projection_length >= 0.045, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_3_1 or mLAYER_3_2;
}

rM3_5 @= { @ "M3.5 : Minimum spacing of METAL3 wider than 135nm and longer than 135nm >= 135nm";
    //Sushant
    m3_135 = aM3 not m3_w_135_405;
	mLAYER_3_3 = external2(m3_w_135_405,m3_135,distance < 0.135, extension = NONE,projection_length >= 0.135, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_3_4 = external1(m3_w_135_405,distance < 0.135, extension = NONE,projection_length >= 0.135, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_3_3 or mLAYER_3_4;	
}

rM3_6 @= { @ "M3.6 : Minimum spacing of METAL3 wider than 405nm and longer than 405nm >= 405nm";
    //Sushant
	mLAYER_3_5 = external2(m3_w_405,aM3,distance < 0.405, extension = NONE,projection_length >= 0.405, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_3_6 = external1(m3_w_405,distance < 0.405, extension = NONE,projection_length >= 0.405, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_3_5 or mLAYER_3_6;	
}

rM3_7 @= { @ "M3.7 : Double patterning Error";
    //Sushant
	
	m3_Links =  external1_error(aM3, < 0.015, extension = RADIAL, intersecting = { }, intersection_angle = < 90, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
	m3_conflict = two_color(aM3, m3_Links, aM3_color1, aM3_color2, even_loops, pre_color_layer ,output_even_loops = true, output_type=ODD_LOOP_INSIDE_RING, color_preference = BALANCED ); 
	copy(m3_conflict);
	color_output = gds_library("m3_dpt_output.gds");
	write_gds(color_output, layers = {{aM3, {1}}, {aM3_color1, {2}}, {aM3_color2, {3}}, {m3_conflict, {4}}});
}

rM3_8 @= { @ "M3.8 : Density Balancing Rule: The density of decomposed metals should be between 23 and 77%";
	//Sushant 
	density(window_layer = chip_extent(), // The polygon layer that defines the boundaries where layers are processed for density calculations
            layer_hash         = {//"nodes"      => tmp_nodes,
								 "out_color1" => aM3_color1,
								 "out_color2" => aM3_color2,},
            window_function    = color_balance_func_M,
            merge_errors = true );

}

================================================
FILE: icv/Include/FreePDK3.m4.drc.rs
================================================
// 3nm FreePDK(TM) M4 ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rM4_1 @= { @ "M4.1 : METAL4 width minimum >= 24nm";
    //Sushant
	internal1( aM4, < 0.024, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = VERTICAL, orthogonal = BOTH );
}

rM4_2 @= { @ "M4.2 : METAL4 spacing minimum >= 24nm";
    //Sushant
	external1(aM4, < 0.024, extension = RADIAL, intersecting = { }, intersection_angle = < 90, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
}

rM4_3 @= { @ "M4.3 : METAL4 maximum width in vertical direction = 1200nm";
    //Sushant
    m4_w_1200 = internal1( aM4, < 1.2005, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = VERTICAL, orthogonal = BOTH );
	aM4 not m4_w_1200;	
}

m4_w_072 =wide(aM4, distance >= 0.072);
m4_w_216 =wide(aM4, distance >= 0.216);	
m4_w_648 = wide(aM4, distance >= 0.648);

m4_w_072_216 = m4_w_072 not m4_w_216;
m4_w_216_648 = m4_w_216 not m4_w_648;


rM4_4 @= { @ "M4.4 : Minimum spacing of METAL4 wider than 72nm and longer than 72nm >= 72nm";
    //Sushant
    m4_072 = aM4 not m4_w_072_216;
	mLAYER_4_1 = external2(m4_w_072_216,m4_072,distance < 0.072, extension = NONE,projection_length >= 0.072, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_4_2 = external1(m4_w_072_216,distance < 0.072, extension = NONE,projection_length >= 0.072, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_4_1 or mLAYER_4_2;
}

rM4_5 @= { @ "M4.5 : Minimum spacing of METAL4 wider than 216nm and longer than 216nm >= 216nm";
    //Sushant
    m4_216 = aM4 not m4_w_216_648;
	mLAYER_4_3 = external2(m4_w_216_648,m4_216,distance < 0.216, extension = NONE,projection_length >= 0.216, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_4_4 = external1(m4_w_216_648,distance < 0.216, extension = NONE,projection_length >= 0.216, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_4_3 or mLAYER_4_4;	
}

rM4_6 @= { @ "M4.6 : Minimum spacing of METAL4 wider than 648nm and longer than 648nm >= 648nm";
    //Sushant
	mLAYER_4_5 = external2(m4_w_648,aM4,distance < 0.648, extension = NONE,projection_length >= 0.648, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_4_6 = external1(m4_w_648,distance < 0.648, extension = NONE,projection_length >= 0.648, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_4_5 or mLAYER_4_6;	
}

================================================
FILE: icv/Include/FreePDK3.m5.drc.rs
================================================
// 3nm FreePDK(TM) M5 ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rM5_1 @= { @ "M5.1 : METAL5 width minimum >= 24nm";
    //Sushant
	internal1( aM5, < 0.024, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = HORIZONTAL, orthogonal = BOTH );
}

rM5_2 @= { @ "M5.2 : METAL5 spacing minimum >= 24nm";
    //Sushant
	external1(aM5, < 0.024, extension = RADIAL, intersecting = { }, intersection_angle = < 90,  look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
}

rM5_3 @= { @ "M5.3 : METAL5 maximum width in horizontal direction= 1200nm";
    //Sushant
    m5_w_1200 = internal1( aM5, < 1.2005, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = HORIZONTAL, orthogonal = BOTH );
	aM5 not m5_w_1200;	
}

m5_w_072 =wide(aM5, distance >= 0.072);
m5_w_216 =wide(aM5, distance >= 0.216);	
m5_w_648 = wide(aM5, distance >= 0.648);

m5_w_072_216 = m5_w_072 not m5_w_216;
m5_w_216_648 = m5_w_216 not m5_w_648;


rM5_4 @= { @ "M5.4 : Minimum spacing of METAL5 wider than 72nm and longer than 72nm >= 72nm";
    //Sushant
    m5_072 = aM5 not m5_w_072_216;
	mLAYER_5_1 = external2(m5_w_072_216,m5_072,distance < 0.072, extension = NONE,projection_length >= 0.072, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_5_2 = external1(m5_w_072_216,distance < 0.072, extension = NONE,projection_length >= 0.072, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_5_1 or mLAYER_5_2;
}

rM5_5 @= { @ "M5.5 : Minimum spacing of METAL5 wider than 216nm and longer than 216nm >= 216nm";
    //Sushant
    m5_216 = aM5 not m5_w_216_648;
	mLAYER_5_3 = external2(m5_w_216_648,m5_216,distance < 0.216, extension = NONE,projection_length >= 0.216, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_5_4 = external1(m5_w_216_648,distance < 0.216, extension = NONE,projection_length >= 0.216, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_5_3 or mLAYER_5_4;	
}

rM5_6 @= { @ "M5.6 : Minimum spacing of METAL5 wider than 648nm and longer than 648nm >= 648nm";
    //Sushant
	mLAYER_5_5 = external2(m5_w_648,aM5,distance < 0.648, extension = NONE,projection_length >= 0.648, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_5_6 = external1(m5_w_648,distance < 0.648, extension = NONE,projection_length >= 0.648, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_5_5 or mLAYER_5_6;	
}

================================================
FILE: icv/Include/FreePDK3.m6.drc.rs
================================================
// 3nm FreePDK(TM) M6 ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rM6_1 @= { @ "M6.1 : METAL6 width minimum >= 24nm";
    //Sushant
	internal1( aM6, < 0.024, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = VERTICAL, orthogonal = BOTH );
}

rM6_2 @= { @ "M6.2 : METAL6 spacing minimum >= 24nm";
    //Sushant
	external1(aM6, < 0.024, extension = RADIAL, intersecting = { }, intersection_angle = < 90, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
}

rM6_3 @= { @ "M6.3 : METAL6 maximum width in vertical direction = 1200nm";
    //Sushant
    m6_w_1200 = internal1( aM6, < 1.2005, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = VERTICAL, orthogonal = BOTH );
	aM6 not m6_w_1200;	
}

m6_w_072 =wide(aM6, distance >= 0.072);
m6_w_216 =wide(aM6, distance >= 0.216);	
m6_w_648 = wide(aM6, distance >= 0.648);

m6_w_072_216 = m6_w_072 not m6_w_216;
m6_w_216_648 = m6_w_216 not m6_w_648;


rM6_4 @= { @ "M6.4 : Minimum spacing of METAL6 wider than 72nm and longer than 72nm >= 72nm";
    //Sushant
    m6_072 = aM6 not m6_w_072_216;
	mLAYER_6_1 = external2(m6_w_072_216,m6_072,distance < 0.072, extension = NONE,projection_length >= 0.072, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_6_2 = external1(m6_w_072_216,distance < 0.072, extension = NONE,projection_length >= 0.072, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_6_1 or mLAYER_6_2;
}

rM6_5 @= { @ "M6.5 : Minimum spacing of METAL6 wider than 216nm and longer than 216nm >= 216nm";
    //Sushant
    m6_216 = aM6 not m6_w_216_648;
	mLAYER_6_3 = external2(m6_w_216_648,m6_216,distance < 0.216, extension = NONE,projection_length >= 0.216, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_6_4 = external1(m6_w_216_648,distance < 0.216, extension = NONE,projection_length >= 0.216, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_6_3 or mLAYER_6_4;	
}

rM6_6 @= { @ "M6.6 : Minimum spacing of METAL6 wider than 648nm and longer than 648nm >= 648nm";
    //Sushant
	mLAYER_6_5 = external2(m6_w_648,aM6,distance < 0.648, extension = NONE,projection_length >= 0.648, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_6_6 = external1(m6_w_648,distance < 0.648, extension = NONE,projection_length >= 0.648, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_6_5 or mLAYER_6_6;	
}

================================================
FILE: icv/Include/FreePDK3.m7.drc.rs
================================================
// 3nm FreePDK(TM) M7 ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rM7_1 @= { @ "M7.1 : METAL7 width minimum >= 40nm";
    //Sushant
	internal1( aM7, < 0.04, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = HORIZONTAL, orthogonal = BOTH );
}

rM7_2 @= { @ "M7.2 : METAL7 spacing minimum >= 40nm";
    //Sushant
	external1(aM7, < 0.04, extension = RADIAL, intersecting = { }, intersection_angle = < 90, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
}

rM7_3 @= { @ "M7.3 : METAL7 maximum width in horizontal direction = 2000nm";
    //Sushant
    m7_w_2000 = internal1( aM7, < 2.0005, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = HORIZONTAL, orthogonal = BOTH );
	aM7 not m7_w_2000;
}

m7_w_120 =wide(aM7, distance >= 0.120);
m7_w_360 =wide(aM7, distance >= 0.360);	
m7_w_1080 = wide(aM7, distance >= 1.080);

m7_w_120_360 = m7_w_120 not m7_w_360;
m7_w_360_1080 = m7_w_360 not m7_w_1080;


rM7_4 @= { @ "M7.4 : Minimum spacing of METAL7 wider than 120nm and longer than 120nm >= 120nm";
    //Sushant
    m7_120 = aM7 not m7_w_120_360;
	mLAYER_7_1 = external2(m7_w_120_360,m7_120,distance < 0.120, extension = NONE,projection_length >= 0.120, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_7_2 = external1(m7_w_120_360,distance < 0.120, extension = NONE,projection_length >= 0.120, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_7_1 or mLAYER_7_2;
}

rM7_5 @= { @ "M7.5 : Minimum spacing of METAL7 wider than 360nm and longer than 360nm >= 360nm";
    //Sushant
    m7_360 = aM7 not m7_w_360_1080;
	mLAYER_7_3 = external2(m7_w_360_1080,m7_360,distance < 0.360, extension = NONE,projection_length >= 0.360, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_7_4 = external1(m7_w_360_1080,distance < 0.360, extension = NONE,projection_length >= 0.360, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_7_3 or mLAYER_7_4;	
}

rM7_6 @= { @ "M7.6 : Minimum spacing of METAL7 wider than 1080nm and longer than 1080nm >= 1080nm";
    //Sushant
	mLAYER_7_5 = external2(m7_w_1080,aM7,distance < 1.080, extension = NONE,projection_length >= 1.080, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_7_6 = external1(m7_w_1080,distance < 1.080, extension = NONE,projection_length >= 1.080, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_7_5 or mLAYER_7_6;	
}

rM7_7 @= { @ "M7.7 : Double patterning Error";
    //Sushant
	
	m7_Links =  external1_error(aM7, < 0.04, extension = RADIAL, intersecting = { }, intersection_angle = < 90, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
	m7_conflict = two_color(aM7, m7_Links, aM7_color1, aM7_color2, even_loops, pre_color_layer ,output_even_loops = true, output_type=ODD_LOOP_INSIDE_RING, color_preference = BALANCED ); 
	copy(m7_conflict);
	color_output = gds_library("m7_dpt_output.gds");
	write_gds(color_output, layers = {{aM7, {1}}, {aM7_color1, {2}}, {aM7_color2, {3}}, {m7_conflict, {4}}});
	
	// aM7_color1 = color1_out;
	// aM7_color2 = color2_out;
}

rM7_8 @= { @ "M7.8 : Density Balancing Rule: The density of decomposed metals should be between 23 and 77%";
	//Sushant 
	density(window_layer = chip_extent(), // The polygon layer that defines the boundaries where layers are processed for density calculations
            layer_hash         = {//"nodes"      => tmp_nodes,
								 "out_color1" => aM7_color1,
								 "out_color2" => aM7_color2,},
            window_function    = color_balance_func_M,
            merge_errors = true );

}



================================================
FILE: icv/Include/FreePDK3.m8.drc.rs
================================================
// 3nm FreePDK(TM) M8 ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rM8_1 @= { @ "M8.1 : METAL8 width minimum >= 40nm";
    //Sushant
	internal1( aM8, < 0.04, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = VERTICAL, orthogonal = BOTH );
}

rM8_2 @= { @ "M8.2 : METAL8 spacing minimum >= 40nm";
    //Sushant
	external1(aM8, < 0.04, extension = RADIAL, intersecting = { }, intersection_angle = < 90, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
}

rM8_3 @= { @ "M8.3 : METAL8 maximum width in vertical direction = 2000nm";
    //Sushant
    m8_w_2000 = internal1( aM8, < 2.0005, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = VERTICAL, orthogonal = BOTH );
	aM8 not m8_w_2000;
}

m8_w_120 =wide(aM8, distance >= 0.120);
m8_w_360 =wide(aM8, distance >= 0.360);	
m8_w_1080 = wide(aM8, distance >= 1.080);

m8_w_120_360 = m8_w_120 not m8_w_360;
m8_w_360_1080 = m8_w_360 not m8_w_1080;


rM8_4 @= { @ "M8.4 : Minimum spacing of METAL8 wider than 120nm and longer than 120nm >= 120nm";
    //Sushant
    m8_120 = aM8 not m8_w_120_360;
	mLAYER_8_1 = external2(m8_w_120_360,m8_120,distance < 0.120, extension = NONE,projection_length >= 0.120, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_8_2 = external1(m8_w_120_360,distance < 0.120, extension = NONE,projection_length >= 0.120, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_8_1 or mLAYER_8_2;
}

rM8_5 @= { @ "M8.5 : Minimum spacing of METAL8 wider than 360nm and longer than 360nm >= 360nm";
    //Sushant
    m8_360 = aM8 not m8_w_360_1080;
	mLAYER_8_3 = external2(m8_w_360_1080,m8_360,distance < 0.360, extension = NONE,projection_length >= 0.360, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_8_4 = external1(m8_w_360_1080,distance < 0.360, extension = NONE,projection_length >= 0.360, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_8_3 or mLAYER_8_4;	
}

rM8_6 @= { @ "M8.6 : Minimum spacing of METAL8 wider than 1080nm and longer than 1080nm >= 1080nm";
    //Sushant
	mLAYER_8_5 = external2(m8_w_1080,aM8,distance < 1.080, extension = NONE,projection_length >= 1.080, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_8_6 = external1(m8_w_1080,distance < 1.080, extension = NONE,projection_length >= 1.080, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_8_5 or mLAYER_8_6;	
}

rM8_7 @= { @ "M8.7 : Double patterning Error";
    //Sushant
	
	m8_Links =  external1_error(aM8, < 0.04, extension = RADIAL, intersecting = { }, intersection_angle = < 90, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT);  
	m8_conflict = two_color(aM8, m8_Links, aM8_color1, aM8_color2, even_loops, pre_color_layer ,output_even_loops = true, output_type=ODD_LOOP_INSIDE_RING, color_preference = BALANCED ); 
	copy(m8_conflict);
	color_output = gds_library("m8_dpt_output.gds");
	write_gds(color_output, layers = {{aM8, {1}}, {aM8_color1, {2}}, {aM8_color2, {3}}, {m8_conflict, {4}}});
	
	// aM8_color1 = color1_out;
	// aM8_color2 = color2_out;
}

rM8_8 @= { @ "M8.8 : Density Balancing Rule: The density of decomposed metals should be between 23 and 77%";
	//Sushant 
	density(window_layer = chip_extent(), // The polygon layer that defines the boundaries where layers are processed for density calculations
            layer_hash         = {//"nodes"      => tmp_nodes,
								 "out_color1" => aM8_color1,
								 "out_color2" => aM8_color2,},
            window_function    = color_balance_func_M,
            merge_errors = true );

}

================================================
FILE: icv/Include/FreePDK3.m9.drc.rs
================================================
// 3nm FreePDK(TM) M9 ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rM9_1 @= { @ "M9.1 : METAL9 width minimum >= 40nm";
    //Sushant
	internal1( aM9, < 0.04, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = HORIZONTAL, orthogonal = BOTH );
}

rM9_2 @= { @ "M9.2 : METAL9 spacing minimum >= 40nm";
    //Sushant
	external1(aM9, < 0.04, extension = RADIAL, intersecting = { }, intersection_angle = < 90, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
}

rM9_3 @= { @ "M9.3 : METAL9 maximum width in horizontal direction = 2000nm";
    //Sushant
    m9_w_2000 = internal1( aM9, < 2.0005, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = HORIZONTAL, orthogonal = BOTH );
	aM9 not m9_w_2000;	
}

m9_w_120 =wide(aM9, distance >= 0.120);
m9_w_360 =wide(aM9, distance >= 0.360);	
m9_w_1080 = wide(aM9, distance >= 1.080);

m9_w_120_360 = m9_w_120 not m9_w_360;
m9_w_360_1080 = m9_w_360 not m9_w_1080;


rM9_4 @= { @ "M9.4 : Minimum spacing of METAL9 wider than 120nm and longer than 120nm >= 120nm";
    //Sushant
    m9_120 = aM9 not m9_w_120_360;
	mLAYER_9_1 = external2(m9_w_120_360,m9_120,distance < 0.120, extension = NONE,projection_length >= 0.120, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_9_2 = external1(m9_w_120_360,distance < 0.120, extension = NONE,projection_length >= 0.120, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_9_1 or mLAYER_9_2;
}

rM9_5 @= { @ "M9.5 : Minimum spacing of METAL9 wider than 360nm and longer than 360nm >= 360nm";
    //Sushant
    m9_360 = aM9 not m9_w_360_1080;
	mLAYER_9_3 = external2(m9_w_360_1080,m9_360,distance < 0.360, extension = NONE,projection_length >= 0.360, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_9_4 = external1(m9_w_360_1080,distance < 0.360, extension = NONE,projection_length >= 0.360, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_9_3 or mLAYER_9_4;	
}

rM9_6 @= { @ "M9.6 : Minimum spacing of METAL9 wider than 1080nm and longer than 1080nm >= 1080nm";
    //Sushant
	mLAYER_9_5 = external2(m9_w_1080,aM9,distance < 1.080, extension = NONE,projection_length >= 1.080, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_9_6 = external1(m9_w_1080,distance < 1.080, extension = NONE,projection_length >= 1.080, orientation = PARALLEL, intersecting = {}, projection = IN, orthogonal = ALL,look_thru = ALL);
	mLAYER_9_5 or mLAYER_9_6;	
}

rM9_7 @= { @ "M9.7 : Double patterning Error";
    //Sushant
	
	m9_Links =  external1_error(aM9, < 0.04, extension = RADIAL, intersecting = { }, intersection_angle = < 90, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT);   
	m9_conflict = two_color(aM9, m9_Links, aM9_color1, aM9_color2, even_loops, pre_color_layer ,output_even_loops = true, output_type=ODD_LOOP_INSIDE_RING, color_preference = BALANCED ); 
	copy(m9_conflict);
	color_output = gds_library("m9_dpt_output.gds");
	write_gds(color_output, layers = {{aM9, {1}}, {aM9_color1, {2}}, {aM9_color2, {3}}, {m9_conflict, {4}}});
}

rM9_8 @= { @ "M9.8 : Density Balancing Rule: The density of decomposed metals should be between 23 and 77%";
	//Sushant 
	density(window_layer = chip_extent(), // The polygon layer that defines the boundaries where layers are processed for density calculations
            layer_hash         = {//"nodes"      => tmp_nodes,
								 "out_color1" => aM9_color1,
								 "out_color2" => aM9_color2,},
            window_function    = color_balance_func_M,
            merge_errors = true );

}

================================================
FILE: icv/Include/FreePDK3.nimpim.drc.rs
================================================
// 3nm FreePDK(TM) NIMPIM ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rNIMPIM_1 @= { @ "NIM/PIM.1 : Minimum width/spacing/notch of NIM/PIM >= 84 nm";
    //Sushant
	internal1( aNIM, < 0.084, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = HORIZONTAL, orthogonal = BOTH );
	internal1( aPIM, < 0.084, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = HORIZONTAL, orthogonal = BOTH );
	external1( aNIM, < 0.084, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = HORIZONTAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
	external1( aNIM, < 0.084, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = VERTICAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
	external1( aPIM, < 0.084, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = HORIZONTAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
	external1( aPIM, < 0.084, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = VERTICAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
	
}

rNIMPIM_2 @= { @ "NIM/PIM.2 : Minimum vertical width of NIM/PIM  >= 57.5 nm";
    //Sushant
	internal1( aNIM, < 0.0575, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = VERTICAL, orthogonal = BOTH );
	internal1( aPIM, < 0.0575, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = VERTICAL, orthogonal = BOTH );
}

rNIMPIM_5 @= { @ "NIM/PIM.5 : Minimum enlose of ACT by NIM/PIM on vertical direction >= 20 nm";
	gNIMPIM = or(aNIM, aPIM);
    	not_enclosed_by( aACT, gNIMPIM, distances = { { { 0.0135, NONE }, { 0.020, NONE }, { 0.0135, NONE }, { 0.020, NONE } } }, intersecting_failures = {     ACUTE, POINT_TOUCH, TOUCH }, not_inside = FAIL );    
}

rNIMPIM_6 @= { @ "NIM/PIM.6 : Minimum enlose of ACT by NIM/PIM on horizontal direction >= 13.5 nm";
	gNIMPIM = or(aNIM, aPIM);
    	not_enclosed_by( aACT, gNIMPIM, distances = { { { 0.0135, NONE }, { 0.020, NONE }, { 0.0135, NONE }, { 0.020, NONE } } }, intersecting_failures = {     ACUTE, POINT_TOUCH, TOUCH }, not_inside = FAIL );	    
}

rNIMPIM_7 @= { @ "NIM/PIM.7 : Minimum NIM/PIM area/enclosed area >= 4830 nm^2";
    //Sushant
	area( aPIM, < 0.004830);
	area( aNIM, < 0.004830);
}


rNIMPIM_10 @= { @ "NIM/PIM.10 : NIM and PIM may not overlap ";
    //Sushant
	interacting(aNIM, aPIM, include_touch = NONE);
}


================================================
FILE: icv/Include/FreePDK3.nw.drc.rs
================================================
// 3nm FreePDK(TM) NW ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rNW_1 @= { @ "NW.1 : Minimum vertical width of NW >= 57.5 nm";
    internal1( aNW, < 0.0575, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = VERTICAL, orthogonal = BOTH );
}

rNW_2 @= { @ "NW.2 : Minimum horizontal width of NW >= 84 nm";
   internal1( aNW, < 0.084, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = HORIZONTAL, orthogonal = BOTH );
}

rNW_3 @= { @ "NW.3 : Minimum area/enclosed area of NW >= 6237 nm^2";
    area( aNW, < 0.006237);
}

rNW_4 @= { @ "NW.4 : NW must be orthogonal";
    angle_edge( aNW, ( 0, 90 ) );
}

rNW_5 @= { @ "NW.5 : Minimum extension of NW past GATE (not cut by GCUT) >= 7 nm";
	//and(aGCUT, aGATE);
   enclose( aGATE, aNW, < 0.007, extension = NONE, direction = VERTICAL);
}


================================================
FILE: icv/Include/FreePDK3.rdl.drc.rs
================================================
// 3nm FreePDK(TM) RDL ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rMRDL_1 @= { @ "MRDL.1 : RDL width minimum >= 1.6um";
    //Sushant
	internal1( aRDL, < 1.6, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = VERTICAL, orthogonal = BOTH );
}

rMRDL_2 @= { @ "MRDL.2 : RDL spacing minimum >= 1.6um";
    //Sushant
	external1(aRDL, < 1.6, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = VERTICAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
}

================================================
FILE: icv/Include/FreePDK3.v0a.drc.rs
================================================
// 3nm FreePDK(TM) V0A ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rV0A_1 @= { @ "V0A.1 : V0A shape is a square";
    not_aspect_ratio( aV0A, direction = SHORT_BY_LONG, orientation = ORTHOGONAL, ratio = == 1 );
}

rV0A_2 @= { @ "V0A.2 : V0A is a square with 13 nm edge length";
    aspect_ratio( rectangles( aV0A, sides = { != 0.013, != 0.013 } ), direction = SHORT_BY_LONG, ratio = == 1 );
}

rV0A_3 @= { @ "V0A.3 : Minimum spacing of V0A - Full alignment >= 29 nm";
   //Sushant
	external1(aV0A, < 0.029, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = HORIZONTAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
	external1(aV0A, < 0.029, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = VERTICAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT);   
}

rV0A_4 @= { @ "V0A.4 : Minimum corner-to-corner spacing between two V0A instances >= 30 nm";
   //Sushant
	external_corner1(aV0A, <0.030);
}

rV0A_5 @= { @ "V0A.5 : V0A must always interact with M0A and M0B";
    not_interacting( aV0A, aM0A );
    not_interacting( aV0A, aM0B );
}

rV0A_6 @= { @ "V0A.6 : V0A enclosure by M0B on two opposite sides, horizontal direction >= 6 nm";
   //Sushant
	sV0A_VERTICAL_EDGES = angle_edge( aV0A, == 90 );
    sM0B_VERTICAL_EDGES = angle_edge( aM0B, == 90 );
    enclose_error( sV0A_VERTICAL_EDGES, sM0B_VERTICAL_EDGES, < 0.006, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT, relational = OUTSIDE  );	
	and_edge(sM0B_VERTICAL_EDGES, aV0A);
}

rV0A_7 @= { @ "V0A.7 : V0A enclosure by M0B on two opposite sides, vertical direction = -1 nm";
   //Sushant
	gCHECK_1i = and(aV0A, aM0B);
    gCHECK_2i = grow(gCHECK_1i, north = 0.001, south = 0.001);
    not(aV0A, gCHECK_2i);
    not(gCHECK_2i, aV0A);	
}

rV0A_8 @= { @ "V0A.8 : V0A enclosure by M0A on two opposite sides, horizontal direction = 1 nm";
   //Sushant
//	gGRV0A8_check = enclose( aV0A, aM0A, distance == 0.001, direction = HORIZONTAL );
//    aV0A not gGRV0A8_check;
	sV0A_VERTICAL_EDGES = angle_edge( aV0A, == 90 );
    sM0A_VERTICAL_EDGES = angle_edge( aM0A, == 90 );
    enclose_error( sV0A_VERTICAL_EDGES, sM0A_VERTICAL_EDGES, < 0.001, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT );
	//aV0A not aM0A;
	and_edge(sM0A_VERTICAL_EDGES, aV0A);
}

rV0A_9 @= { @ "V0A.9 : V0A enclosure by M0A on two opposite sides, vertical direction";
   //Sushant
	sV0A_HORIZONTAL_EDGES = angle_edge( aV0A, == 0 );
    sM0A_HORIZONTAL_EDGES = angle_edge( aM0A, == 0 );
    enclose_error( sM0A_HORIZONTAL_EDGES, sV0A_HORIZONTAL_EDGES, < 0.001, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT );

}

rV0A_10 @= { @ "V0A.10 : Minimum space of V0A and M0B of different net >= 8 nm";
   //Sushant
	external2( aV0A, aM0B, < 0.008, connectivity = DIFFERENT_NET, extension = RADIAL, intersecting = { }, intersection_angle = < 90, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT, connect_sequence = CONNECT_DB);
}

rV0A_11 @= { @ "V0A.11 : Minimum space of V0A and M0A of different net >= 16.5 nm";
   //Sushant
	external2( aV0A, aM0A, < 0.0165, connectivity = DIFFERENT_NET, extension = RADIAL, intersecting = { }, intersection_angle = < 90, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT, connect_sequence = CONNECT_DB);
}

rV0A_12 @= { @ "V0A.12 : V0A may not  interact with GCUT or DUMMY or GATE layer";
   //Sushant
    gGRV0A12_check = or(aDUMMY, aGATE);
    interacting( aV0A, gGRV0A12_check, include_touch = ALL);
    interacting( aV0A, aDUMMY, include_touch = ALL);
}

rV0A_13 @= { @ "V0A.13 : Minimum area overlap between M0A and V0A >= 156 nm^2";
	gV0A13 = and(aM0A, aV0A);
	area(gV0A13, < 0.000156);
}


================================================
FILE: icv/Include/FreePDK3.v0b.drc.rs
================================================
// 3nm FreePDK(TM) V0B ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rV0B_1 @= { @ "V0B.1 : V0B shape is a rectangle";
	//Sushant
     not_rectangles(aV0B);
}

rV0B_2 @= { @ "V0B.2 : V0B exact horizontal width  = 14 nm";
	//Sushant
    gGRV0B2_check = internal1( aV0B, == 0.014, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = HORIZONTAL, orthogonal = BOTH );
	aV0B not gGRV0B2_check;
}

rV0B_3 @= { @ "V0B.3 : V0B exact vertical width = 10 nm";
	//Sushant
    gGRV0B3_check = internal1( aV0B, == 0.010, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = VERTICAL, orthogonal = BOTH );
	aV0B not gGRV0B3_check;	
}

rV0B_4 @= { @ "V0B.4 : Minimum vertical spacing of V0B - Full alignment >= 10.5 nm";
	//Sushant
    external1(aV0B, < 0.0105, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = VERTICAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT);   
}

rV0B_5 @= { @ "V0B.5 : Minimum horizontal spacing of V0B - Full alignment >= 20 nm";
	//Sushant
	external1(aV0B, < 0.020, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = HORIZONTAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT);    
}

rV0B_6 @= { @ "V0B.6 : Minimum corner-to-corner spacing between two V0B instances >= 22 nm";
	//Sushant
   	external_corner1(aV0B, <0.022); 
}

rV0B_7 @= { @ "V0B.7 : V0B must always interact with M0B and M1";
	//Sushant
    not_interacting( aV0B, aM0B );
    not_interacting( aV0B, aM1 );
}

rV0B_8 @= { @ "V0B.8 : V0B enclosure by M0B on two opposite sides, horizontal direction = 4 nm";
	//Sushant
    //gGRV0B8_check = enclose( aV0B, aM0B, distance == 0.004, direction = HORIZONTAL, extension = NONE );
    //aV0B not gGRV0B8_check;
	sV0B_VERTICAL_EDGES = angle_edge( aV0B, == 90 );
    sM0B_VERTICAL_EDGES = angle_edge( aM0B, == 90 );
    enclose_error( sV0B_VERTICAL_EDGES, sM0B_VERTICAL_EDGES, < 0.004, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT );
	aV0B not aM0B;

}

rV0B_9 @= { @ "V0B.9 : V0B enclosure by M0B on two opposite sides, VERTICAL direction = 0 nm";
	//Sushant
    //gGRV0B9_check = enclose( aV0B, aM0B, distance == 0, direction = VERTICAL, extension = RECTANGLE );
    //aV0B not gGRV0B9_check;
    sM0B_HORIZONTAL_EDGES = angle_edge( aM0B, == 0 );
	and_edge( sM0B_HORIZONTAL_EDGES, aV0B, false );
}

rV0B_10 @= { @ "V0B.10 : V0B enclosure by M1 on two opposite sides, horizontal direction = 0 nm";
	//Sushant
    //gGRV0B10_check = enclose( aV0B, aM1, distance == 0, direction = HORIZONTAL, extension = RECTANGLE );
    //aV0B not gGRV0B10_check;
	sM1_VERTICAL_EDGES = angle_edge( aM1, == 90 );
	and_edge( sM1_VERTICAL_EDGES, aV0B, false );
}

rV0B_11 @= { @ "V0B.11 : V0B enclosure by M1 on two opposite sides, VERTICAL direction = 2.5 nm";
	//Sushant
    //gGRV0B11_check = enclose( aV0B, aM1, distance == 0.0025, direction = VERTICAL, extension = RECTANGLE );
    //aV0B not gGRV0B11_check;
	sV0B_HORIZONTAL_EDGES = angle_edge( aV0B, == 0 );
    sM1_HORIZONTAL_EDGES = angle_edge( aM1, == 0 );
    enclose_error( sV0B_HORIZONTAL_EDGES, sM1_HORIZONTAL_EDGES, < 0.0025, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT );
	aV0B not aM1;
}




================================================
FILE: icv/Include/FreePDK3.v1.drc.rs
================================================
// 3nm FreePDK(TM) V1 ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rV1_1 @= { @ "V1.1 : V1 shape is a square";
// Sushant 
    not_aspect_ratio( aV1, direction = SHORT_BY_LONG, orientation = ORTHOGONAL, ratio = == 1 );
}

rV1_2 @= { @ "V1.2 : V1 is a square with 14nm edge length";
// Sushant 
    aspect_ratio( rectangles( aV1, sides = { != 0.014, != 0.014 } ), direction = SHORT_BY_LONG, ratio = == 1 );    
}

rV1_3 @= { @ "V1.3 : Minimum spacing of V1 - Full alignment >= 14 nm";
   //Sushant
	external1(aV1, < 0.014, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = HORIZONTAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
	external1(aV1, < 0.014, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = VERTICAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT);   
}


rV1_4 @= { @ "V1.4 : V1 should be enclosed between M1 and M2";
    //Sushant
    not_interacting( aV1, aM1 );
    not_interacting( aV1, aM2 );
}

rV1_5 @= { @ "V1.5 : V1 enclosure by M1 on two opposite sides, horizontal direction = 0nm";
	//Sushant
    //sM1_VERTICAL_EDGES = angle_edge( aM1, == 90 );
	//and_edge( sM1_VERTICAL_EDGES, aV1, false );
	aV1 not aM1;
}

rV1_6 @= { @ "V1.6 : V1 enclosure by M1 on two opposite sides, vertical direction >= 3nm";
	//Sushant
    sV1_HORIZONTAL_EDGES = angle_edge( aV1, == 0 );
    sM1_HORIZONTAL_EDGES = angle_edge( aM1, == 0 );
    enclose_error( sV1_HORIZONTAL_EDGES, sM1_HORIZONTAL_EDGES, < 0.003, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT );
    aV1 not aM1;
}

rV1_7 @= { @ "V1.7 : V1 enclosure by M2 on two opposite sides, horizontal direction >= 3nm";
	//Sushant
    sV1_VERTICAL_EDGES = angle_edge( aV1, == 90 );
    sM2_VERTICAL_EDGES = angle_edge( aM2, == 90 );
    enclose_error( sV1_VERTICAL_EDGES, sM2_VERTICAL_EDGES, < 0.003, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT );
    aV1 not aM2;
}

rV1_8 @= { @ "V1.8 : V1 enclosure by M2 on two opposite sides, vertical direction = 0nm";
	//Sushant
    // sM2_HORIZONTAL_EDGES = angle_edge( aM2, == 90 );
	// and_edge( sM2_HORIZONTAL_EDGES, aV1, false );
	aV1 not aM2;
}

rV1_9 @= { @ "V1.9 : Minimum area overlap between M1 and V1 = 19nm^2";
	//Sushant
    gV10 = and(aM1, aV1);
	area(gV10, < 0.000196);
}


================================================
FILE: icv/Include/FreePDK3.v10.drc.rs
================================================
// 3nm FreePDK(TM) V10 ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rV10_1 @= { @ "V10.1 : V10 shape is square";
	//Sushant
    not_aspect_ratio( aV10, direction = SHORT_BY_LONG, orientation = ORTHOGONAL, ratio = == 1 );
}

rV10_2 @= { @ "V10.2 : V10 is a square with 80nm edge length";
	//Sushant
    aspect_ratio( rectangles( aV10, sides = { != 0.08, != 0.08 } ), direction = SHORT_BY_LONG, ratio = == 1 );  
}

rV10_3 @= { @ "V10.3 : Minimum spacing of V10 - Full alignment >= 80nm";
	//Sushant
    external1(aV10, < 0.08, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = HORIZONTAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
	external1(aV10, < 0.08, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = VERTICAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT);
}

rV10_4 @= { @ "V10.4 : V10 should be enclosed between M10 and M11";
	//Sushant
    not_interacting( aV10, aM10 );
    not_interacting( aV10, aM11 );
}

rV10_5 @= { @ "V10.5 : V10 enclosure by M10 on two opposite sides, horizontal direction >= 10nm";
	//Sushant
    sV10_VERTICAL_EDGES = angle_edge( aV10, == 90 );
    sM10_VERTICAL_EDGES = angle_edge( aM10, == 90 );
    enclose_error( sV10_VERTICAL_EDGES, sM10_VERTICAL_EDGES, < 0.01, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT );
    aV10 not aM10;
}

rV10_6 @= { @ "V10.6 : V10 enclosure by M10 on two opposite sides, vertical direction = 0nm";
	//Sushant
    // sM10_HORIZONTAL_EDGES = angle_edge( aM10, == 0 );
	// and_edge( sM10_HORIZONTAL_EDGES, aV10, false ); 
	aV10 not aM10;
}

rV10_7 @= { @ "V10.7 : V10 enclosure by M11 on two opposite sides, horizontal direction = 0nm";
	//Sushant
    // sM11_VERTICAL_EDGES = angle_edge( aM11, == 90 );
	// and_edge( sM11_VERTICAL_EDGES, aV10, false );
	aV10 not aM11;
}

rV10_8 @= { @ "V10.8 : V10 enclosure by M11 on two opposite sides, vertical direction >= 10nm";
	//Sushant
    sV10_HORIZONTAL_EDGES = angle_edge( aV10, == 0 );
    sM11_HORIZONTAL_EDGES = angle_edge( aM11, == 0 );
    enclose_error( sV10_HORIZONTAL_EDGES, sM11_HORIZONTAL_EDGES, < 0.01, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT );
    aV10 not aM11; 
}

rV10_9 @= { @ "V10.9 : Minimum area overlap between M10 and V10 >= 6400nm^2";
	//Sushant
    gV9 = and(aM10, aV10);
	area(gV9, < 0.006400);
}

================================================
FILE: icv/Include/FreePDK3.v11.drc.rs
================================================
// 3nm FreePDK(TM) V11 ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rV11_1 @= { @ "V11.1 : V11 shape is rectangle";
	//Sushant
    not_rectangles(aV11);
}

rV11_2 @= { @ "V11.2 : V11 is a rectangle with 80nm horizontal edge and 160nm vertical edge";
	//Sushant
    gGRV11_1_check = internal1( aV11, == 0.08, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = HORIZONTAL, orthogonal = BOTH );
	aV11 not gGRV11_1_check;
    gGRV11_2_check = internal1( aV11, == 0.160, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = VERTICAL, orthogonal = BOTH );
	aV11 not gGRV11_2_check;
}

rV11_3a @= { @ "V11.3a : Minimum horizontal spacing of V11 - Full alignment >= 80nm";
	//Sushant
    external1(aV11, < 0.08, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = HORIZONTAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
}

rV11_3b @= { @ "V11.3b : Minimum vertical spacing of V11 - Full alignment >= 160nm";
	//Sushant
    external1(aV11, < 0.160, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = VERTICAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
}

rV11_4 @= { @ "V11.4 : V11 should be enclosed between M11 and M12";
	//Sushant
    not_interacting( aV11, aM11 );
    not_interacting( aV11, aM12 );
}

rV11_5 @= { @ "V11.5 : V11 enclosure by M11 on two opposite sides, horizontal direction = 0nm";
	//Sushant
    // sM11_VERTICAL_EDGES = angle_edge( aM11, == 90 );
	// and_edge( sM11_VERTICAL_EDGES, aV11, false );
	aV11 not aM11;
}

rV11_6 @= { @ "V11.6 : V11 enclosure by M11 on two opposite sides, vertical direction >= 10nm";
	//Sushant
    sV11_HORIZONTAL_EDGES = angle_edge( aV11, == 0 );
    sM11_HORIZONTAL_EDGES = angle_edge( aM11, == 0 );
    enclose_error( sV11_HORIZONTAL_EDGES, sM11_HORIZONTAL_EDGES, < 0.01, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT );
    aV11 not aM11;
}

rV11_7 @= { @ "V11.7 : V11 enclosure by M12 on two opposite sides, horizontal direction >= 10nm";
	//Sushant
    sV11_VERTICAL_EDGES = angle_edge( aV11, == 90 );
    sM12_VERTICAL_EDGES = angle_edge( aM12, == 90 );
    enclose_error( sV11_VERTICAL_EDGES, sM12_VERTICAL_EDGES, < 0.01, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT );
    aV11 not aM12;
}

rV11_8 @= { @ "V11.8 : V11 enclosure by M12 on two opposite sides, vertical direction = 0nm";
	//Sushant
    // sM12_HORIZONTAL_EDGES = angle_edge( aM12, == 90 );
	// and_edge( sM12_HORIZONTAL_EDGES, aV11, false );
	aV11 not aM12;
}

rV11_9 @= { @ "V11.9 : Minimum area overlap between M11 and V11 >= 12800nm^2";
	//Sushant
    gV10 = and(aM11, aV11);
	area(gV10, < 0.012800); 
}

================================================
FILE: icv/Include/FreePDK3.v12.drc.rs
================================================
// 3nm FreePDK(TM) V12 ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rV12_1 @= { @ "V12.1 : V12 shape is square";
	//Sushant
    not_aspect_ratio( aV12, direction = SHORT_BY_LONG, orientation = ORTHOGONAL, ratio = == 1 );
}

rV12_2 @= { @ "V12.2 : V12 is a square with 160nm edge length";
	//Sushant
    aspect_ratio( rectangles( aV12, sides = { != 0.16, != 0.16 } ), direction = SHORT_BY_LONG, ratio = == 1 );
}

rV12_3 @= { @ "V12.3 : Minimum spacing of V12 - Full alignment >= 160nm";
	//Sushant
    external1(aV12, < 0.16, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = HORIZONTAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
	external1(aV12, < 0.16, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = VERTICAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT);
}

rV12_4 @= { @ "V12.4 : V12 should be enclosed between M12 and M13";
	//Sushant
    not_interacting( aV12, aM12 );
    not_interacting( aV12, aM13 );
}

rV12_5 @= { @ "V12.5 : V12 enclosure by M12 on two opposite sides, horizontal direction >= 10nm";
	//Sushant
    sV12_VERTICAL_EDGES = angle_edge( aV12, == 90 );
    sM12_VERTICAL_EDGES = angle_edge( aM12, == 90 );
    enclose_error( sV12_VERTICAL_EDGES, sM12_VERTICAL_EDGES, < 0.01, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT );
    aV12 not aM12;
}

rV12_6 @= { @ "V12.6 : V12 enclosure by M12 on two opposite sides, vertical direction = 0nm";
	//Sushant
    // sM12_HORIZONTAL_EDGES = angle_edge( aM12, == 0 );
	// and_edge( sM12_HORIZONTAL_EDGES, aV12, false ); 
	aV12 not aM12;
}

rV12_7 @= { @ "V12.7 : V12 enclosure by M13 on two opposite sides, horizontal direction = 0nm";
	//Sushant
    // sM13_VERTICAL_EDGES = angle_edge( aM13, == 90 );
	// and_edge( sM13_VERTICAL_EDGES, aV12, false );
	aV12 not aM13;
}

rV12_8 @= { @ "V12.8 : V12 enclosure by M13 on two opposite sides, vertical direction >= 10nm";
	//Sushant
    sV12_HORIZONTAL_EDGES = angle_edge( aV12, == 0 );
    sM13_HORIZONTAL_EDGES = angle_edge( aM13, == 0 );
    enclose_error( sV12_HORIZONTAL_EDGES, sM13_HORIZONTAL_EDGES, < 0.01, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT );
    aV12 not aM13; 
}

rV12_9 @= { @ "V12.9 : Minimum area overlap between M12 and V12 >= 25600nm^2";
	//Sushant
    gV12 = and(aM12, aV12);
	area(gV12, < 0.025600);
}

================================================
FILE: icv/Include/FreePDK3.v2.drc.rs
================================================
// 3nm FreePDK(TM) V2 ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rV2_1 @= { @ "V2.1 : V2 shape is square";
// Sushant 
    not_aspect_ratio( aV2, direction = SHORT_BY_LONG, orientation = ORTHOGONAL, ratio = == 1 );
}

rV2_2 @= { @ "V2.2 : V2 is a square with 14nm edge length";
// Sushant 
    aspect_ratio( rectangles( aV2, sides = { != 0.014, != 0.014 } ), direction = SHORT_BY_LONG, ratio = == 1 );    
}

rV2_3 @= { @ "V2.3 : Minimum spacing of V2 - Full alignment >= 15nm";
   //Sushant
	external1(aV2, < 0.015, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = HORIZONTAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
	external1(aV2, < 0.015, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = VERTICAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT);   
}

rV2_4 @= { @ "V2.4 : V2 should be enclosed between M2 and M3";
    //Sushant
    not_interacting( aV2, aM2 );
    not_interacting( aV2, aM3 );
}

rV2_5 @= { @ "V2.5 : V2 enclosure by M2 on two opposite sides, horizontal direction >= 3nm";
	//Sushant
    sV2_VERTICAL_EDGES = angle_edge( aV2, == 90 );
    sM2_VERTICAL_EDGES = angle_edge( aM2, == 90 );
    enclose_error( sV2_VERTICAL_EDGES, sM2_VERTICAL_EDGES, < 0.003, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT );
    aV2 not aM2;
}

rV2_6 @= { @ "V2.6 : V2 enclosure by M2 on two opposite sides, vertical direction = 0nm";
	//Sushant
    // sM2_HORIZONTAL_EDGES = angle_edge( aM2, == 0 );
	// and_edge( sM2_HORIZONTAL_EDGES, aV2, false );
	aV2 not aM2;
}

rV2_7 @= { @ "V2.7 : V2 enclosure by M3 on two opposite sides, horizontal direction = 0nm";
	//Sushant
    // sM3_VERTICAL_EDGES = angle_edge( aM3, == 90 );
	// and_edge( sM3_VERTICAL_EDGES, aV2, false );
	aV2 not aM3;
}

rV2_8 @= { @ "V2.8 : V2 enclosure by M3 on two opposite sides, vertical direction >= 3nm";
	//Sushant
    sV2_HORIZONTAL_EDGES = angle_edge( aV2, == 0 );
    sM3_HORIZONTAL_EDGES = angle_edge( aM3, == 0 );
    enclose_error( sV2_HORIZONTAL_EDGES, sM3_HORIZONTAL_EDGES, < 0.003, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT );
    aV2 not aM3;
}

rV2_9 @= { @ "V2.9 : Minimum area overlap between M2 and V2 >= 196nm^2";
	//Sushant
    gV10 = and(aM2, aV2);
	area(gV10, < 0.000196);
}


================================================
FILE: icv/Include/FreePDK3.v3.drc.rs
================================================
// 3nm FreePDK(TM) V3 ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rV3_1 @= { @ "V3.1 : V3 shape is rectangle";
	//Sushant
    not_rectangles(aV3); 
}

rV3_2 @= { @ "V3.2 : V3 is a rectangle with 15nm horizontal edge and 24nm vertical edge";
	//Sushant
    gGRV3_1_check = internal1( aV3, == 0.015, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = HORIZONTAL, orthogonal = BOTH );
	aV3 not gGRV3_1_check;
    gGRV3_2_check = internal1( aV3, == 0.024, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = VERTICAL, orthogonal = BOTH );
	aV3 not gGRV3_2_check;	 
}

rV3_3a @= { @ "V3.3a : Minimum horizontal spacing of V3 - Full alignment >= 15nm";
	//Sushant
    external1(aV3, < 0.015, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = HORIZONTAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
}

rV3_3b @= { @ "V3.3b : Minimum vertical spacing of V3 - Full alignment >= 24nm";
	//Sushant
    external1(aV3, < 0.024, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = VERTICAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
}

rV3_4 @= { @ "V3.4 : V3 should be enclosed between M3 and M4";
	//Sushant
    not_interacting( aV3, aM3 );
    not_interacting( aV3, aM4 );
}

rV3_5 @= { @ "V3.5 : V3 enclosure by M3 on two opposite sides, horizontal direction == 0nm";
	//Sushant
    // sM3_VERTICAL_EDGES = angle_edge( aM3, == 90 );
	// and_edge( sM3_VERTICAL_EDGES, aV3, false );
	aV3 not aM3;
}

rV3_6 @= { @ "V3.6 : V3 enclosure by M3 on two opposite sides, vertical direction >= 3nm";
	//Sushant
    sV3_HORIZONTAL_EDGES = angle_edge( aV3, == 0 );
    sM3_HORIZONTAL_EDGES = angle_edge( aM3, == 0 );
    enclose_error( sV3_HORIZONTAL_EDGES, sM3_HORIZONTAL_EDGES, < 0.003, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT );
    aV3 not aM3;
}

rV3_7 @= { @ "V3.7 : V3 enclosure by M4 on two opposite sides, horizontal direction >= 3nm";
	//Sushant
    sV3_VERTICAL_EDGES = angle_edge( aV3, == 90 );
    sM4_VERTICAL_EDGES = angle_edge( aM4, == 90 );
    enclose_error( sV3_VERTICAL_EDGES, sM4_VERTICAL_EDGES, < 0.003, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT );
    aV3 not aM4;
}

rV3_8 @= { @ "V3.8 : V3 enclosure by M4 on two opposite sides, vertical direction == 0nm";
	//Sushant
    // sM4_HORIZONTAL_EDGES = angle_edge( aM4, == 90 );
	// and_edge( sM4_HORIZONTAL_EDGES, aV3, false );
	aV3 not aM4;
}

rV3_9 @= { @ "V3.9 : Minimum area overlap between M3 and V3 >= 360nm^2";
	//Sushant
    gV11 = and(aM3, aV3);
	area(gV11, < 0.000360); 
}

================================================
FILE: icv/Include/FreePDK3.v4.drc.rs
================================================
// 3nm FreePDK(TM) V4 ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rV4_1 @= { @ "V4.1 : V4 shape is square";
	//Sushant
    not_aspect_ratio( aV4, direction = SHORT_BY_LONG, orientation = ORTHOGONAL, ratio = == 1 );
}

rV4_2 @= { @ "V4.2 : V4 is a square with 24nm edge length";
	//Sushant
    aspect_ratio( rectangles( aV4, sides = { != 0.024, != 0.024 } ), direction = SHORT_BY_LONG, ratio = == 1 );  
}

rV4_3 @= { @ "V4.3 : Minimum spacing of V4 - Full alignment >= 24nm";
	//Sushant
    external1(aV4, < 0.024, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = HORIZONTAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT);  
	
	external1(aV4, < 0.024, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = VERTICAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
}

rV4_3_1 @= { @ "V4.3 : Minimum spacing of V4 - Full alignment >= 24nm";
	//Sushant
	  
}

rV4_4 @= { @ "V4.4 : V4 should be enclosed between M4 and M5";
	//Sushant
    not_interacting( aV4, aM4 );
    not_interacting( aV4, aM5 );
}

rV4_5 @= { @ "V4.5 : V4 enclosure by M4 on two opposite sides, horizontal direction >= 10nm";
	//Sushant
    sV4_VERTICAL_EDGES = angle_edge( aV4, == 90 );
    sM4_VERTICAL_EDGES = angle_edge( aM4, == 90 );
    enclose_error( sV4_VERTICAL_EDGES, sM4_VERTICAL_EDGES, < 0.01, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT );
    aV4 not aM4;
}

rV4_6 @= { @ "V4.6 : V4 enclosure by M4 on two opposite sides, vertical direction == 0nm";
	//Sushant
    // sM4_HORIZONTAL_EDGES = angle_edge( aM4, == 0 );
	// and_edge( sM4_HORIZONTAL_EDGES, aV4, false ); 
	aV4 not aM4;
}

rV4_7 @= { @ "V4.7 : V4 enclosure by M5 on two opposite sides, horizontal direction == 0nm";
	//Sushant
    // sM5_VERTICAL_EDGES = angle_edge( aM5, == 90 );
	// and_edge( sM5_VERTICAL_EDGES, aV4, false );
	aV4 not aM5;
}

rV4_8 @= { @ "V4.8 : V4 enclosure by M5 on two opposite sides, vertical direction >= 10nm";
	//Sushant
    sV4_HORIZONTAL_EDGES = angle_edge( aV4, == 0 );
    sM5_HORIZONTAL_EDGES = angle_edge( aM5, == 0 );
    enclose_error( sV4_HORIZONTAL_EDGES, sM5_HORIZONTAL_EDGES, < 0.01, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT );
    aV4 not aM5; 
}

rV4_9 @= { @ "V4.9 : Minimum area overlap between M4 and V4 >= 576nm^2";
	//Sushant
    gV9 = and(aM4, aV4);
	area(gV9, < 0.000576);     
}

================================================
FILE: icv/Include/FreePDK3.v5.drc.rs
================================================
// 3nm FreePDK(TM) V5 ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rV5_1 @= { @ "V5.1 : V5 shape is square";
	//Sushant
    not_aspect_ratio( aV5, direction = SHORT_BY_LONG, orientation = ORTHOGONAL, ratio = == 1 );
}

rV5_2 @= { @ "V5.2 : V5 is a square with 24nm edge length";
	//Sushant
    aspect_ratio( rectangles( aV5, sides = { != 0.024, != 0.024 } ), direction = SHORT_BY_LONG, ratio = == 1 );
}

rV5_3 @= { @ "V5.3 : Minimum spacing of V5 - Full alignment >= 24nm";
	//Sushant
    external1(aV5, < 0.024, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = HORIZONTAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
	external1(aV5, < 0.024, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = VERTICAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT);   
}

rV5_4 @= { @ "V5.4 : V5 should be enclosed between M5 and M6";
	//Sushant
    not_interacting( aV5, aM5 );
    not_interacting( aV5, aM6 ); 
}

rV5_5 @= { @ "V5.5 : V5 enclosure by M5 on two opposite sides, horizontal direction = 0nm";
	//Sushant
    // sM5_VERTICAL_EDGES = angle_edge( aM5, == 90 );
	// and_edge( sM5_VERTICAL_EDGES, aV5, false );
	aV5 not aM5;
}

rV5_6 @= { @ "V5.6 : V5 enclosure by M5 on two opposite sides, vertical direction >= 10nm";
	//Sushant
    sV5_HORIZONTAL_EDGES = angle_edge( aV5, == 0 );
    sM5_HORIZONTAL_EDGES = angle_edge( aM5, == 0 );
    enclose_error( sV5_HORIZONTAL_EDGES, sM5_HORIZONTAL_EDGES, < 0.01, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT );
    aV5 not aM5;
}

rV5_7 @= { @ "V5.7 : V5 enclosure by M6 on two opposite sides, horizontal direction >= 10nm";
	//Sushant
    sV5_VERTICAL_EDGES = angle_edge( aV5, == 90 );
    sM6_VERTICAL_EDGES = angle_edge( aM6, == 90 );
    enclose_error( sV5_VERTICAL_EDGES, sM6_VERTICAL_EDGES, < 0.01, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT );
    aV5 not aM6; 
}

rV5_8 @= { @ "V5.8 : V5 enclosure by M6 on two opposite sides, vertical direction = 0nm";
	//Sushant
    // sM6_HORIZONTAL_EDGES = angle_edge( aM6, == 90 );
	// and_edge( sM6_HORIZONTAL_EDGES, aV5, false ); 
	aV5 not aM6; 
}

rV5_9 @= { @ "V5.9 : Minimum area overlap between M5 and V5 >= 576nm^2";
	//Sushant
    gV9 = and(aM5, aV5);
	area(gV9, < 0.000576); 
}



================================================
FILE: icv/Include/FreePDK3.v6.drc.rs
================================================
// 3nm FreePDK(TM) V6 ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rV6_1 @= { @ "V6.1 : V6 shape is rectangle";
	//Sushant
    not_rectangles(aV6); 
}

rV6_2 @= { @ "V6.2 : V6 is a rectangle with 40nm horizontal edge and 24nm vertical edge";
	//Sushant
    gGRV6_1_check = internal1( aV6, == 0.04, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = HORIZONTAL, orthogonal = BOTH );
	aV6 not gGRV6_1_check;
    gGRV6_2_check = internal1( aV6, == 0.024, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = VERTICAL, orthogonal = BOTH );
	aV6 not gGRV6_2_check;
}

rV6_3a @= { @ "V6.3a : Minimum horizontal spacing of V6 - Full alignment >= 40nm";
	//Sushant
    external1(aV6, < 0.04, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = HORIZONTAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT);
}

rV6_3b @= { @ "V6.3b : Minimum vertical spacing of V6 - Full alignment >= 24nm";
	//Sushant
    external1(aV6, < 0.024, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = VERTICAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
}

rV6_4 @= { @ "V6.4 : V6 should be enclosed between M6 and M7";
	//Sushant
    not_interacting( aV6, aM6 );
    not_interacting( aV6, aM7 );
}

rV6_5 @= { @ "V6.5 : V6 enclosure by M6 on two opposite sides, horizontal direction >= 10nm";
	//Sushant
    sV6_VERTICAL_EDGES = angle_edge( aV6, == 90 );
    sM6_VERTICAL_EDGES = angle_edge( aM6, == 90 );
    enclose_error( sV6_VERTICAL_EDGES, sM6_VERTICAL_EDGES, < 0.01, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT );
    aV6 not aM6; 
}

rV6_6 @= { @ "V6.6 : V6 enclosure by M6 on two opposite sides, vertical direction = 0nm";
	//Sushant
    sM6_HORIZONTAL_EDGES = angle_edge( aM6, == 0 );
	and_edge( sM6_HORIZONTAL_EDGES, aV6, false ); 
}

rV6_7 @= { @ "V6.7 : V6 enclosure by M7 on two opposite sides, horizontal direction = 0nm";
	//Sushant
    sM7_VERTICAL_EDGES = angle_edge( aM7, == 90 );
	and_edge( sM7_VERTICAL_EDGES, aV6, false );
}

rV6_8 @= { @ "V6.8 : V6 enclosure by M7 on two opposite sides, vertical direction >= 10nm";
	//Sushant
    sV6_HORIZONTAL_EDGES = angle_edge( aV6, == 0 );
    sM7_HORIZONTAL_EDGES = angle_edge( aM7, == 0 );
    enclose_error( sV6_HORIZONTAL_EDGES, sM7_HORIZONTAL_EDGES, < 0.01, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT );
    aV6 not aM7; 
}

rV6_9 @= { @ "V6.9 : Minimum area overlap between M6 and V6 >= 960 nm^2";
	//Sushant
    gV10 = and(aM6, aV6);
	area(gV10, < 0.000960);  
}


================================================
FILE: icv/Include/FreePDK3.v7.drc.rs
================================================
// 3nm FreePDK(TM) V7 ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rV7_1 @= { @ "V7.1 : V7 shape is square";
	//Sushant
    not_aspect_ratio( aV7, direction = SHORT_BY_LONG, orientation = ORTHOGONAL, ratio = == 1 );
}

rV7_2 @= { @ "V7.2 : V7 is a square with 40nm edge length";
	//Sushant
    aspect_ratio( rectangles( aV7, sides = { != 0.04, != 0.04 } ), direction = SHORT_BY_LONG, ratio = == 1 );    
}

rV7_3 @= { @ "V7.3 : Minimum spacing of V7 - Full alignment >= 40nm";
	//Sushant
    external1(aV7, < 0.04, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = HORIZONTAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
	external1(aV7, < 0.04, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = VERTICAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT);   
}

rV7_4 @= { @ "V7.4 : V7 should be enclosed between M7 and M8";
	//Sushant
    not_interacting( aV7, aM7 );
    not_interacting( aV7, aM8 );
}

rV7_5 @= { @ "V7.5 : V7 enclosure by M7 on two opposite sides, horizontal direction = 0nm";
	//Sushant
    // sM7_VERTICAL_EDGES = angle_edge( aM7, == 90 );
	// and_edge( sM7_VERTICAL_EDGES, aV7, false );
	aV7 not aM7;	
}

rV7_6 @= { @ "V7.6 : V7 enclosure by M7 on two opposite sides, vertical direction >= 10nm";
	//Sushant
    sV7_HORIZONTAL_EDGES = angle_edge( aV7, == 0 );
    sM7_HORIZONTAL_EDGES = angle_edge( aM7, == 0 );
    enclose_error( sV7_HORIZONTAL_EDGES, sM7_HORIZONTAL_EDGES, < 0.01, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT );
    aV7 not aM7; 
}

rV7_7 @= { @ "V7.7 : V7 enclosure by M8 on two opposite sides, horizontal direction >= 10nm";
	//Sushant
    sV7_VERTICAL_EDGES = angle_edge( aV7, == 90 );
    sM8_VERTICAL_EDGES = angle_edge( aM8, == 90 );
    enclose_error( sV7_VERTICAL_EDGES, sM8_VERTICAL_EDGES, < 0.01, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT );
    aV7 not aM8; 
}

rV7_8 @= { @ "V7.8 : V7 enclosure by M8 on two opposite sides, vertical direction = 0nm";
	//Sushant
    // sM8_HORIZONTAL_EDGES = angle_edge( aM8, == 90 );
	// and_edge( sM8_HORIZONTAL_EDGES, aV7, false );
	aV7 not aM8; 
}

rV7_9 @= { @ "V7.9 : Minimum area overlap between M7 and V7 >= 1600 nm^2";
	//Sushant
    gV9 = and(aM7, aV7);
	area(gV9, < 0.001600);
}

================================================
FILE: icv/Include/FreePDK3.v8.drc.rs
================================================
// 3nm FreePDK(TM) V8 ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rV8_1 @= { @ "V8.1 : V8 shape is square";
	//Sushant
    not_aspect_ratio( aV8, direction = SHORT_BY_LONG, orientation = ORTHOGONAL, ratio = == 1 );
}

rV8_2 @= { @ "V8.2 : V8 is a square with 40nm edge length";
	//Sushant
    aspect_ratio( rectangles( aV8, sides = { != 0.04, != 0.04 } ), direction = SHORT_BY_LONG, ratio = == 1 );    
}

rV8_3 @= { @ "V8.3 : Minimum spacing of V8 - Full alignment >= 40nm";
	//Sushant
    external1(aV8, < 0.04, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = HORIZONTAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
	external1(aV8, < 0.04, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = VERTICAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT);  
}

rV8_4 @= { @ "V8.4 : V8 should be enclosed between M8 and M9";
	//Sushant
    not_interacting( aV8, aM8 );
    not_interacting( aV8, aM9 );
}

rV8_5 @= { @ "V8.5 : V8 enclosure by M8 on two opposite sides, horizontal direction >= 10nm";
	//Sushant
    sV8_VERTICAL_EDGES = angle_edge( aV8, == 90 );
    sM8_VERTICAL_EDGES = angle_edge( aM8, == 90 );
    enclose_error( sV8_VERTICAL_EDGES, sM8_VERTICAL_EDGES, < 0.01, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT );
    aV8 not aM8;
}

rV8_6 @= { @ "V8.6 : V8 enclosure by M8 on two opposite sides, vertical direction = 0nm";
	//Sushant
    // sM8_HORIZONTAL_EDGES = angle_edge( aM8, == 0 );
	// and_edge( sM8_HORIZONTAL_EDGES, aV8, false ); 
	aV8 not aM8;
}

rV8_7 @= { @ "V8.7 : V8 enclosure by M9 on two opposite sides, horizontal direction = 0nm";
	//Sushant
    // sM9_VERTICAL_EDGES = angle_edge( aM9, == 90 );
	// and_edge( sM9_VERTICAL_EDGES, aV8, false );
	aV8 not aM9;
}

rV8_8 @= { @ "V8.8 : V8 enclosure by M9 on two opposite sides, vertical direction >= 10nm";
	//Sushant
    sV8_HORIZONTAL_EDGES = angle_edge( aV8, == 0 );
    sM9_HORIZONTAL_EDGES = angle_edge( aM9, == 0 );
    enclose_error( sV8_HORIZONTAL_EDGES, sM9_HORIZONTAL_EDGES, < 0.01, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT );
    aV8 not aM9;
}

rV8_9 @= { @ "V8.9 : Minimum area overlap between M8 and V8 >= 1600nm^2";
	//Sushant
    gV9 = and(aM8, aV8);
	area(gV9, < 0.001600);
}


================================================
FILE: icv/Include/FreePDK3.v9.drc.rs
================================================
// 3nm FreePDK(TM) V9 ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rV9_1 @= { @ "V9.1 : V9 shape is rectangle";
	//Sushant
    not_rectangles(aV9);
}

rV9_2 @= { @ "V9.2 : V9 is a rectangle with 40nm horizontal edge and 80nm vertical edge";
	//Sushant
    gGRV9_1_check = internal1( aV9, == 0.04, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = HORIZONTAL, orthogonal = BOTH );
	aV9 not gGRV9_1_check;
    gGRV9_2_check = internal1( aV9, == 0.08, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = VERTICAL, orthogonal = BOTH );
	aV9 not gGRV9_2_check;
}

rV9_3a @= { @ "V9.3a : Minimum horizontal spacing of V9 - Full alignment >= 40nm";
	//Sushant
    external1(aV9, < 0.04, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = HORIZONTAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
}

rV9_3b @= { @ "V9.3b : Minimum vertical spacing of V9 - Full alignment >= 80nm";
	//Sushant
    external1(aV9, < 0.08, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = VERTICAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
}

rV9_4 @= { @ "V9.4 : V9 should be enclosed between M9 and M10";
	//Sushant
    not_interacting( aV9, aM9 );
    not_interacting( aV9, aM10 );
}

rV9_5 @= { @ "V9.5 : V9 enclosure by M9 on two opposite sides, horizontal direction = 0nm";
	//Sushant
    // sM9_VERTICAL_EDGES = angle_edge( aM9, == 90 );
	// and_edge( sM9_VERTICAL_EDGES, aV9, false ); 
	aV9 not aM9;
}

rV9_6 @= { @ "V9.6 : V9 enclosure by M9 on two opposite sides, vertical direction >= 10nm";
	//Sushant
    sV9_HORIZONTAL_EDGES = angle_edge( aV9, == 0 );
    sM9_HORIZONTAL_EDGES = angle_edge( aM9, == 0 );
    enclose_error( sV9_HORIZONTAL_EDGES, sM9_HORIZONTAL_EDGES, < 0.01, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT );
    aV9 not aM9;
}

rV9_7 @= { @ "V9.7 : V9 enclosure by M10 on two opposite sides, horizontal direction >= 10nm";
	//Sushant
    sV9_VERTICAL_EDGES = angle_edge( aV9, == 90 );
    sM10_VERTICAL_EDGES = angle_edge( aM10, == 90 );
    enclose_error( sV9_VERTICAL_EDGES, sM10_VERTICAL_EDGES, < 0.01, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT );
    aV9 not aM10;
}

rV9_8 @= { @ "V9.8 : V9 enclosure by M10 on two opposite sides, vertical direction = 0nm";
	//Sushant
    // sM10_HORIZONTAL_EDGES = angle_edge( aM10, == 90 );
	// and_edge( sM10_HORIZONTAL_EDGES, aV9, false );
	aV9 not aM10;
}

rV9_9 @= { @ "V9.9 : Minimum area overlap between M9 and V9 >= 3200nm^2";
	//Sushant
    gV10 = and(aM9, aV9);
	area(gV10, < 0.003200);
}

================================================
FILE: icv/Include/FreePDK3.vbpr.drc.rs
================================================
// 3nm FreePDK(TM) VBPR ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rVBPR_1 @= { @ "VBPR.1 : VBPR must be rectangle";
    not_rectangles(aVBPR);
}

rVBPR_2 @= { @ "VBPR.2 : Exact vertical width of VBPR = 10.5 nm";
// Sushant
	gGRVBPR2_check = internal1( aVBPR, == 0.0105, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = VERTICAL, orthogonal = BOTH );
	aVBPR not gGRVBPR2_check;
}

rVBPR_3 @= { @ "VBPR.3 : Exact horizontal length of VBPR = 15 nm";
    gGRVBPR3_check = internal1( aVBPR, == 0.015, extension = NONE, extension_look_past = POINT_TO_POINT, intersecting = {  }, projection_filter = MUTUAL_NON_ORTHOGONAL, projection_mode = ASYMMETRIC, direction = HORIZONTAL, orthogonal = BOTH );
	aVBPR not gGRVBPR3_check;
}

rVBPR_4 @= { @ "VBPR.4 : VBPR enclosure by BPR on two opposite sides, horizontal direction = 13.5 nm";
//    gGRVBPR4_chk = enclose( aVBPR, aBPR, distance == 13.5, direction = HORIZONTAL );
//    aVBPR not gGRVBPR4_chk;
	sVBPR_VERTICAL_EDGES = angle_edge( aVBPR, == 90 );
    sBPR_VERTICAL_EDGES = angle_edge( aBPR, == 90 );
    enclose_error( sVBPR_VERTICAL_EDGES, sBPR_VERTICAL_EDGES, < 0.0135, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT );
}

rVBPR_5 @= { @ "VBPR.5 : VBPR enclosure by M0A on two opposite sides, vertical direction = 0 nm";
//    gGRVBPR5_chk = enclose( aVBPR, aM0A, distance == 0, direction = VERTICAL );
//    aVBPR not gGRVBPR5_chk;
	sM0A_HORIZONTAL_EDGES = angle_edge( aM0A, == 0 );
	and_edge( sM0A_HORIZONTAL_EDGES, aVBPR, false );
	aVBPR not aM0A;
}

rVBPR_6 @= { @ "VBPR.6 : Minimum horizontal spacing between two VBPR layers >= 27 nm";
// Sushant
	external1(aVBPR, < 0.027, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = HORIZONTAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
}

rVBPR_7 @= { @ "VBPR.7 : Minimum vertical spacing betwenn two VBPR layers >= 10 nm";
// Sushant 
	external1(aVBPR, < 0.010, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = VERTICAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT);   
}

rVBPR_8 @= { @ "VBPR.8 : Minmum spacing between VBPR and ACTIVE layer polygons not on the same net >= 10 nm";
    external2( aVBPR, aACT, < 0.010, extension = RADIAL, intersecting = { }, intersection_angle = < 90, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT);
}

rVBPR_9 @= { @ "VBPR.9 : VBPR may not interact with GCUT or GATE or DUMMY";
    gGRVBPR9_check = or(aGCUT, aGATE);
    interacting( aVBPR, gGRVBPR9_check, include_touch = NONE);
    interacting( aVBPR, aDUMMY, include_touch = NONE);
}


================================================
FILE: icv/Include/FreePDK3.vrdl.drc.rs
================================================
// 3nm FreePDK(TM) VRDL ICV Design Rules
//
// Copyright (c) 2021, North Carolina State University
// All Rights Reserved.
//
// Please see the file LICENSE included with this distribution for license.
// You may not use these files except in compliance with the License.

rVRDL_1 @= { @ "VRDL.1 : VRDL shape is square";
    //Sushant
	not_aspect_ratio( aVRDL, direction = SHORT_BY_LONG, orientation = ORTHOGONAL, ratio = == 1 );
}

rVRDL_2 @= { @ "VRDL.2 : VRDL is a square with 160nm edge length";
    //Sushant
	aspect_ratio( rectangles( aVRDL, sides = { != 0.16, != 0.16 } ), direction = SHORT_BY_LONG, ratio = == 1 );
}

rVRDL_3 @= { @ "VRDL.3 : Minimum spacing of V12 - Full alignment >= 160nm";
	//Sushant
    external1(aVRDL, < 0.16, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = HORIZONTAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT); 
	external1(aVRDL, < 0.16, extension = RADIAL, intersecting = { }, intersection_angle = < 90, direction = VERTICAL, look_thru = NONE, relational = { }, extension_look_past = POINT_TO_POINT);
}

rVRDL_4 @= { @ "VRDL.4 : VRDL must be enclosed between M13 and RDL layers";
	//Sushant
    not_interacting( aVRDL, aM13 );
    not_interacting( aVRDL, aRDL );
}

rVRDL_5 @= { @ "VRDL.5 : VRDL enclosure by M13 in horizontal direction >= 0nm";
	//Sushant
    aVRDL not aM13;
}

rVRDL_6 @= { @ "VRDL.6 : VRDL enclosure by M13 in vertical direction >= 10nm";
	//Sushant
    sVRDL_HORIZONTAL_EDGES = angle_edge( aVRDL, == 0 );
    sM13_HORIZONTAL_EDGES = angle_edge( aM13, == 0 );
    enclose_error( sVRDL_HORIZONTAL_EDGES, sM13_HORIZONTAL_EDGES, < 0.01, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT );
    aVRDL not aM13;
}

rVRDL_7 @= { @ "VRDL.7 : VRDL enclosure by RDL in horizontal direction >= 80nm";
	//Sushant
    sVRDL_VERTICAL_EDGES = angle_edge( aVRDL, == 90 );
    sRDL_VERTICAL_EDGES = angle_edge( aRDL, == 90 );
    enclose_error( sVRDL_VERTICAL_EDGES, sRDL_VERTICAL_EDGES, < 0.08, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT );
    aVRDL not aRDL;
}

rVRDL_8 @= { @ "VRDL.8 : VRDL enclosure by RDL in vertical direction >= 80nm";
	//Sushant
    sVRDL_HORIZONTAL_EDGES = angle_edge( aVRDL, == 0 );
    sRDL_HORIZONTAL_EDGES = angle_edge( aRDL, == 0 );
    enclose_error( sVRDL_HORIZONTAL_EDGES, sRDL_HORIZONTAL_EDGES, < 0.08, edge_containment = INSIDE_TO_OUTSIDE, extension = RADIAL, intersecting = {  }, look_thru = NOT_ADJACENT );
    aVRDL not aRDL;
}

rVRDL_9 @= { @ "VRDL.9 : Minimum area overlap between M13 and VRDL >= 25600nm^2";
	//Sushant
    gVRDL = and(aM13, aVRDL);
	area(gVRDL, < 0.025600);
}

================================================
FILE: starrc/FreePDK3_RCtyp.TLUPlus/.filelist
================================================
BPR.substrate.GATE
BPR.substrate.M0A
BPR.substrate.ACT
BPR.substrate.M0B
BPR.substrate.M1
BPR.substrate.M2
GATE.BPR.M0A
GATE.BPR.ACT
GATE.BPR.M0B
GATE.BPR.M1
GATE.BPR.M2
GATE.BPR.M3
GATE.substrate.M0A
GATE.substrate.ACT
GATE.substrate.M0B
GATE.substrate.M1
GATE.substrate.M2
GATE.substrate.M3
M0A.GATE.ACT
M0A.GATE.M0B
M0A.GATE.M1
M0A.GATE.M2
M0A.GATE.M3
M0A.GATE.M4
M0A.BPR.ACT
M0A.BPR.M0B
M0A.BPR.M1
M0A.BPR.M2
M0A.BPR.M3
M0A.BPR.M4
M0A.substrate.ACT
M0A.substrate.M0B
M0A.substrate.M1
M0A.substrate.M2
M0A.substrate.M3
M0A.substrate.M4
ACT.M0A.M0B
ACT.M0A.M1
ACT.M0A.M2
ACT.M0A.M3
ACT.M0A.M4
ACT.M0A.M5
ACT.GATE.M0B
ACT.GATE.M1
ACT.GATE.M2
ACT.GATE.M3
ACT.GATE.M4
ACT.GATE.M5
ACT.BPR.M0B
ACT.BPR.M1
ACT.BPR.M2
ACT.BPR.M3
ACT.BPR.M4
ACT.BPR.M5
ACT.substrate.M0B
ACT.substrate.M1
ACT.substrate.M2
ACT.substrate.M3
ACT.substrate.M4
ACT.substrate.M5
M0B.ACT.M1
M0B.ACT.M2
M0B.ACT.M3
M0B.ACT.M4
M0B.ACT.M5
M0B.ACT.M6
M0B.M0A.M1
M0B.M0A.M2
M0B.M0A.M3
M0B.M0A.M4
M0B.M0A.M5
M0B.M0A.M6
M0B.GATE.M1
M0B.GATE.M2
M0B.GATE.M3
M0B.GATE.M4
M0B.GATE.M5
M0B.GATE.M6
M0B.BPR.M1
M0B.BPR.M2
M0B.BPR.M3
M0B.BPR.M4
M0B.BPR.M5
M0B.BPR.M6
M0B.substrate.M1
M0B.substrate.M2
M0B.substrate.M3
M0B.substrate.M4
M0B.substrate.M5
M0B.substrate.M6
M1.M0B.M2
M1.M0B.M3
M1.M0B.M4
M1.M0B.M5
M1.M0B.M6
M1.M0B.M7
M1.ACT.M2
M1.ACT.M3
M1.ACT.M4
M1.ACT.M5
M1.ACT.M6
M1.ACT.M7
M1.M0A.M2
M1.M0A.M3
M1.M0A.M4
M1.M0A.M5
M1.M0A.M6
M1.M0A.M7
M1.GATE.M2
M1.GATE.M3
M1.GATE.M4
M1.GATE.M5
M1.GATE.M6
M1.GATE.M7
M1.BPR.M2
M1.BPR.M3
M1.BPR.M4
M1.BPR.M5
M1.BPR.M6
M1.BPR.M7
M1.substrate.M2
M1.substrate.M3
M1.substrate.M4
M1.substrate.M5
M1.substrate.M6
M1.substrate.M7
M2.M1.M3
M2.M1.M4
M2.M1.M5
M2.M1.M6
M2.M1.M7
M2.M1.M8
M2.M0B.M3
M2.M0B.M4
M2.M0B.M5
M2.M0B.M6
M2.M0B.M7
M2.M0B.M8
M2.ACT.M3
M2.ACT.M4
M2.ACT.M5
M2.ACT.M6
M2.ACT.M7
M2.ACT.M8
M2.M0A.M3
M2.M0A.M4
M2.M0A.M5
M2.M0A.M6
M2.M0A.M7
M2.M0A.M8
M2.GATE.M3
M2.GATE.M4
M2.GATE.M5
M2.GATE.M6
M2.GATE.M7
M2.GATE.M8
M2.BPR.M3
M2.BPR.M4
M2.BPR.M5
M2.BPR.M6
M2.BPR.M7
M2.BPR.M8
M3.M2.M4
M3.M2.M5
M3.M2.M6
M3.M2.M7
M3.M2.M8
M3.M2.M9
M3.M1.M4
M3.M1.M5
M3.M1.M6
M3.M1.M7
M3.M1.M8
M3.M1.M9
M3.M0B.M4
M3.M0B.M5
M3.M0B.M6
M3.M0B.M7
M3.M0B.M8
M3.M0B.M9
M3.ACT.M4
M3.ACT.M5
M3.ACT.M6
M3.ACT.M7
M3.ACT.M8
M3.ACT.M9
M3.M0A.M4
M3.M0A.M5
M3.M0A.M6
M3.M0A.M7
M3.M0A.M8
M3.M0A.M9
M3.GATE.M4
M3.GATE.M5
M3.GATE.M6
M3.GATE.M7
M3.GATE.M8
M3.GATE.M9
M4.M3.M5
M4.M3.M6
M4.M3.M7
M4.M3.M8
M4.M3.M9
M4.M3.M10
M4.M2.M5
M4.M2.M6
M4.M2.M7
M4.M2.M8
M4.M2.M9
M4.M2.M10
M4.M1.M5
M4.M1.M6
M4.M1.M7
M4.M1.M8
M4.M1.M9
M4.M1.M10
M4.M0B.M5
M4.M0B.M6
M4.M0B.M7
M4.M0B.M8
M4.M0B.M9
M4.M0B.M10
M4.ACT.M5
M4.ACT.M6
M4.ACT.M7
M4.ACT.M8
M4.ACT.M9
M4.ACT.M10
M4.M0A.M5
M4.M0A.M6
M4.M0A.M7
M4.M0A.M8
M4.M0A.M9
M4.M0A.M10
M5.M4.M6
M5.M4.M7
M5.M4.M8
M5.M4.M9
M5.M4.M10
M5.M4.M11
M5.M3.M6
M5.M3.M7
M5.M3.M8
M5.M3.M9
M5.M3.M10
M5.M3.M11
M5.M2.M6
M5.M2.M7
M5.M2.M8
M5.M2.M9
M5.M2.M10
M5.M2.M11
M5.M1.M6
M5.M1.M7
M5.M1.M8
M5.M1.M9
M5.M1.M10
M5.M1.M11
M5.M0B.M6
M5.M0B.M7
M5.M0B.M8
M5.M0B.M9
M5.M0B.M10
M5.M0B.M11
M5.ACT.M6
M5.ACT.M7
M5.ACT.M8
M5.ACT.M9
M5.ACT.M10
M5.ACT.M11
M6.M5.M7
M6.M5.M8
M6.M5.M9
M6.M5.M10
M6.M5.M11
M6.M5.M12
M6.M4.M7
M6.M4.M8
M6.M4.M9
M6.M4.M10
M6.M4.M11
M6.M4.M12
M6.M3.M7
M6.M3.M8
M6.M3.M9
M6.M3.M10
M6.M3.M11
M6.M3.M12
M6.M2.M7
M6.M2.M8
M6.M2.M9
M6.M2.M10
M6.M2.M11
M6.M2.M12
M6.M1.M7
M6.M1.M8
M6.M1.M9
M6.M1.M10
M6.M1.M11
M6.M1.M12
M6.M0B.M7
M6.M0B.M8
M6.M0B.M9
M6.M0B.M10
M6.M0B.M11
M6.M0B.M12
M7.M6.M8
M7.M6.M9
M7.M6.M10
M7.M6.M11
M7.M6.M12
M7.M6.M13
M7.M5.M8
M7.M5.M9
M7.M5.M10
M7.M5.M11
M7.M5.M12
M7.M5.M13
M7.M4.M8
M7.M4.M9
M7.M4.M10
M7.M4.M11
M7.M4.M12
M7.M4.M13
M7.M3.M8
M7.M3.M9
M7.M3.M10
M7.M3.M11
M7.M3.M12
M7.M3.M13
M7.M2.M8
M7.M2.M9
M7.M2.M10
M7.M2.M11
M7.M2.M12
M7.M2.M13
M7.M1.M8
M7.M1.M9
M7.M1.M10
M7.M1.M11
M7.M1.M12
M7.M1.M13
M8.M7.M9
M8.M7.M10
M8.M7.M11
M8.M7.M12
M8.M7.M13
M8.M7.RDL
M8.M6.M9
M8.M6.M10
M8.M6.M11
M8.M6.M12
M8.M6.M13
M8.M6.RDL
M8.M5.M9
M8.M5.M10
M8.M5.M11
M8.M5.M12
M8.M5.M13
M8.M5.RDL
M8.M4.M9
M8.M4.M10
M8.M4.M11
Download .txt
gitextract_qx27svws/

├── LICENSE
├── README.md
├── doc/
│   └── FreePDK3_Release_Notes.md
├── examples/
│   └── FreePDK3_examples/
│       ├── .oalib
│       ├── and/
│       │   ├── data.dm
│       │   ├── layout/
│       │   │   ├── data.dm
│       │   │   ├── layout.oa
│       │   │   └── master.tag
│       │   ├── schematic/
│       │   │   ├── data.dm
│       │   │   ├── master.tag
│       │   │   └── sch.oa
│       │   └── symbol/
│       │       ├── master.tag
│       │       └── symbol.oa
│       ├── d_ff/
│       │   ├── layout/
│       │   │   ├── data.dm
│       │   │   ├── layout.oa
│       │   │   └── master.tag
│       │   └── schematic/
│       │       ├── master.tag
│       │       └── sch.oa
│       ├── d_latch/
│       │   ├── data.dm
│       │   ├── layout/
│       │   │   ├── data.dm
│       │   │   ├── layout.oa
│       │   │   └── master.tag
│       │   ├── schematic/
│       │   │   ├── master.tag
│       │   │   └── sch.oa
│       │   └── symbol/
│       │       ├── master.tag
│       │       └── symbol.oa
│       ├── data.dm
│       ├── inverter/
│       │   ├── data.dm
│       │   ├── layout/
│       │   │   ├── data.dm
│       │   │   ├── layout.oa
│       │   │   └── master.tag
│       │   ├── schematic/
│       │   │   ├── master.tag
│       │   │   └── sch.oa
│       │   └── symbol/
│       │       ├── master.tag
│       │       └── symbol.oa
│       ├── inverter_testbench/
│       │   ├── HSPICE_default/
│       │   │   ├── analyses.xml
│       │   │   ├── designVariables.xml
│       │   │   ├── importedFiles.xml
│       │   │   ├── master.tag
│       │   │   ├── outputs.xml
│       │   │   ├── saeState.file
│       │   │   └── state.xml
│       │   └── schematic/
│       │       ├── master.tag
│       │       └── sch.oa
│       ├── lvs_nmos/
│       │   ├── layout/
│       │   │   ├── data.dm
│       │   │   ├── layout.oa
│       │   │   └── master.tag
│       │   └── schematic/
│       │       ├── master.tag
│       │       └── sch.oa
│       ├── lvs_pmos/
│       │   ├── layout/
│       │   │   ├── data.dm
│       │   │   ├── layout.oa
│       │   │   └── master.tag
│       │   └── schematic/
│       │       ├── master.tag
│       │       └── sch.oa
│       ├── nand/
│       │   ├── data.dm
│       │   ├── layout/
│       │   │   ├── data.dm
│       │   │   ├── layout.oa
│       │   │   └── master.tag
│       │   ├── schematic/
│       │   │   ├── master.tag
│       │   │   └── sch.oa
│       │   └── symbol/
│       │       ├── master.tag
│       │       └── symbol.oa
│       ├── nor/
│       │   ├── layout/
│       │   │   ├── data.dm
│       │   │   ├── layout.oa
│       │   │   └── master.tag
│       │   └── schematic/
│       │       ├── master.tag
│       │       └── sch.oa
│       ├── or/
│       │   ├── data.dm
│       │   ├── layout/
│       │   │   ├── data.dm
│       │   │   ├── layout.oa
│       │   │   └── master.tag
│       │   ├── schematic/
│       │   │   ├── master.tag
│       │   │   └── sch.oa
│       │   └── symbol/
│       │       ├── master.tag
│       │       └── symbol.oa
│       ├── xor/
│       │   ├── layout/
│       │   │   ├── data.dm
│       │   │   ├── layout.oa
│       │   │   └── master.tag
│       │   └── schematic/
│       │       ├── master.tag
│       │       └── sch.oa
│       └── xor_double/
│           ├── layout/
│           │   ├── data.dm
│           │   ├── layout.oa
│           │   └── master.tag
│           └── schematic/
│               ├── master.tag
│               └── sch.oa
├── hspice/
│   └── models/
│       └── fet.mod
├── icv/
│   ├── FreePDK3_main.drc.rs
│   ├── FreePDK3_main.lvs.rs
│   ├── FreePDK3_main.lvs.rs.user_functions
│   └── Include/
│       ├── FreePDK3.act.drc.rs
│       ├── FreePDK3.antenna.drc.rs
│       ├── FreePDK3.bpr.drc.rs
│       ├── FreePDK3.dummy.drc.rs
│       ├── FreePDK3.gate.drc.rs
│       ├── FreePDK3.gcon.drc.rs
│       ├── FreePDK3.gcut.drc.rs
│       ├── FreePDK3.m0a.drc.rs
│       ├── FreePDK3.m0b.drc.rs
│       ├── FreePDK3.m1.drc.rs
│       ├── FreePDK3.m10.drc.rs
│       ├── FreePDK3.m11.drc.rs
│       ├── FreePDK3.m12.drc.rs
│       ├── FreePDK3.m13.drc.rs
│       ├── FreePDK3.m2.drc.rs
│       ├── FreePDK3.m3.drc.rs
│       ├── FreePDK3.m4.drc.rs
│       ├── FreePDK3.m5.drc.rs
│       ├── FreePDK3.m6.drc.rs
│       ├── FreePDK3.m7.drc.rs
│       ├── FreePDK3.m8.drc.rs
│       ├── FreePDK3.m9.drc.rs
│       ├── FreePDK3.nimpim.drc.rs
│       ├── FreePDK3.nw.drc.rs
│       ├── FreePDK3.rdl.drc.rs
│       ├── FreePDK3.v0a.drc.rs
│       ├── FreePDK3.v0b.drc.rs
│       ├── FreePDK3.v1.drc.rs
│       ├── FreePDK3.v10.drc.rs
│       ├── FreePDK3.v11.drc.rs
│       ├── FreePDK3.v12.drc.rs
│       ├── FreePDK3.v2.drc.rs
│       ├── FreePDK3.v3.drc.rs
│       ├── FreePDK3.v4.drc.rs
│       ├── FreePDK3.v5.drc.rs
│       ├── FreePDK3.v6.drc.rs
│       ├── FreePDK3.v7.drc.rs
│       ├── FreePDK3.v8.drc.rs
│       ├── FreePDK3.v9.drc.rs
│       ├── FreePDK3.vbpr.drc.rs
│       └── FreePDK3.vrdl.drc.rs
├── starrc/
│   ├── FreePDK3_RCtyp.TLUPlus/
│   │   ├── .FreePDK3_RCtyp.tmp
│   │   ├── .filelist
│   │   ├── .format
│   │   ├── .itf
│   │   ├── ACT.BPR.M0B
│   │   ├── ACT.BPR.M1
│   │   ├── ACT.BPR.M2
│   │   ├── ACT.BPR.M3
│   │   ├── ACT.BPR.M4
│   │   ├── ACT.BPR.M5
│   │   ├── ACT.GATE.M0B
│   │   ├── ACT.GATE.M1
│   │   ├── ACT.GATE.M2
│   │   ├── ACT.GATE.M3
│   │   ├── ACT.GATE.M4
│   │   ├── ACT.GATE.M5
│   │   ├── ACT.M0A.M0B
│   │   ├── ACT.M0A.M1
│   │   ├── ACT.M0A.M2
│   │   ├── ACT.M0A.M3
│   │   ├── ACT.M0A.M4
│   │   ├── ACT.M0A.M5
│   │   ├── ACT.substrate.M0B
│   │   ├── ACT.substrate.M1
│   │   ├── ACT.substrate.M2
│   │   ├── ACT.substrate.M3
│   │   ├── ACT.substrate.M4
│   │   ├── ACT.substrate.M5
│   │   ├── BPR.substrate.ACT
│   │   ├── BPR.substrate.GATE
│   │   ├── BPR.substrate.M0A
│   │   ├── BPR.substrate.M0B
│   │   ├── BPR.substrate.M1
│   │   ├── BPR.substrate.M2
│   │   ├── GATE.BPR.ACT
│   │   ├── GATE.BPR.M0A
│   │   ├── GATE.BPR.M0B
│   │   ├── GATE.BPR.M1
│   │   ├── GATE.BPR.M2
│   │   ├── GATE.BPR.M3
│   │   ├── GATE.substrate.ACT
│   │   ├── GATE.substrate.M0A
│   │   ├── GATE.substrate.M0B
│   │   ├── GATE.substrate.M1
│   │   ├── GATE.substrate.M2
│   │   ├── GATE.substrate.M3
│   │   ├── M0A.BPR.ACT
│   │   ├── M0A.BPR.M0B
│   │   ├── M0A.BPR.M1
│   │   ├── M0A.BPR.M2
│   │   ├── M0A.BPR.M3
│   │   ├── M0A.BPR.M4
│   │   ├── M0A.GATE.ACT
│   │   ├── M0A.GATE.M0B
│   │   ├── M0A.GATE.M1
│   │   ├── M0A.GATE.M2
│   │   ├── M0A.GATE.M3
│   │   ├── M0A.GATE.M4
│   │   ├── M0A.substrate.ACT
│   │   ├── M0A.substrate.M0B
│   │   ├── M0A.substrate.M1
│   │   ├── M0A.substrate.M2
│   │   ├── M0A.substrate.M3
│   │   ├── M0A.substrate.M4
│   │   ├── M0B.ACT.M1
│   │   ├── M0B.ACT.M2
│   │   ├── M0B.ACT.M3
│   │   ├── M0B.ACT.M4
│   │   ├── M0B.ACT.M5
│   │   ├── M0B.ACT.M6
│   │   ├── M0B.BPR.M1
│   │   ├── M0B.BPR.M2
│   │   ├── M0B.BPR.M3
│   │   ├── M0B.BPR.M4
│   │   ├── M0B.BPR.M5
│   │   ├── M0B.BPR.M6
│   │   ├── M0B.GATE.M1
│   │   ├── M0B.GATE.M2
│   │   ├── M0B.GATE.M3
│   │   ├── M0B.GATE.M4
│   │   ├── M0B.GATE.M5
│   │   ├── M0B.GATE.M6
│   │   ├── M0B.M0A.M1
│   │   ├── M0B.M0A.M2
│   │   ├── M0B.M0A.M3
│   │   ├── M0B.M0A.M4
│   │   ├── M0B.M0A.M5
│   │   ├── M0B.M0A.M6
│   │   ├── M0B.substrate.M1
│   │   ├── M0B.substrate.M2
│   │   ├── M0B.substrate.M3
│   │   ├── M0B.substrate.M4
│   │   ├── M0B.substrate.M5
│   │   ├── M0B.substrate.M6
│   │   ├── M1.ACT.M2
│   │   ├── M1.ACT.M3
│   │   ├── M1.ACT.M4
│   │   ├── M1.ACT.M5
│   │   ├── M1.ACT.M6
│   │   ├── M1.ACT.M7
│   │   ├── M1.BPR.M2
│   │   ├── M1.BPR.M3
│   │   ├── M1.BPR.M4
│   │   ├── M1.BPR.M5
│   │   ├── M1.BPR.M6
│   │   ├── M1.BPR.M7
│   │   ├── M1.GATE.M2
│   │   ├── M1.GATE.M3
│   │   ├── M1.GATE.M4
│   │   ├── M1.GATE.M5
│   │   ├── M1.GATE.M6
│   │   ├── M1.GATE.M7
│   │   ├── M1.M0A.M2
│   │   ├── M1.M0A.M3
│   │   ├── M1.M0A.M4
│   │   ├── M1.M0A.M5
│   │   ├── M1.M0A.M6
│   │   ├── M1.M0A.M7
│   │   ├── M1.M0B.M2
│   │   ├── M1.M0B.M3
│   │   ├── M1.M0B.M4
│   │   ├── M1.M0B.M5
│   │   ├── M1.M0B.M6
│   │   ├── M1.M0B.M7
│   │   ├── M1.substrate.M2
│   │   ├── M1.substrate.M3
│   │   ├── M1.substrate.M4
│   │   ├── M1.substrate.M5
│   │   ├── M1.substrate.M6
│   │   ├── M1.substrate.M7
│   │   ├── M10.M4
│   │   ├── M10.M4.M11
│   │   ├── M10.M4.M12
│   │   ├── M10.M4.M13
│   │   ├── M10.M4.RDL
│   │   ├── M10.M5
│   │   ├── M10.M5.M11
│   │   ├── M10.M5.M12
│   │   ├── M10.M5.M13
│   │   ├── M10.M5.RDL
│   │   ├── M10.M6
│   │   ├── M10.M6.M11
│   │   ├── M10.M6.M12
│   │   ├── M10.M6.M13
│   │   ├── M10.M6.RDL
│   │   ├── M10.M7
│   │   ├── M10.M7.M11
│   │   ├── M10.M7.M12
│   │   ├── M10.M7.M13
│   │   ├── M10.M7.RDL
│   │   ├── M10.M8
│   │   ├── M10.M8.M11
│   │   ├── M10.M8.M12
│   │   ├── M10.M8.M13
│   │   ├── M10.M8.RDL
│   │   ├── M10.M9
│   │   ├── M10.M9.M11
│   │   ├── M10.M9.M12
│   │   ├── M10.M9.M13
│   │   ├── M10.M9.RDL
│   │   ├── M11.M10
│   │   ├── M11.M10.M12
│   │   ├── M11.M10.M13
│   │   ├── M11.M10.RDL
│   │   ├── M11.M5
│   │   ├── M11.M5.M12
│   │   ├── M11.M5.M13
│   │   ├── M11.M5.RDL
│   │   ├── M11.M6
│   │   ├── M11.M6.M12
│   │   ├── M11.M6.M13
│   │   ├── M11.M6.RDL
│   │   ├── M11.M7
│   │   ├── M11.M7.M12
│   │   ├── M11.M7.M13
│   │   ├── M11.M7.RDL
│   │   ├── M11.M8
│   │   ├── M11.M8.M12
│   │   ├── M11.M8.M13
│   │   ├── M11.M8.RDL
│   │   ├── M11.M9
│   │   ├── M11.M9.M12
│   │   ├── M11.M9.M13
│   │   ├── M11.M9.RDL
│   │   ├── M12.M10
│   │   ├── M12.M10.M13
│   │   ├── M12.M10.RDL
│   │   ├── M12.M11
│   │   ├── M12.M11.M13
│   │   ├── M12.M11.RDL
│   │   ├── M12.M6
│   │   ├── M12.M6.M13
│   │   ├── M12.M6.RDL
│   │   ├── M12.M7
│   │   ├── M12.M7.M13
│   │   ├── M12.M7.RDL
│   │   ├── M12.M8
│   │   ├── M12.M8.M13
│   │   ├── M12.M8.RDL
│   │   ├── M12.M9
│   │   ├── M12.M9.M13
│   │   ├── M12.M9.RDL
│   │   ├── M13.M10
│   │   ├── M13.M10.RDL
│   │   ├── M13.M11
│   │   ├── M13.M11.RDL
│   │   ├── M13.M12
│   │   ├── M13.M12.RDL
│   │   ├── M13.M7
│   │   ├── M13.M7.RDL
│   │   ├── M13.M8
│   │   ├── M13.M8.RDL
│   │   ├── M13.M9
│   │   ├── M13.M9.RDL
│   │   ├── M2.ACT.M3
│   │   ├── M2.ACT.M4
│   │   ├── M2.ACT.M5
│   │   ├── M2.ACT.M6
│   │   ├── M2.ACT.M7
│   │   ├── M2.ACT.M8
│   │   ├── M2.BPR.M3
│   │   ├── M2.BPR.M4
│   │   ├── M2.BPR.M5
│   │   ├── M2.BPR.M6
│   │   ├── M2.BPR.M7
│   │   ├── M2.BPR.M8
│   │   ├── M2.GATE.M3
│   │   ├── M2.GATE.M4
│   │   ├── M2.GATE.M5
│   │   ├── M2.GATE.M6
│   │   ├── M2.GATE.M7
│   │   ├── M2.GATE.M8
│   │   ├── M2.M0A.M3
│   │   ├── M2.M0A.M4
│   │   ├── M2.M0A.M5
│   │   ├── M2.M0A.M6
│   │   ├── M2.M0A.M7
│   │   ├── M2.M0A.M8
│   │   ├── M2.M0B.M3
│   │   ├── M2.M0B.M4
│   │   ├── M2.M0B.M5
│   │   ├── M2.M0B.M6
│   │   ├── M2.M0B.M7
│   │   ├── M2.M0B.M8
│   │   ├── M2.M1.M3
│   │   ├── M2.M1.M4
│   │   ├── M2.M1.M5
│   │   ├── M2.M1.M6
│   │   ├── M2.M1.M7
│   │   ├── M2.M1.M8
│   │   ├── M3.ACT.M4
│   │   ├── M3.ACT.M5
│   │   ├── M3.ACT.M6
│   │   ├── M3.ACT.M7
│   │   ├── M3.ACT.M8
│   │   ├── M3.ACT.M9
│   │   ├── M3.GATE.M4
│   │   ├── M3.GATE.M5
│   │   ├── M3.GATE.M6
│   │   ├── M3.GATE.M7
│   │   ├── M3.GATE.M8
│   │   ├── M3.GATE.M9
│   │   ├── M3.M0A.M4
│   │   ├── M3.M0A.M5
│   │   ├── M3.M0A.M6
│   │   ├── M3.M0A.M7
│   │   ├── M3.M0A.M8
│   │   ├── M3.M0A.M9
│   │   ├── M3.M0B.M4
│   │   ├── M3.M0B.M5
│   │   ├── M3.M0B.M6
│   │   ├── M3.M0B.M7
│   │   ├── M3.M0B.M8
│   │   ├── M3.M0B.M9
│   │   ├── M3.M1.M4
│   │   ├── M3.M1.M5
│   │   ├── M3.M1.M6
│   │   ├── M3.M1.M7
│   │   ├── M3.M1.M8
│   │   ├── M3.M1.M9
│   │   ├── M3.M2.M4
│   │   ├── M3.M2.M5
│   │   ├── M3.M2.M6
│   │   ├── M3.M2.M7
│   │   ├── M3.M2.M8
│   │   ├── M3.M2.M9
│   │   ├── M4.ACT.M10
│   │   ├── M4.ACT.M5
│   │   ├── M4.ACT.M6
│   │   ├── M4.ACT.M7
│   │   ├── M4.ACT.M8
│   │   ├── M4.ACT.M9
│   │   ├── M4.M0A.M10
│   │   ├── M4.M0A.M5
│   │   ├── M4.M0A.M6
│   │   ├── M4.M0A.M7
│   │   ├── M4.M0A.M8
│   │   ├── M4.M0A.M9
│   │   ├── M4.M0B.M10
│   │   ├── M4.M0B.M5
│   │   ├── M4.M0B.M6
│   │   ├── M4.M0B.M7
│   │   ├── M4.M0B.M8
│   │   ├── M4.M0B.M9
│   │   ├── M4.M1.M10
│   │   ├── M4.M1.M5
│   │   ├── M4.M1.M6
│   │   ├── M4.M1.M7
│   │   ├── M4.M1.M8
│   │   ├── M4.M1.M9
│   │   ├── M4.M2.M10
│   │   ├── M4.M2.M5
│   │   ├── M4.M2.M6
│   │   ├── M4.M2.M7
│   │   ├── M4.M2.M8
│   │   ├── M4.M2.M9
│   │   ├── M4.M3.M10
│   │   ├── M4.M3.M5
│   │   ├── M4.M3.M6
│   │   ├── M4.M3.M7
│   │   ├── M4.M3.M8
│   │   ├── M4.M3.M9
│   │   ├── M5.ACT.M10
│   │   ├── M5.ACT.M11
│   │   ├── M5.ACT.M6
│   │   ├── M5.ACT.M7
│   │   ├── M5.ACT.M8
│   │   ├── M5.ACT.M9
│   │   ├── M5.M0B.M10
│   │   ├── M5.M0B.M11
│   │   ├── M5.M0B.M6
│   │   ├── M5.M0B.M7
│   │   ├── M5.M0B.M8
│   │   ├── M5.M0B.M9
│   │   ├── M5.M1.M10
│   │   ├── M5.M1.M11
│   │   ├── M5.M1.M6
│   │   ├── M5.M1.M7
│   │   ├── M5.M1.M8
│   │   ├── M5.M1.M9
│   │   ├── M5.M2.M10
│   │   ├── M5.M2.M11
│   │   ├── M5.M2.M6
│   │   ├── M5.M2.M7
│   │   ├── M5.M2.M8
│   │   ├── M5.M2.M9
│   │   ├── M5.M3.M10
│   │   ├── M5.M3.M11
│   │   ├── M5.M3.M6
│   │   ├── M5.M3.M7
│   │   ├── M5.M3.M8
│   │   ├── M5.M3.M9
│   │   ├── M5.M4.M10
│   │   ├── M5.M4.M11
│   │   ├── M5.M4.M6
│   │   ├── M5.M4.M7
│   │   ├── M5.M4.M8
│   │   ├── M5.M4.M9
│   │   ├── M6.M0B.M10
│   │   ├── M6.M0B.M11
│   │   ├── M6.M0B.M12
│   │   ├── M6.M0B.M7
│   │   ├── M6.M0B.M8
│   │   ├── M6.M0B.M9
│   │   ├── M6.M1.M10
│   │   ├── M6.M1.M11
│   │   ├── M6.M1.M12
│   │   ├── M6.M1.M7
│   │   ├── M6.M1.M8
│   │   ├── M6.M1.M9
│   │   ├── M6.M2.M10
│   │   ├── M6.M2.M11
│   │   ├── M6.M2.M12
│   │   ├── M6.M2.M7
│   │   ├── M6.M2.M8
│   │   ├── M6.M2.M9
│   │   ├── M6.M3.M10
│   │   ├── M6.M3.M11
│   │   ├── M6.M3.M12
│   │   ├── M6.M3.M7
│   │   ├── M6.M3.M8
│   │   ├── M6.M3.M9
│   │   ├── M6.M4.M10
│   │   ├── M6.M4.M11
│   │   ├── M6.M4.M12
│   │   ├── M6.M4.M7
│   │   ├── M6.M4.M8
│   │   ├── M6.M4.M9
│   │   ├── M6.M5.M10
│   │   ├── M6.M5.M11
│   │   ├── M6.M5.M12
│   │   ├── M6.M5.M7
│   │   ├── M6.M5.M8
│   │   ├── M6.M5.M9
│   │   ├── M7.M1.M10
│   │   ├── M7.M1.M11
│   │   ├── M7.M1.M12
│   │   ├── M7.M1.M13
│   │   ├── M7.M1.M8
│   │   ├── M7.M1.M9
│   │   ├── M7.M2.M10
│   │   ├── M7.M2.M11
│   │   ├── M7.M2.M12
│   │   ├── M7.M2.M13
│   │   ├── M7.M2.M8
│   │   ├── M7.M2.M9
│   │   ├── M7.M3.M10
│   │   ├── M7.M3.M11
│   │   ├── M7.M3.M12
│   │   ├── M7.M3.M13
│   │   ├── M7.M3.M8
│   │   ├── M7.M3.M9
│   │   ├── M7.M4.M10
│   │   ├── M7.M4.M11
│   │   ├── M7.M4.M12
│   │   ├── M7.M4.M13
│   │   ├── M7.M4.M8
│   │   ├── M7.M4.M9
│   │   ├── M7.M5.M10
│   │   ├── M7.M5.M11
│   │   ├── M7.M5.M12
│   │   ├── M7.M5.M13
│   │   ├── M7.M5.M8
│   │   ├── M7.M5.M9
│   │   ├── M7.M6.M10
│   │   ├── M7.M6.M11
│   │   ├── M7.M6.M12
│   │   ├── M7.M6.M13
│   │   ├── M7.M6.M8
│   │   ├── M7.M6.M9
│   │   ├── M8.M2.M10
│   │   ├── M8.M2.M11
│   │   ├── M8.M2.M12
│   │   ├── M8.M2.M13
│   │   ├── M8.M2.M9
│   │   ├── M8.M2.RDL
│   │   ├── M8.M3.M10
│   │   ├── M8.M3.M11
│   │   ├── M8.M3.M12
│   │   ├── M8.M3.M13
│   │   ├── M8.M3.M9
│   │   ├── M8.M3.RDL
│   │   ├── M8.M4.M10
│   │   ├── M8.M4.M11
│   │   ├── M8.M4.M12
│   │   ├── M8.M4.M13
│   │   ├── M8.M4.M9
│   │   ├── M8.M4.RDL
│   │   ├── M8.M5.M10
│   │   ├── M8.M5.M11
│   │   ├── M8.M5.M12
│   │   ├── M8.M5.M13
│   │   ├── M8.M5.M9
│   │   ├── M8.M5.RDL
│   │   ├── M8.M6.M10
│   │   ├── M8.M6.M11
│   │   ├── M8.M6.M12
│   │   ├── M8.M6.M13
│   │   ├── M8.M6.M9
│   │   ├── M8.M6.RDL
│   │   ├── M8.M7.M10
│   │   ├── M8.M7.M11
│   │   ├── M8.M7.M12
│   │   ├── M8.M7.M13
│   │   ├── M8.M7.M9
│   │   ├── M8.M7.RDL
│   │   ├── M9.M3
│   │   ├── M9.M3.M10
│   │   ├── M9.M3.M11
│   │   ├── M9.M3.M12
│   │   ├── M9.M3.M13
│   │   ├── M9.M3.RDL
│   │   ├── M9.M4
│   │   ├── M9.M4.M10
│   │   ├── M9.M4.M11
│   │   ├── M9.M4.M12
│   │   ├── M9.M4.M13
│   │   ├── M9.M4.RDL
│   │   ├── M9.M5
│   │   ├── M9.M5.M10
│   │   ├── M9.M5.M11
│   │   ├── M9.M5.M12
│   │   ├── M9.M5.M13
│   │   ├── M9.M5.RDL
│   │   ├── M9.M6
│   │   ├── M9.M6.M10
│   │   ├── M9.M6.M11
│   │   ├── M9.M6.M12
│   │   ├── M9.M6.M13
│   │   ├── M9.M6.RDL
│   │   ├── M9.M7
│   │   ├── M9.M7.M10
│   │   ├── M9.M7.M11
│   │   ├── M9.M7.M12
│   │   ├── M9.M7.M13
│   │   ├── M9.M7.RDL
│   │   ├── M9.M8
│   │   ├── M9.M8.M10
│   │   ├── M9.M8.M11
│   │   ├── M9.M8.M12
│   │   ├── M9.M8.M13
│   │   ├── M9.M8.RDL
│   │   ├── RDL.M10
│   │   ├── RDL.M11
│   │   ├── RDL.M12
│   │   ├── RDL.M13
│   │   ├── RDL.M8
│   │   └── RDL.M9
│   ├── FreePDK3_RCtyp.itf
│   ├── FreePDK3_RCtyp.nxtgrd
│   ├── Makefile
│   └── grdgenxo_nxtgrd.out
└── syncust/
    ├── Makefile
    ├── NCSU_TechLib_FreePDK3/
    │   ├── .oalib
    │   ├── BPR_M0A/
    │   │   └── layout/
    │   │       ├── data.dm
    │   │       ├── layout.oa
    │   │       └── master.tag
    │   ├── GATE_M0B/
    │   │   └── layout/
    │   │       ├── data.dm
    │   │       ├── layout.oa
    │   │       └── master.tag
    │   ├── M0A_M0B/
    │   │   └── layout/
    │   │       ├── data.dm
    │   │       ├── layout.oa
    │   │       └── master.tag
    │   ├── M0B_M1/
    │   │   └── layout/
    │   │       ├── data.dm
    │   │       ├── layout.oa
    │   │       └── master.tag
    │   ├── M10_M11/
    │   │   └── layout/
    │   │       ├── data.dm
    │   │       ├── layout.oa
    │   │       └── master.tag
    │   ├── M11_M12/
    │   │   └── layout/
    │   │       ├── data.dm
    │   │       ├── layout.oa
    │   │       └── master.tag
    │   ├── M12_M13/
    │   │   └── layout/
    │   │       ├── data.dm
    │   │       ├── layout.oa
    │   │       └── master.tag
    │   ├── M13_RDL/
    │   │   └── layout/
    │   │       ├── data.dm
    │   │       ├── layout.oa
    │   │       └── master.tag
    │   ├── M1_M2/
    │   │   └── layout/
    │   │       ├── data.dm
    │   │       ├── layout.oa
    │   │       └── master.tag
    │   ├── M2_M3/
    │   │   └── layout/
    │   │       ├── data.dm
    │   │       ├── layout.oa
    │   │       └── master.tag
    │   ├── M3_M4/
    │   │   └── layout/
    │   │       ├── data.dm
    │   │       ├── layout.oa
    │   │       └── master.tag
    │   ├── M4_M5/
    │   │   └── layout/
    │   │       ├── data.dm
    │   │       ├── layout.oa
    │   │       └── master.tag
    │   ├── M5_M6/
    │   │   └── layout/
    │   │       ├── data.dm
    │   │       ├── layout.oa
    │   │       └── master.tag
    │   ├── M6_M7/
    │   │   └── layout/
    │   │       ├── data.dm
    │   │       ├── layout.oa
    │   │       └── master.tag
    │   ├── M7_M8/
    │   │   └── layout/
    │   │       ├── data.dm
    │   │       ├── layout.oa
    │   │       └── master.tag
    │   ├── M8_M9/
    │   │   └── layout/
    │   │       ├── data.dm
    │   │       ├── layout.oa
    │   │       └── master.tag
    │   ├── M9_M10/
    │   │   └── layout/
    │   │       ├── data.dm
    │   │       ├── layout.oa
    │   │       └── master.tag
    │   ├── NCSU_TechLib_FreePDK3.layermap
    │   ├── autoLoad.file
    │   ├── display.drf
    │   ├── nmos/
    │   │   ├── ams/
    │   │   │   ├── master.tag
    │   │   │   └── symbol.oa
    │   │   ├── auCdl/
    │   │   │   ├── master.tag
    │   │   │   └── symbol.oa
    │   │   ├── auLvs/
    │   │   │   ├── master.tag
    │   │   │   └── symbol.oa
    │   │   ├── data.dm
    │   │   ├── hspiceD/
    │   │   │   ├── master.tag
    │   │   │   └── symbol.oa
    │   │   ├── layout/
    │   │   │   ├── data.dm
    │   │   │   ├── layout.oa
    │   │   │   └── master.tag
    │   │   ├── spectre/
    │   │   │   ├── master.tag
    │   │   │   └── symbol.oa
    │   │   └── symbol/
    │   │       ├── data.dm
    │   │       ├── master.tag
    │   │       └── symbol.oa
    │   ├── nmos4/
    │   │   ├── ams/
    │   │   │   ├── master.tag
    │   │   │   └── symbol.oa
    │   │   ├── auCdl/
    │   │   │   ├── master.tag
    │   │   │   └── symbol.oa
    │   │   ├── auLvs/
    │   │   │   ├── master.tag
    │   │   │   └── symbol.oa
    │   │   ├── data.dm
    │   │   ├── hspiceD/
    │   │   │   ├── master.tag
    │   │   │   └── symbol.oa
    │   │   ├── spectre/
    │   │   │   ├── master.tag
    │   │   │   └── symbol.oa
    │   │   └── symbol/
    │   │       ├── data.dm
    │   │       ├── master.tag
    │   │       └── symbol.oa
    │   ├── pmos/
    │   │   ├── ams/
    │   │   │   ├── master.tag
    │   │   │   └── symbol.oa
    │   │   ├── auCdl/
    │   │   │   ├── master.tag
    │   │   │   └── symbol.oa
    │   │   ├── auLvs/
    │   │   │   ├── master.tag
    │   │   │   └── symbol.oa
    │   │   ├── data.dm
    │   │   ├── hspiceD/
    │   │   │   ├── master.tag
    │   │   │   └── symbol.oa
    │   │   ├── layout/
    │   │   │   ├── data.dm
    │   │   │   ├── layout.oa
    │   │   │   └── master.tag
    │   │   ├── spectre/
    │   │   │   ├── master.tag
    │   │   │   └── symbol.oa
    │   │   └── symbol/
    │   │       ├── data.dm
    │   │       ├── master.tag
    │   │       └── symbol.oa
    │   └── pmos4/
    │       ├── ams/
    │       │   ├── master.tag
    │       │   └── symbol.oa
    │       ├── auCdl/
    │       │   ├── master.tag
    │       │   └── symbol.oa
    │       ├── auLvs/
    │       │   ├── master.tag
    │       │   └── symbol.oa
    │       ├── data.dm
    │       ├── hspiceD/
    │       │   ├── master.tag
    │       │   └── symbol.oa
    │       ├── spectre/
    │       │   ├── master.tag
    │       │   └── symbol.oa
    │       └── symbol/
    │           ├── data.dm
    │           ├── master.tag
    │           └── symbol.oa
    ├── Tcl/
    │   └── utils/
    │       └── updateTech.tcl
    ├── cdf/
    │   ├── loadAll.tcl
    │   ├── nmos.cdf
    │   ├── nmos4.cdf
    │   ├── pmos.cdf
    │   └── pmos4.cdf
    ├── lib.defs
    ├── scripts/
    │   └── callbacks/
    │       └── callbacks.tcl
    └── techfiles/
        └── NCSU_TechLib_FreePDK3_CC.tf
Download .txt
SYMBOL INDEX (2 symbols across 1 files)

FILE: icv/Include/FreePDK3.antenna.drc.rs
  type of (line 9) | enum of {
  type of (line 13) | struct of {
Condensed preview — 769 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (6,199K chars).
[
  {
    "path": "LICENSE",
    "chars": 1714,
    "preview": "   FreePDK3(TM) Predictive Process Design Kit\n\nCopyright (c) 2021, North Carolina State University\nAll rights reserved.\n"
  },
  {
    "path": "README.md",
    "chars": 2566,
    "preview": "FreePDK3 <sup>TM</sup> Predictive Process Design Kit\n=====================================================\nversion 1.0 ("
  },
  {
    "path": "doc/FreePDK3_Release_Notes.md",
    "chars": 2717,
    "preview": "FreePDK3 Release Notes\n======================\n\n## Version 1.0 (2021-08-30)\n\n* Included in this release\n  * Technology li"
  },
  {
    "path": "examples/FreePDK3_examples/.oalib",
    "chars": 142,
    "preview": "<?xml version=\"1.0\"?>\n\n<Library DMSystem=\"oaDMFileSys\">\n    <oaDMFileSys libReadOnly=\"No\"\n                 origFileSyste"
  },
  {
    "path": "examples/FreePDK3_examples/and/layout/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nlayout.oa\n"
  },
  {
    "path": "examples/FreePDK3_examples/and/schematic/master.tag",
    "chars": 35,
    "preview": "-- Master.tag File, Rev:1.0\nsch.oa\n"
  },
  {
    "path": "examples/FreePDK3_examples/and/symbol/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nsymbol.oa\n"
  },
  {
    "path": "examples/FreePDK3_examples/d_ff/layout/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nlayout.oa\n"
  },
  {
    "path": "examples/FreePDK3_examples/d_ff/schematic/master.tag",
    "chars": 35,
    "preview": "-- Master.tag File, Rev:1.0\nsch.oa\n"
  },
  {
    "path": "examples/FreePDK3_examples/d_latch/layout/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nlayout.oa\n"
  },
  {
    "path": "examples/FreePDK3_examples/d_latch/schematic/master.tag",
    "chars": 35,
    "preview": "-- Master.tag File, Rev:1.0\nsch.oa\n"
  },
  {
    "path": "examples/FreePDK3_examples/d_latch/symbol/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nsymbol.oa\n"
  },
  {
    "path": "examples/FreePDK3_examples/inverter/layout/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nlayout.oa\n"
  },
  {
    "path": "examples/FreePDK3_examples/inverter/schematic/master.tag",
    "chars": 35,
    "preview": "-- Master.tag File, Rev:1.0\nsch.oa\n"
  },
  {
    "path": "examples/FreePDK3_examples/inverter/symbol/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nsymbol.oa\n"
  },
  {
    "path": "examples/FreePDK3_examples/inverter_testbench/HSPICE_default/analyses.xml",
    "chars": 2020,
    "preview": "<?xml version=\"1.0\"?>\n<!--Created by Custom Compiler (TM), build , on Tue Jul  6 17:25:21 2021-->\n<file-format name=\"sta"
  },
  {
    "path": "examples/FreePDK3_examples/inverter_testbench/HSPICE_default/designVariables.xml",
    "chars": 973,
    "preview": "<?xml version=\"1.0\"?>\n<!--Created by Custom Compiler (TM), build , on Tue Jul  6 17:25:21 2021-->\n<file-format name=\"sta"
  },
  {
    "path": "examples/FreePDK3_examples/inverter_testbench/HSPICE_default/importedFiles.xml",
    "chars": 330,
    "preview": "<?xml version=\"1.0\"?>\n<!--Created by Custom Compiler (TM), build , on Tue Jul  6 17:25:21 2021-->\n<file-format name=\"sta"
  },
  {
    "path": "examples/FreePDK3_examples/inverter_testbench/HSPICE_default/master.tag",
    "chars": 42,
    "preview": "-- Master.tag File, Rev:1.0\nsaeState.file\n"
  },
  {
    "path": "examples/FreePDK3_examples/inverter_testbench/HSPICE_default/outputs.xml",
    "chars": 14960,
    "preview": "<?xml version=\"1.0\"?>\n<!--Created by Custom Compiler (TM), build , on Tue Jul  6 17:25:21 2021-->\n<file-format name=\"sta"
  },
  {
    "path": "examples/FreePDK3_examples/inverter_testbench/HSPICE_default/saeState.file",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "examples/FreePDK3_examples/inverter_testbench/HSPICE_default/state.xml",
    "chars": 703,
    "preview": "<?xml version=\"1.0\"?>\n<!--Created by Custom Compiler (TM), build , on Tue Jul  6 17:25:21 2021-->\n<file-format name=\"sta"
  },
  {
    "path": "examples/FreePDK3_examples/inverter_testbench/schematic/master.tag",
    "chars": 35,
    "preview": "-- Master.tag File, Rev:1.0\nsch.oa\n"
  },
  {
    "path": "examples/FreePDK3_examples/lvs_nmos/layout/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nlayout.oa\n"
  },
  {
    "path": "examples/FreePDK3_examples/lvs_nmos/schematic/master.tag",
    "chars": 35,
    "preview": "-- Master.tag File, Rev:1.0\nsch.oa\n"
  },
  {
    "path": "examples/FreePDK3_examples/lvs_pmos/layout/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nlayout.oa\n"
  },
  {
    "path": "examples/FreePDK3_examples/lvs_pmos/schematic/master.tag",
    "chars": 35,
    "preview": "-- Master.tag File, Rev:1.0\nsch.oa\n"
  },
  {
    "path": "examples/FreePDK3_examples/nand/layout/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nlayout.oa\n"
  },
  {
    "path": "examples/FreePDK3_examples/nand/schematic/master.tag",
    "chars": 35,
    "preview": "-- Master.tag File, Rev:1.0\nsch.oa\n"
  },
  {
    "path": "examples/FreePDK3_examples/nand/symbol/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nsymbol.oa\n"
  },
  {
    "path": "examples/FreePDK3_examples/nor/layout/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nlayout.oa\n"
  },
  {
    "path": "examples/FreePDK3_examples/nor/schematic/master.tag",
    "chars": 35,
    "preview": "-- Master.tag File, Rev:1.0\nsch.oa\n"
  },
  {
    "path": "examples/FreePDK3_examples/or/layout/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nlayout.oa\n"
  },
  {
    "path": "examples/FreePDK3_examples/or/schematic/master.tag",
    "chars": 35,
    "preview": "-- Master.tag File, Rev:1.0\nsch.oa\n"
  },
  {
    "path": "examples/FreePDK3_examples/or/symbol/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nsymbol.oa\n"
  },
  {
    "path": "examples/FreePDK3_examples/xor/layout/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\r\nlayout.oa"
  },
  {
    "path": "examples/FreePDK3_examples/xor/schematic/master.tag",
    "chars": 35,
    "preview": "-- Master.tag File, Rev:1.0\nsch.oa\n"
  },
  {
    "path": "examples/FreePDK3_examples/xor_double/layout/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\r\nlayout.oa"
  },
  {
    "path": "examples/FreePDK3_examples/xor_double/schematic/master.tag",
    "chars": 35,
    "preview": "-- Master.tag File, Rev:1.0\r\nsch.oa"
  },
  {
    "path": "hspice/models/fet.mod",
    "chars": 3348,
    "preview": "* FreePDK3 HSPICE Models\n*\n* Copyright (c) 2021, North Carolina State University\n* All Rights Reserved.\n*\n* Please see t"
  },
  {
    "path": "icv/FreePDK3_main.drc.rs",
    "chars": 7829,
    "preview": "// 3nm FreePDK(TM) ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserved.\n//"
  },
  {
    "path": "icv/FreePDK3_main.lvs.rs",
    "chars": 20459,
    "preview": "// 3nm FreePDK(TM) ICV LVS Rules\r\n//\r\n// Copyright (c) 2021, North Carolina State University\r\n// All Rights Reserved.\r\n/"
  },
  {
    "path": "icv/FreePDK3_main.lvs.rs.user_functions",
    "chars": 2756,
    "preview": "// 3nm FreePDK(TM) ICV LVS Functions\r\n//\r\n// Copyright (c) 2021, North Carolina State University\r\n// All Rights Reserved"
  },
  {
    "path": "icv/Include/FreePDK3.act.drc.rs",
    "chars": 1973,
    "preview": "// 3nm FreePDK(TM) ACT ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserved"
  },
  {
    "path": "icv/Include/FreePDK3.antenna.drc.rs",
    "chars": 3848,
    "preview": "// 3nm FreePDK(TM) ANTENNA ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Rese"
  },
  {
    "path": "icv/Include/FreePDK3.bpr.drc.rs",
    "chars": 1077,
    "preview": "// 3nm FreePDK(TM) BPR ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserved"
  },
  {
    "path": "icv/Include/FreePDK3.dummy.drc.rs",
    "chars": 1560,
    "preview": "// 3nm FreePDK(TM) DUMMY ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserv"
  },
  {
    "path": "icv/Include/FreePDK3.gate.drc.rs",
    "chars": 2495,
    "preview": "// 3nm FreePDK(TM) GATE ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserve"
  },
  {
    "path": "icv/Include/FreePDK3.gcon.drc.rs",
    "chars": 3633,
    "preview": "// 3nm FreePDK(TM) GCON ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserve"
  },
  {
    "path": "icv/Include/FreePDK3.gcut.drc.rs",
    "chars": 2592,
    "preview": "// 3nm FreePDK(TM) GCUT ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserve"
  },
  {
    "path": "icv/Include/FreePDK3.m0a.drc.rs",
    "chars": 2649,
    "preview": "// 3nm FreePDK(TM) M0A ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserved"
  },
  {
    "path": "icv/Include/FreePDK3.m0b.drc.rs",
    "chars": 2088,
    "preview": "// 3nm FreePDK(TM) M0B ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserved"
  },
  {
    "path": "icv/Include/FreePDK3.m1.drc.rs",
    "chars": 5403,
    "preview": "// 3nm FreePDK(TM) M1 ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserved."
  },
  {
    "path": "icv/Include/FreePDK3.m10.drc.rs",
    "chars": 3093,
    "preview": "// 3nm FreePDK(TM) M10 ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserved"
  },
  {
    "path": "icv/Include/FreePDK3.m11.drc.rs",
    "chars": 3098,
    "preview": "// 3nm FreePDK(TM) M11 ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserved"
  },
  {
    "path": "icv/Include/FreePDK3.m12.drc.rs",
    "chars": 3111,
    "preview": "// 3nm FreePDK(TM) M12 ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserved"
  },
  {
    "path": "icv/Include/FreePDK3.m13.drc.rs",
    "chars": 3116,
    "preview": "// 3nm FreePDK(TM) M13 ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserved"
  },
  {
    "path": "icv/Include/FreePDK3.m2.drc.rs",
    "chars": 4201,
    "preview": "// 3nm FreePDK(TM) M2 ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserved."
  },
  {
    "path": "icv/Include/FreePDK3.m3.drc.rs",
    "chars": 4126,
    "preview": "// 3nm FreePDK(TM) M3 ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserved."
  },
  {
    "path": "icv/Include/FreePDK3.m4.drc.rs",
    "chars": 3017,
    "preview": "// 3nm FreePDK(TM) M4 ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserved."
  },
  {
    "path": "icv/Include/FreePDK3.m5.drc.rs",
    "chars": 3023,
    "preview": "// 3nm FreePDK(TM) M5 ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserved."
  },
  {
    "path": "icv/Include/FreePDK3.m6.drc.rs",
    "chars": 3017,
    "preview": "// 3nm FreePDK(TM) M6 ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserved."
  },
  {
    "path": "icv/Include/FreePDK3.m7.drc.rs",
    "chars": 4203,
    "preview": "// 3nm FreePDK(TM) M7 ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserved."
  },
  {
    "path": "icv/Include/FreePDK3.m8.drc.rs",
    "chars": 4196,
    "preview": "// 3nm FreePDK(TM) M8 ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserved."
  },
  {
    "path": "icv/Include/FreePDK3.m9.drc.rs",
    "chars": 4144,
    "preview": "// 3nm FreePDK(TM) M9 ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserved."
  },
  {
    "path": "icv/Include/FreePDK3.nimpim.drc.rs",
    "chars": 3083,
    "preview": "// 3nm FreePDK(TM) NIMPIM ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reser"
  },
  {
    "path": "icv/Include/FreePDK3.nw.drc.rs",
    "chars": 1212,
    "preview": "// 3nm FreePDK(TM) NW ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserved."
  },
  {
    "path": "icv/Include/FreePDK3.rdl.drc.rs",
    "chars": 821,
    "preview": "// 3nm FreePDK(TM) RDL ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserved"
  },
  {
    "path": "icv/Include/FreePDK3.v0a.drc.rs",
    "chars": 4084,
    "preview": "// 3nm FreePDK(TM) V0A ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserved"
  },
  {
    "path": "icv/Include/FreePDK3.v0b.drc.rs",
    "chars": 3715,
    "preview": "// 3nm FreePDK(TM) V0B ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserved"
  },
  {
    "path": "icv/Include/FreePDK3.v1.drc.rs",
    "chars": 2620,
    "preview": "// 3nm FreePDK(TM) V1 ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserved."
  },
  {
    "path": "icv/Include/FreePDK3.v10.drc.rs",
    "chars": 2679,
    "preview": "// 3nm FreePDK(TM) V10 ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserved"
  },
  {
    "path": "icv/Include/FreePDK3.v11.drc.rs",
    "chars": 3184,
    "preview": "// 3nm FreePDK(TM) V11 ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserved"
  },
  {
    "path": "icv/Include/FreePDK3.v12.drc.rs",
    "chars": 2682,
    "preview": "// 3nm FreePDK(TM) V12 ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserved"
  },
  {
    "path": "icv/Include/FreePDK3.v2.drc.rs",
    "chars": 2619,
    "preview": "// 3nm FreePDK(TM) V2 ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserved."
  },
  {
    "path": "icv/Include/FreePDK3.v3.drc.rs",
    "chars": 3104,
    "preview": "// 3nm FreePDK(TM) V3 ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserved."
  },
  {
    "path": "icv/Include/FreePDK3.v4.drc.rs",
    "chars": 2710,
    "preview": "// 3nm FreePDK(TM) V4 ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserved."
  },
  {
    "path": "icv/Include/FreePDK3.v5.drc.rs",
    "chars": 2616,
    "preview": "// 3nm FreePDK(TM) V5 ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserved."
  },
  {
    "path": "icv/Include/FreePDK3.v6.drc.rs",
    "chars": 3062,
    "preview": "// 3nm FreePDK(TM) V6 ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserved."
  },
  {
    "path": "icv/Include/FreePDK3.v7.drc.rs",
    "chars": 2615,
    "preview": "// 3nm FreePDK(TM) V7 ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserved."
  },
  {
    "path": "icv/Include/FreePDK3.v8.drc.rs",
    "chars": 2610,
    "preview": "// 3nm FreePDK(TM) V8 ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserved."
  },
  {
    "path": "icv/Include/FreePDK3.v9.drc.rs",
    "chars": 3108,
    "preview": "// 3nm FreePDK(TM) V9 ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserved."
  },
  {
    "path": "icv/Include/FreePDK3.vbpr.drc.rs",
    "chars": 2995,
    "preview": "// 3nm FreePDK(TM) VBPR ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserve"
  },
  {
    "path": "icv/Include/FreePDK3.vrdl.drc.rs",
    "chars": 2736,
    "preview": "// 3nm FreePDK(TM) VRDL ICV Design Rules\n//\n// Copyright (c) 2021, North Carolina State University\n// All Rights Reserve"
  },
  {
    "path": "starrc/FreePDK3_RCtyp.TLUPlus/.filelist",
    "chars": 5309,
    "preview": "BPR.substrate.GATE\nBPR.substrate.M0A\nBPR.substrate.ACT\nBPR.substrate.M0B\nBPR.substrate.M1\nBPR.substrate.M2\nGATE.BPR.M0A\n"
  },
  {
    "path": "starrc/FreePDK3_RCtyp.TLUPlus/.format",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "starrc/FreePDK3_RCtyp.TLUPlus/.itf",
    "chars": 3679,
    "preview": "$ FreePDK 3nm ITF File\n$ Created 2021-07-02 by Viswanatha Pasumarthy and W. Rhett Davis\n$ Copyright 2021 North Carolina "
  },
  {
    "path": "starrc/FreePDK3_RCtyp.itf",
    "chars": 3790,
    "preview": "$ FreePDK 3nm ITF File\n$\n$ Copyright (c) 2021, North Carolina State University\n$ All Rights Reserved.\n$\n$ Please see the"
  },
  {
    "path": "starrc/Makefile",
    "chars": 82,
    "preview": "\nall: FreePDK3_RCtyp.itf\n\tgrdgenxo FreePDK3_RCtyp.itf |& tee grdgenxo_nxtgrd.out\n\n"
  },
  {
    "path": "starrc/grdgenxo_nxtgrd.out",
    "chars": 5442060,
    "preview": "\n                                  StarRC (TM)\n\n                 Version R-2020.09 for linux64 - Aug 26, 2020 \n\n        "
  },
  {
    "path": "syncust/Makefile",
    "chars": 772,
    "preview": "# 3nm FreePDK(TM) Makefile\n#\n# Copyright (c) 2021, North Carolina State University\n# All Rights Reserved.\n#\n# Please see"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/.oalib",
    "chars": 142,
    "preview": "<?xml version=\"1.0\"?>\n\n<Library DMSystem=\"oaDMFileSys\">\n    <oaDMFileSys libReadOnly=\"No\"\n                 origFileSyste"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/BPR_M0A/layout/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nlayout.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/GATE_M0B/layout/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nlayout.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/M0A_M0B/layout/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nlayout.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/M0B_M1/layout/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nlayout.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/M10_M11/layout/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nlayout.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/M11_M12/layout/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nlayout.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/M12_M13/layout/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nlayout.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/M13_RDL/layout/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nlayout.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/M1_M2/layout/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nlayout.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/M2_M3/layout/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nlayout.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/M3_M4/layout/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nlayout.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/M4_M5/layout/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nlayout.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/M5_M6/layout/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nlayout.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/M6_M7/layout/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nlayout.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/M7_M8/layout/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nlayout.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/M8_M9/layout/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nlayout.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/M9_M10/layout/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nlayout.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/NCSU_TechLib_FreePDK3.layermap",
    "chars": 3484,
    "preview": "# 3nm FreePDK(TM) Layer Map File\n#\n# Copyright (c) 2021, North Carolina State University\n# All Rights Reserved.\n#\n# Plea"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/autoLoad.file",
    "chars": 4475,
    "preview": "#########################################################################\n# 3nm FreePDK(TM) Custom Compiler autoLoad scr"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/display.drf",
    "chars": 174956,
    "preview": "; 3nm FreePDK(TM) Display Resources File\n;\n; Copyright (c) 2021, North Carolina State University\n; All Rights Reserved.\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/nmos/ams/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nsymbol.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/nmos/auCdl/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nsymbol.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/nmos/auLvs/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nsymbol.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/nmos/hspiceD/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nsymbol.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/nmos/layout/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nlayout.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/nmos/spectre/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nsymbol.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/nmos/symbol/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nsymbol.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/nmos4/ams/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nsymbol.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/nmos4/auCdl/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nsymbol.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/nmos4/auLvs/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nsymbol.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/nmos4/hspiceD/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nsymbol.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/nmos4/spectre/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nsymbol.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/nmos4/symbol/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nsymbol.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/pmos/ams/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nsymbol.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/pmos/auCdl/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nsymbol.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/pmos/auLvs/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nsymbol.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/pmos/hspiceD/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nsymbol.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/pmos/layout/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nlayout.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/pmos/spectre/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nsymbol.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/pmos/symbol/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nsymbol.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/pmos4/ams/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nsymbol.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/pmos4/auCdl/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nsymbol.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/pmos4/auLvs/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nsymbol.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/pmos4/hspiceD/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nsymbol.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/pmos4/spectre/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nsymbol.oa\n"
  },
  {
    "path": "syncust/NCSU_TechLib_FreePDK3/pmos4/symbol/master.tag",
    "chars": 38,
    "preview": "-- Master.tag File, Rev:1.0\nsymbol.oa\n"
  },
  {
    "path": "syncust/Tcl/utils/updateTech.tcl",
    "chars": 160,
    "preview": "\nset libName  NCSU_TechLib_FreePDK3\nset filename techfiles/NCSU_TechLib_FreePDK3_CC.tf\nset tech [db::importTechFile $fil"
  },
  {
    "path": "syncust/cdf/loadAll.tcl",
    "chars": 155,
    "preview": "set files {\n    nmos4.cdf\n    pmos4.cdf\n    nmos.cdf\n    pmos.cdf\n}\n\nforeach f $files {\n    puts \"Loading $f\"\n    source"
  },
  {
    "path": "syncust/cdf/nmos.cdf",
    "chars": 64625,
    "preview": "# 3nm FreePDK(TM) NMOS CDF\n#\n# Copyright (c) 2021, North Carolina State University\n# All Rights Reserved.\n#\n# Please see"
  },
  {
    "path": "syncust/cdf/nmos4.cdf",
    "chars": 64658,
    "preview": "# 3nm FreePDK(TM) NMOS4 CDF\n#\n# Copyright (c) 2021, North Carolina State University\n# All Rights Reserved.\n#\n# Please se"
  },
  {
    "path": "syncust/cdf/pmos.cdf",
    "chars": 64623,
    "preview": "# 3nm FreePDK(TM) PMOS CDF\n#\n# Copyright (c) 2021, North Carolina State University\n# All Rights Reserved.\n#\n# Please see"
  },
  {
    "path": "syncust/cdf/pmos4.cdf",
    "chars": 64657,
    "preview": "# 3nm FreePDK(TM) PMOS4 CDF\n#\n# Copyright (c) 2021, North Carolina State University\n# All Rights Reserved.\n#\n# Please se"
  },
  {
    "path": "syncust/lib.defs",
    "chars": 103,
    "preview": "INCLUDE $SYNOPSYS_CUSTOM_INSTALL/samples/lib.defs\nDEFINE NCSU_TechLib_FreePDK3 ./NCSU_TechLib_FreePDK3\n"
  },
  {
    "path": "syncust/scripts/callbacks/callbacks.tcl",
    "chars": 20434,
    "preview": "# 3nm FreePDK(TM) Custom Compiler Schematic Callbacks\n#\n# Copyright (c) 2021, North Carolina State University\n# All Righ"
  },
  {
    "path": "syncust/techfiles/NCSU_TechLib_FreePDK3_CC.tf",
    "chars": 28361,
    "preview": "; 3nm FreePDK(TM) Custom Compiler Techfile\n;\n; Copyright (c) 2021, North Carolina State University\n; All Rights Reserved"
  }
]

// ... and 622 more files (download for full content)

About this extraction

This page contains the full source code of the ncsu-eda/FreePDK3 GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 769 files (31.8 MB), approximately 1.5M tokens, and a symbol index with 2 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!