# PDK source from skywater.

## GPIO_MPRJ_IO.by.Willy.pdf
- in joplin
-
## reference
[[2023-03-29] Study Topic - GPIO MPRJ IO by Willy](https://github.com/bol-edu/caravel-soc/discussions/26)
## Start from Makefile in caravel_user_project
```
ifeq ($(PDK),sky130A)
SKYWATER_COMMIT=f70d8ca46961ff92719d8870a18a076370b85f6c
export OPEN_PDKS_COMMIT?=0059588eebfc704681dc2368bd1d33d96281d10f
export OPENLANE_TAG?=2022.11.19
MPW_TAG ?= mpw-8c
ifeq ($(CARAVEL_LITE),1)
CARAVEL_NAME := caravel-lite
CARAVEL_REPO := https://github.com/efabless/caravel-lite
CARAVEL_TAG := $(MPW_TAG)
else
CARAVEL_NAME := caravel
CARAVEL_REPO := https://github.com/efabless/caravel
CARAVEL_TAG := $(MPW_TAG)
endif
```
[Link](https://github.com/TonyHo722/caravel_user_project/blob/7f7c16f19280201d19bc4bf2d134cbc5906765b5/Makefile#L33C1-L47C6)
### use PDK=sky130A
```
export PDK=sky130A
```
[link](https://github.com/TonyHo722/caravel-lab/blob/main/bash_auto/run_la_test1#L55)
### PDK source
```
# PDK setup configs
THREADS ?= $(shell nproc)
STD_CELL_LIBRARY ?= sky130_fd_sc_hd
SPECIAL_VOLTAGE_LIBRARY ?= sky130_fd_sc_hvl
IO_LIBRARY ?= sky130_fd_io
PRIMITIVES_LIBRARY ?= sky130_fd_pr
SKYWATER_COMMIT ?= f70d8ca46961ff92719d8870a18a076370b85f6c
OPEN_PDKS_COMMIT ?= 0059588eebfc704681dc2368bd1d33d96281d10f
# = 1.0.303
PDK_MAGIC_COMMIT ?= 085131b090cb511d785baf52a10cf6df8a657d44
# = 8.3.294
```
```
git clone https://github.com/google/skywater-pdk.git
```
[Link](https://github.com/efabless/caravel-lite/blob/1e3103fd5ffa56f72e2b38e804c9c7bb2738e32a/Makefile#L82C1-L92C12)
## io pad verilog code
- black box
- functional
- behavioral
### block box
```
(* blackbox *)
module sky130_fd_io__top_xres4v2 (
XRES_H_N ,
AMUXBUS_A ,
AMUXBUS_B ,
PAD ,
DISABLE_PULLUP_H,
ENABLE_H ,
EN_VDDIO_SIG_H ,
INP_SEL_H ,
FILT_IN_H ,
PULLUP_H ,
ENABLE_VDDIO ,
PAD_A_ESD_H ,
TIE_HI_ESD ,
TIE_LO_ESD ,
TIE_WEAK_HI_H
);
output XRES_H_N ;
inout AMUXBUS_A ;
inout AMUXBUS_B ;
inout PAD ;
input DISABLE_PULLUP_H;
input ENABLE_H ;
input EN_VDDIO_SIG_H ;
input INP_SEL_H ;
input FILT_IN_H ;
inout PULLUP_H ;
input ENABLE_VDDIO ;
inout PAD_A_ESD_H ;
output TIE_HI_ESD ;
output TIE_LO_ESD ;
inout TIE_WEAK_HI_H ;
// Voltage supply signals
supply1 VCCD ;
supply1 VCCHIB ;
supply1 VDDA ;
supply1 VDDIO ;
supply1 VDDIO_Q;
supply0 VSSA ;
supply0 VSSD ;
supply0 VSSIO ;
supply0 VSSIO_Q;
supply1 VSWITCH;
endmodule
```
[code link](https://github.com/google/skywater-pdk-libs-sky130_fd_io/blob/main/cells/top_xres4v2/sky130_fd_io__top_xres4v2.blackbox.v#L33C1-L80C10)
### sky130_fd_io__top_xres4v2.functional.v
```
module sky130_fd_io__top_xres4v2 ( TIE_WEAK_HI_H, XRES_H_N, TIE_HI_ESD, TIE_LO_ESD,
AMUXBUS_A, AMUXBUS_B, PAD, PAD_A_ESD_H, ENABLE_H, EN_VDDIO_SIG_H, INP_SEL_H, FILT_IN_H,
DISABLE_PULLUP_H, PULLUP_H, ENABLE_VDDIO
);
```
[code link](https://github.com/google/skywater-pdk-libs-sky130_fd_io/blob/main/cells/top_xres4v2/sky130_fd_io__top_xres4v2.functional.v#L19C1-L22C36)
### sky130_fd_io__top_xres4v2.functional.pp.v
- add VCCD, VCCHIB, VDDA, VDDIO,VDDIO_Q, VSSA, VSSD, VSSIO, VSSIO_Q, VSWITCH
```
module sky130_fd_io__top_xres4v2 ( TIE_WEAK_HI_H, XRES_H_N, TIE_HI_ESD, TIE_LO_ESD,
AMUXBUS_A, AMUXBUS_B, PAD, PAD_A_ESD_H, ENABLE_H, EN_VDDIO_SIG_H, INP_SEL_H, FILT_IN_H,
DISABLE_PULLUP_H, PULLUP_H, ENABLE_VDDIO
,VCCD, VCCHIB, VDDA, VDDIO,VDDIO_Q, VSSA, VSSD, VSSIO, VSSIO_Q, VSWITCH
);
```
[code link](https://github.com/google/skywater-pdk-libs-sky130_fd_io/blob/main/cells/top_xres4v2/sky130_fd_io__top_xres4v2.functional.pp.v#L19C1-L23C36)
### sky130_fd_io__top_xres4v2.behavioral.v
```
module sky130_fd_io__top_xres4v2 ( TIE_WEAK_HI_H, XRES_H_N, TIE_HI_ESD, TIE_LO_ESD,
AMUXBUS_A, AMUXBUS_B, PAD, PAD_A_ESD_H, ENABLE_H, EN_VDDIO_SIG_H, INP_SEL_H, FILT_IN_H,
DISABLE_PULLUP_H, PULLUP_H, ENABLE_VDDIO
);
```
[code link](https://github.com/google/skywater-pdk-libs-sky130_fd_io/blob/main/cells/top_xres4v2/sky130_fd_io__top_xres4v2.behavioral.v#L19C1-L22C36)
### sky130_fd_io__top_xres4v2.behavioral.pp.v
- add VCCD, VCCHIB, VDDA, VDDIO,VDDIO_Q, VSSA, VSSD, VSSIO, VSSIO_Q, VSWITCH
```
module sky130_fd_io__top_xres4v2 ( TIE_WEAK_HI_H, XRES_H_N, TIE_HI_ESD, TIE_LO_ESD,
AMUXBUS_A, AMUXBUS_B, PAD, PAD_A_ESD_H, ENABLE_H, EN_VDDIO_SIG_H, INP_SEL_H, FILT_IN_H,
DISABLE_PULLUP_H, PULLUP_H, ENABLE_VDDIO
,VCCD, VCCHIB, VDDA, VDDIO,VDDIO_Q, VSSA, VSSD, VSSIO, VSSIO_Q, VSWITCH
);
```
[code link](https://github.com/google/skywater-pdk-libs-sky130_fd_io/blob/main/cells/top_xres4v2/sky130_fd_io__top_xres4v2.behavioral.pp.v#L19C1-L23C36)
#
```
// User Project Control (0x2300_0000)
#define reg_mprj_xfer (*(volatile uint32_t*)0x26000000)
#define reg_mprj_pwr (*(volatile uint32_t*)0x26000004)
#define reg_mprj_irq (*(volatile uint32_t*)0x26100014)
#define reg_mprj_datal (*(volatile uint32_t*)0x2600000c)
#define reg_mprj_datah (*(volatile uint32_t*)0x26000010)
#define reg_mprj_io_0 (*(volatile uint32_t*)0x26000024)
#define reg_mprj_io_1 (*(volatile uint32_t*)0x26000028)
#define reg_mprj_io_2 (*(volatile uint32_t*)0x2600002c)
#define reg_mprj_io_3 (*(volatile uint32_t*)0x26000030)
#define reg_mprj_io_4 (*(volatile uint32_t*)0x26000034)
#define reg_mprj_io_5 (*(volatile uint32_t*)0x26000038)
#define reg_mprj_io_6 (*(volatile uint32_t*)0x2600003c)
#define reg_mprj_io_7 (*(volatile uint32_t*)0x26000040)
#define reg_mprj_io_8 (*(volatile uint32_t*)0x26000044)
#define reg_mprj_io_9 (*(volatile uint32_t*)0x26000048)
#define reg_mprj_io_10 (*(volatile uint32_t*)0x2600004c)
#define reg_mprj_io_11 (*(volatile uint32_t*)0x26000050)
#define reg_mprj_io_12 (*(volatile uint32_t*)0x26000054)
#define reg_mprj_io_13 (*(volatile uint32_t*)0x26000058)
#define reg_mprj_io_14 (*(volatile uint32_t*)0x2600005c)
#define reg_mprj_io_15 (*(volatile uint32_t*)0x26000060)
#define reg_mprj_io_16 (*(volatile uint32_t*)0x26000064)
#define reg_mprj_io_17 (*(volatile uint32_t*)0x26000068)
#define reg_mprj_io_18 (*(volatile uint32_t*)0x2600006c)
#define reg_mprj_io_19 (*(volatile uint32_t*)0x26000070)
#define reg_mprj_io_20 (*(volatile uint32_t*)0x26000074)
#define reg_mprj_io_21 (*(volatile uint32_t*)0x26000078)
#define reg_mprj_io_22 (*(volatile uint32_t*)0x2600007c)
#define reg_mprj_io_23 (*(volatile uint32_t*)0x26000080)
#define reg_mprj_io_24 (*(volatile uint32_t*)0x26000084)
#define reg_mprj_io_25 (*(volatile uint32_t*)0x26000088)
#define reg_mprj_io_26 (*(volatile uint32_t*)0x2600008c)
#define reg_mprj_io_27 (*(volatile uint32_t*)0x26000090)
#define reg_mprj_io_28 (*(volatile uint32_t*)0x26000094)
#define reg_mprj_io_29 (*(volatile uint32_t*)0x26000098)
#define reg_mprj_io_30 (*(volatile uint32_t*)0x2600009c)
#define reg_mprj_io_31 (*(volatile uint32_t*)0x260000a0)
#define reg_mprj_io_32 (*(volatile uint32_t*)0x260000a4)
#define reg_mprj_io_33 (*(volatile uint32_t*)0x260000a8)
#define reg_mprj_io_34 (*(volatile uint32_t*)0x260000ac)
#define reg_mprj_io_35 (*(volatile uint32_t*)0x260000b0)
#define reg_mprj_io_36 (*(volatile uint32_t*)0x260000b4)
#define reg_mprj_io_37 (*(volatile uint32_t*)0x260000b8)
```
[code](https://github.com/bol-edu/caravel-soc/blob/main/firmware/caravel.h#L24C1-L75C57)