first version
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..2090a6a
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,337 @@
+# SPDX-FileCopyrightText: 2020 Efabless Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+MAKEFLAGS+=--warn-undefined-variables
+
+export CARAVEL_ROOT?=$(PWD)/caravel
+PRECHECK_ROOT?=${HOME}/mpw_precheck
+export MCW_ROOT?=$(PWD)/mgmt_core_wrapper
+SIM?=RTL
+DUMP?=OFF
+RISC_CORE ?=0
+
+# Install lite version of caravel, (1): caravel-lite, (0): caravel
+CARAVEL_LITE?=1
+
+# PDK switch varient
+export PDK?=sky130A
+#export PDK?=gf180mcuC
+export PDKPATH?=$(PDK_ROOT)/$(PDK)
+
+
+
+ifeq ($(PDK),sky130A)
+ SKYWATER_COMMIT=f70d8ca46961ff92719d8870a18a076370b85f6c
+ export OPEN_PDKS_COMMIT?=0059588eebfc704681dc2368bd1d33d96281d10f
+ export OPENLANE_TAG?=2022.10.20
+ MPW_TAG ?= mpw-7g
+
+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
+
+endif
+
+#RISCV COMPLIANCE test Environment
+COREMARK_DIR = verilog/dv/riscv_regress/dependencies/coremark
+RISCV_COMP_DIR = verilog/dv/riscv_regress/dependencies/riscv-compliance
+RISCV_TEST_DIR = verilog/dv/riscv_regress/dependencies/riscv-tests
+
+COREMARK_REPO = https://github.com/eembc/coremark
+RISCV_COMP_REPO = https://github.com/riscv/riscv-compliance
+RISCV_TEST_REPO = https://github.com/riscv/riscv-tests
+
+COREMARK_BRANCH = 7f420b6bdbff436810ef75381059944e2b0d79e8
+RISCV_COMP_BRANCH = d51259b2a949be3af02e776c39e135402675ac9b
+RISCV_TEST_BRANCH = e30978a71921159aec38eeefd848fca4ed39a826
+
+ifeq ($(PDK),sky130B)
+ SKYWATER_COMMIT=f70d8ca46961ff92719d8870a18a076370b85f6c
+ export OPEN_PDKS_COMMIT?=0059588eebfc704681dc2368bd1d33d96281d10f
+ export OPENLANE_TAG?=2022.10.20
+ MPW_TAG ?= mpw-7g
+
+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
+
+endif
+
+ifeq ($(PDK),gf180mcuC)
+
+ MPW_TAG ?= gfmpw-0a
+ CARAVEL_NAME := caravel
+ CARAVEL_REPO := https://github.com/efabless/caravel-gf180mcu
+ CARAVEL_TAG := $(MPW_TAG)
+ #OPENLANE_TAG=ddfeab57e3e8769ea3d40dda12be0460e09bb6d9
+ export OPEN_PDKS_COMMIT?=0059588eebfc704681dc2368bd1d33d96281d10f
+ export OPENLANE_TAG?=2022.11.17
+
+endif
+
+# Include Caravel Makefile Targets
+.PHONY: % : check-caravel
+%:
+ export CARAVEL_ROOT=$(CARAVEL_ROOT) && $(MAKE) -f $(CARAVEL_ROOT)/Makefile $@
+
+.PHONY: install
+install:
+ if [ -d "$(CARAVEL_ROOT)" ]; then\
+ echo "Deleting exisiting $(CARAVEL_ROOT)" && \
+ rm -rf $(CARAVEL_ROOT) && sleep 2;\
+ fi
+ echo "Installing $(CARAVEL_NAME).."
+ git clone -b $(CARAVEL_TAG) $(CARAVEL_REPO) $(CARAVEL_ROOT) --depth=1
+
+# Install DV setup
+.PHONY: simenv
+simenv:
+ docker pull riscduino/dv_setup:mpw7
+
+.PHONY: setup
+setup: install check-env install_mcw openlane pdk-with-volare setup-timing-scripts
+
+# Openlane
+blocks=$(shell cd openlane && find * -maxdepth 0 -type d)
+.PHONY: $(blocks)
+$(blocks): % :
+ $(MAKE) -C openlane $*
+
+
+PATTERNS=$(shell cd verilog/dv && find * -maxdepth 0 -type d)
+DV_PATTERNS = $(foreach dv, $(PATTERNS), verify-$(dv))
+TARGET_PATH=$(shell pwd)
+verify_command="cd ${TARGET_PATH}/verilog/dv/$* && export SIM=${SIM} DUMP=${DUMP} RISC_CORE=${RISC_CORE} && make"
+$(DV_PATTERNS): verify-% : ./verilog/dv/% check-coremark_repo check-riscv_comp_repo check-riscv_test_repo
+ docker run -v ${TARGET_PATH}:${TARGET_PATH} \
+ -e TARGET_PATH=${TARGET_PATH} \
+ -e TOOLS=/opt/riscv32i \
+ -e DESIGNS=$(TARGET_PATH) \
+ -e GCC_PREFIX=riscv32-unknown-elf \
+ -u $$(id -u $$USER):$$(id -g $$USER) riscduino/dv_setup:mpw7 \
+ sh -c $(verify_command)
+
+
+.PHONY: verify
+verify:
+ cd ./verilog/dv/ && \
+ export SIM=${SIM} DUMP=${DUMP} && \
+ $(MAKE) -j$(THREADS)
+
+
+# Install Openlane
+.PHONY: openlane
+openlane:
+ @if [ "$$(realpath $${OPENLANE_ROOT})" = "$$(realpath $$(pwd)/openlane)" ]; then\
+ echo "OPENLANE_ROOT is set to '$$(pwd)/openlane' which contains openlane config files"; \
+ echo "Please set it to a different directory"; \
+ exit 1; \
+ fi
+ cd openlane && $(MAKE) openlane
+
+#### Not sure if the targets following are of any use
+
+# Create symbolic links to caravel's main files
+.PHONY: simlink
+simlink: check-caravel
+### Symbolic links relative path to $CARAVEL_ROOT
+ $(eval MAKEFILE_PATH := $(shell realpath --relative-to=openlane $(CARAVEL_ROOT)/openlane/Makefile))
+ $(eval PIN_CFG_PATH := $(shell realpath --relative-to=openlane/user_project_wrapper $(CARAVEL_ROOT)/openlane/user_project_wrapper_empty/pin_order.cfg))
+ mkdir -p openlane
+ mkdir -p openlane/user_project_wrapper
+ cd openlane &&\
+ ln -sf $(MAKEFILE_PATH) Makefile
+ cd openlane/user_project_wrapper &&\
+ ln -sf $(PIN_CFG_PATH) pin_order.cfg
+
+# Update Caravel
+.PHONY: update_caravel
+update_caravel: check-caravel
+ cd $(CARAVEL_ROOT)/ && git checkout $(CARAVEL_TAG) && git pull
+
+# Uninstall Caravel
+.PHONY: uninstall
+uninstall:
+ rm -rf $(CARAVEL_ROOT)
+
+
+# Install Pre-check
+# Default installs to the user home directory, override by "export PRECHECK_ROOT=<precheck-installation-path>"
+.PHONY: precheck
+precheck:
+ @git clone --depth=1 --branch $(MPW_TAG) https://github.com/efabless/mpw_precheck.git $(PRECHECK_ROOT)
+ @docker pull efabless/mpw_precheck:latest
+
+.PHONY: run-precheck
+run-precheck: check-pdk check-precheck
+ $(eval INPUT_DIRECTORY := $(shell pwd))
+ cd $(PRECHECK_ROOT) && \
+ docker run -v $(PRECHECK_ROOT):$(PRECHECK_ROOT) \
+ -v $(INPUT_DIRECTORY):$(INPUT_DIRECTORY) \
+ -v $(PDK_ROOT):$(PDK_ROOT) \
+ -e INPUT_DIRECTORY=$(INPUT_DIRECTORY) \
+ -e PDK_PATH=$(PDK_ROOT)/$(PDK) \
+ -e PDK_ROOT=$(PDK_ROOT) \
+ -e PDKPATH=$(PDKPATH) \
+ -u $(shell id -u $(USER)):$(shell id -g $(USER)) \
+ efabless/mpw_precheck:latest bash -c "cd $(PRECHECK_ROOT) ; python3 mpw_precheck.py --input_directory $(INPUT_DIRECTORY) --pdk_path $(PDK_ROOT)/$(PDK)"
+
+
+
+.PHONY: clean
+clean:
+ cd ./verilog/dv/ && \
+ $(MAKE) -j$(THREADS) clean
+
+check-caravel:
+ @if [ ! -d "$(CARAVEL_ROOT)" ]; then \
+ echo "Caravel Root: "$(CARAVEL_ROOT)" doesn't exists, please export the correct path before running make. "; \
+ exit 1; \
+ fi
+
+check-precheck:
+ @if [ ! -d "$(PRECHECK_ROOT)" ]; then \
+ echo "Pre-check Root: "$(PRECHECK_ROOT)" doesn't exists, please export the correct path before running make. "; \
+ exit 1; \
+ fi
+
+check-pdk:
+ @if [ ! -d "$(PDK_ROOT)" ]; then \
+ echo "PDK Root: "$(PDK_ROOT)" doesn't exists, please export the correct path before running make. "; \
+ exit 1; \
+ fi
+
+check-coremark_repo:
+ @if [ ! -d "$(COREMARK_DIR)" ]; then \
+ echo "Installing Core Mark Repo.."; \
+ git clone $(COREMARK_REPO) $(COREMARK_DIR); \
+ cd $(COREMARK_DIR); git checkout $(COREMARK_BRANCH); \
+ fi
+
+check-riscv_comp_repo:
+ @if [ ! -d "$(RISCV_COMP_DIR)" ]; then \
+ echo "Installing Risc V Complance Repo.."; \
+ git clone $(RISCV_COMP_REPO) $(RISCV_COMP_DIR); \
+ cd $(RISCV_COMP_DIR); git checkout $(RISCV_COMP_BRANCH); \
+ fi
+
+check-riscv_test_repo:
+ @if [ ! -d "$(RISCV_TEST_DIR)" ]; then \
+ echo "Installing RiscV Test Repo.."; \
+ git clone $(RISCV_TEST_REPO) $(RISCV_TEST_DIR); \
+ cd $(RISCV_TEST_DIR); git checkout $(RISCV_TEST_BRANCH); \
+ fi
+
+zip:
+ gzip -f -r lef/*
+ gzip -f -r gds/*
+ gzip -f -r spef/*
+ gzip -f -r spi/lvs/*
+ gzip -f -r verilog/gl/*
+
+unzip:
+ gzip -d -r lef/*
+ gzip -d -r gds/*
+ gzip -d -r spef/*
+ gzip -d -r spi/lvs/*
+ gzip -d -r verilog/gl/*
+
+.PHONY: help
+help:
+ cd $(CARAVEL_ROOT) && $(MAKE) help
+ @$(MAKE) -pRrq -f $(lastword $(MAKEFILE_LIST)) : 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | sort | egrep -v -e '^[^[:alnum:]]' -e '^$@$$'
+
+
+export CUP_ROOT=$(shell pwd)
+export TIMING_ROOT?=$(shell pwd)/deps/timing-scripts
+export PROJECT_ROOT=$(CUP_ROOT)
+timing-scripts-repo=https://github.com/efabless/timing-scripts.git
+
+$(TIMING_ROOT):
+ @mkdir -p $(CUP_ROOT)/deps
+ @git clone $(timing-scripts-repo) $(TIMING_ROOT)
+
+.PHONY: setup-timing-scripts
+setup-timing-scripts: $(TIMING_ROOT)
+ @( cd $(TIMING_ROOT) && git pull )
+ @#( cd $(TIMING_ROOT) && git fetch && git checkout $(MPW_TAG); )
+ @python3 -m venv ./venv
+ . ./venv/bin/activate && \
+ python3 -m pip install --upgrade pip && \
+ python3 -m pip install -r $(TIMING_ROOT)/requirements.txt && \
+ deactivate
+
+./verilog/gl/user_project_wrapper.v:
+ $(error you don't have $@)
+
+./env/spef-mapping.tcl:
+ @echo "run the following:"
+ @echo "make extract-parasitics"
+ @echo "make create-spef-mapping"
+ exit 1
+
+.PHONY: create-spef-mapping
+create-spef-mapping: ./verilog/gl/user_project_wrapper.v
+ @. ./venv/bin/activate && \
+ python3 $(TIMING_ROOT)/scripts/generate_spef_mapping.py \
+ -i ./verilog/gl/user_project_wrapper.v \
+ -o ./env/spef-mapping.tcl \
+ --pdk-path $(PDK_ROOT)/$(PDK) \
+ --macro-parent mprj \
+ --project-root "$(CUP_ROOT)" && \
+ deactivate
+
+.PHONY: extract-parasitics
+extract-parasitics: ./verilog/gl/user_project_wrapper.v
+ @. ./venv/bin/activate && \
+ python3 $(TIMING_ROOT)/scripts/get_macros.py \
+ -i ./verilog/gl/user_project_wrapper.v \
+ -o ./tmp-macros-list \
+ --project-root "$(CUP_ROOT)" \
+ --pdk-path $(PDK_ROOT)/$(PDK) && \
+ deactivate
+ @cat ./tmp-macros-list | cut -d " " -f2 \
+ | xargs -I % bash -c "$(MAKE) -C $(TIMING_ROOT) \
+ -f $(TIMING_ROOT)/timing.mk rcx-% || echo 'Cannot extract %. Probably no def for this macro'"
+ @$(MAKE) -C $(TIMING_ROOT) -f $(TIMING_ROOT)/timing.mk rcx-user_project_wrapper
+ @cat ./tmp-macros-list
+ @rm ./tmp-macros-list
+
+.PHONY: caravel-sta
+caravel-sta: ./env/spef-mapping.tcl
+ @$(MAKE) -C $(TIMING_ROOT) -f $(TIMING_ROOT)/timing.mk caravel-timing-typ
+ @$(MAKE) -C $(TIMING_ROOT) -f $(TIMING_ROOT)/timing.mk caravel-timing-fast
+ @$(MAKE) -C $(TIMING_ROOT) -f $(TIMING_ROOT)/timing.mk caravel-timing-slow
+ @echo "You can find results for all corners in $(CUP_ROOT)/signoff/caravel/openlane-signoff/timing/"
+
+#Added by Dinesh-A for Klayout Based DRC check
+.PHONY: run-drc
+run-drc:
+ @echo "run kalyout DRC checks"
+ mkdir -p signoff/user_project_wrapper/openlane-signoff/drc
+ docker run -ti --rm -v $(PROJECT_ROOT):/project riscduino/openlane:mpw7 sh -c "cd /project && ./scripts/klayout_drc.sh user_project_wrapper "
+
diff --git a/gds/user_project_wrapper.gds.gz b/gds/user_project_wrapper.gds.gz
new file mode 100644
index 0000000..7977ac7
--- /dev/null
+++ b/gds/user_project_wrapper.gds.gz
Binary files differ
diff --git a/lef/user_project_wrapper.lef.gz b/lef/user_project_wrapper.lef.gz
new file mode 100644
index 0000000..cceffca
--- /dev/null
+++ b/lef/user_project_wrapper.lef.gz
Binary files differ
diff --git a/openlane/Makefile b/openlane/Makefile
new file mode 100644
index 0000000..3c48c94
--- /dev/null
+++ b/openlane/Makefile
@@ -0,0 +1,95 @@
+# SPDX-FileCopyrightText: 2020 Efabless Corporation
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+#SHELL = sh -xv
+
+BLOCKS = $(shell find * -maxdepth 0 -type d)
+CONFIG = $(foreach block,$(BLOCKS), ./$(block)/config.tcl)
+CLEAN = $(foreach block,$(BLOCKS), clean-$(block))
+
+OPENLANE_TAG = mpw7
+OPENLANE_IMAGE_NAME = riscduino/openlane:$(OPENLANE_TAG)
+OPENLANE_BASIC_COMMAND = "cd $(PWD)/../openlane && flow.tcl -design ./$* -save_path .. -save -tag $* -overwrite"
+OPENLANE_INTERACTIVE_COMMAND = "cd $(PWD)/../openlane && flow.tcl -design ./$* -save_path .. -save -tag $* -overwrite -it -file ./$*/interactive.tcl"
+
+all: $(BLOCKS)
+
+$(CONFIG) :
+ @echo "Missing $@. Please create a configuration for that design"
+ @exit 1
+
+.PHONY: $(BLOCKS)
+$(BLOCKS) : % : ./%/config.tcl
+ifeq ($(OPENLANE_ROOT),)
+ @echo "Please export OPENLANE_ROOT"
+ @exit 1
+endif
+ifeq ($(PDK_ROOT),)
+ @echo "Please export PDK_ROOT"
+ @exit 1
+endif
+ @echo "###############################################"
+ @sleep 1
+
+ @if [ -f ./$*/interactive.tcl ]; then\
+ docker run --rm \
+ -v $(PWD)/..:$(PWD)/.. \
+ -e TEST_MISMATCHES=tools \
+ -e MISMATCHES_OK=1 \
+ -u $(shell id -u $(USER)):$(shell id -g $(USER)) \
+ $(OPENLANE_IMAGE_NAME) sh -c $(OPENLANE_INTERACTIVE_COMMAND);\
+ else\
+ docker run --rm \
+ -v $(PWD)/..:$(PWD)/.. \
+ -e TEST_MISMATCHES=tools \
+ -e MISMATCHES_OK=1 \
+ -u $(shell id -u $(USER)):$(shell id -g $(USER)) \
+ $(OPENLANE_IMAGE_NAME) sh -c $(OPENLANE_BASIC_COMMAND);\
+ fi
+ mkdir -p ../signoff/$*/
+ cp $*/runs/$*/OPENLANE_VERSION ../signoff/$*/
+ cp $*/runs/$*/PDK_SOURCES ../signoff/$*/
+ cp $*/runs/$*/reports/final_summary_report.csv ../signoff/$*/
+
+.PHONY: openlane
+openlane: check-openlane-env
+ if [ -d "$(OPENLANE_ROOT)" ]; then\
+ echo "Deleting exisiting $(OPENLANE_ROOT)" && \
+ rm -rf $(OPENLANE_ROOT) && sleep 2; \
+ fi
+ git clone https://github.com/The-OpenROAD-Project/OpenLane --branch=$(OPENLANE_TAG) --depth=1 $(OPENLANE_ROOT) && \
+ cd $(OPENLANE_ROOT) && \
+ export OPENLANE_IMAGE_NAME=efabless/openlane:$(OPENLANE_TAG) && \
+ export IMAGE_NAME=efabless/openlane:$(OPENLANE_TAG) && \
+ $(MAKE) pull-openlane
+
+.PHONY: check-openlane-env
+check-openlane-env:
+ifeq ($(OPENLANE_ROOT),)
+ @echo "Please export OPENLANE_ROOT"
+ @exit 1
+endif
+
+FORCE:
+
+clean:
+ @echo "Use clean_all to clean everything :)"
+
+clean_all: $(CLEAN)
+
+$(CLEAN): clean-% :
+ rm -rf runs/$*
+ rm -rf ../gds/$**
+ rm -rf ../mag/$**
+ rm -rf ../lef/$**
diff --git a/openlane/glbl_cfg/base.sdc b/openlane/glbl_cfg/base.sdc
new file mode 100644
index 0000000..33f7cc8
--- /dev/null
+++ b/openlane/glbl_cfg/base.sdc
@@ -0,0 +1,112 @@
+###############################################################################
+# Created by write_sdc
+# Sat Nov 13 06:33:41 2021
+###############################################################################
+current_design glbl_cfg
+###############################################################################
+# Timing Constraints
+###############################################################################
+create_clock -name mclk -period 10.0000 [get_ports {mclk}]
+set_clock_uncertainty -rise_from [get_clocks {mclk}] -rise_to [get_clocks {mclk}] -hold 0.2500
+set_clock_uncertainty -rise_from [get_clocks {mclk}] -rise_to [get_clocks {mclk}] -setup 0.2500
+set_clock_uncertainty -rise_from [get_clocks {mclk}] -fall_to [get_clocks {mclk}] -hold 0.2500
+set_clock_uncertainty -rise_from [get_clocks {mclk}] -fall_to [get_clocks {mclk}] -setup 0.2500
+set_clock_uncertainty -fall_from [get_clocks {mclk}] -rise_to [get_clocks {mclk}] -hold 0.2500
+set_clock_uncertainty -fall_from [get_clocks {mclk}] -rise_to [get_clocks {mclk}] -setup 0.2500
+set_clock_uncertainty -fall_from [get_clocks {mclk}] -fall_to [get_clocks {mclk}] -hold 0.2500
+set_clock_uncertainty -fall_from [get_clocks {mclk}] -fall_to [get_clocks {mclk}] -setup 0.2500
+
+set ::env(SYNTH_TIMING_DERATE) 0.05
+puts "\[INFO\]: Setting timing derate to: [expr {$::env(SYNTH_TIMING_DERATE) * 10}] %"
+set_timing_derate -early [expr {1-$::env(SYNTH_TIMING_DERATE)}]
+set_timing_derate -late [expr {1+$::env(SYNTH_TIMING_DERATE)}]
+
+
+set_input_delay -max 6.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {reg_addr[*]}]
+set_input_delay -max 6.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {reg_be[*]}]
+set_input_delay -max 6.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {reg_cs}]
+set_input_delay -max 6.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {reg_wdata[*]}]
+set_input_delay -max 6.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {reg_wr}]
+set_input_delay -max 6.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {reset_n}]
+
+set_input_delay -min 2.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {reg_addr[*]}]
+set_input_delay -min 2.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {reg_be[*]}]
+set_input_delay -min 2.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {reg_cs}]
+set_input_delay -min 2.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {reg_wdata[*]}]
+set_input_delay -min 2.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {reg_wr}]
+set_input_delay -min 2.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {reset_n}]
+
+set_output_delay -max 6.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {reg_ack}]
+set_output_delay -max 6.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {reg_rdata[*]}]
+
+set_output_delay -min 1.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {reg_ack}]
+set_output_delay -min 1.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {reg_rdata[*]}]
+
+
+set_input_delay -max 6.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_done[*]}]
+set_input_delay -max 6.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_error[*]}]
+set_input_delay -max 6.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_correct[*]}]
+set_input_delay -max 6.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_done[*]}]
+set_input_delay -max 6.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_error_cnt0[*]}]
+set_input_delay -max 6.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_error_cnt1[*]}]
+set_input_delay -max 6.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_error_cnt2[*]}]
+set_input_delay -max 6.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_error_cnt3[*]}]
+set_input_delay -max 6.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_error_cnt4[*]}]
+set_input_delay -max 6.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_error_cnt5[*]}]
+set_input_delay -max 6.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_error_cnt6[*]}]
+set_input_delay -max 6.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_error_cnt7[*]}]
+set_input_delay -max 6.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_sdo[*]}]
+
+set_input_delay -min 2.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_done[*]}]
+set_input_delay -min 2.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_error[*]}]
+set_input_delay -min 2.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_correct[*]}]
+set_input_delay -min 2.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_done[*]}]
+set_input_delay -min 2.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_error_cnt0[*]}]
+set_input_delay -min 2.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_error_cnt1[*]}]
+set_input_delay -min 2.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_error_cnt2[*]}]
+set_input_delay -min 2.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_error_cnt3[*]}]
+set_input_delay -min 2.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_error_cnt4[*]}]
+set_input_delay -min 2.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_error_cnt5[*]}]
+set_input_delay -min 2.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_error_cnt6[*]}]
+set_input_delay -min 2.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_error_cnt7[*]}]
+set_input_delay -min 2.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_sdo[*]}]
+
+
+set_output_delay -max 6.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_en}]
+set_output_delay -max 6.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_run[*]}]
+set_output_delay -max 6.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_load[*]}]
+set_output_delay -max 6.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_sdi[*]}]
+set_output_delay -max 6.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_shift[*]}]
+
+set_output_delay -min 2.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_en}]
+set_output_delay -min 2.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_run[*]}]
+set_output_delay -min 2.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_load[*]}]
+set_output_delay -min 2.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_sdi[*]}]
+set_output_delay -min 2.0000 -clock [get_clocks {mclk}] -add_delay [get_ports {bist_shift[*]}]
+
+# Set max delay for clock skew
+set_max_delay 3.5 -from [get_ports {wbd_clk_int}]
+set_max_delay 2.5 -from wbd_clk_int -to wbd_clk_glbl
+
+set_case_analysis 0 [get_ports {cfg_cska_glbl[0]}]
+set_case_analysis 0 [get_ports {cfg_cska_glbl[1]}]
+set_case_analysis 0 [get_ports {cfg_cska_glbl[2]}]
+set_case_analysis 0 [get_ports {cfg_cska_glbl[3]}]
+
+set_case_analysis 0 [get_ports {scan_en}]
+set_case_analysis 0 [get_ports {scan_mode}]
+set_false_path -from [get_ports {scan_in[*]}]
+set_false_path -to [get_ports {scan_out[*]}]
+
+###############################################################################
+# Environment
+###############################################################################
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin $::env(SYNTH_DRIVING_CELL_PIN) [all_inputs]
+set cap_load [expr $::env(SYNTH_CAP_LOAD) / 1000.0]
+puts "\[INFO\]: Setting load to: $cap_load"
+set_load $cap_load [all_outputs]
+
+
+###############################################################################
+# Design Rules
+###############################################################################
diff --git a/openlane/glbl_cfg/config.tcl b/openlane/glbl_cfg/config.tcl
new file mode 100755
index 0000000..cc03862
--- /dev/null
+++ b/openlane/glbl_cfg/config.tcl
@@ -0,0 +1,117 @@
+# SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# SPDX-License-Identifier: Apache-2.0
+# SPDX-FileContributor: Modified by Dinesh Annayya <dinesha@opencores.org>
+
+# Global
+# ------
+
+set script_dir [file dirname [file normalize [info script]]]
+# Name
+set ::env(DESIGN_NAME) glbl_cfg
+
+set ::env(DESIGN_IS_CORE) "0"
+set ::env(FP_PDN_CORE_RING) "0"
+
+# Timing configuration
+set ::env(CLOCK_PERIOD) "10"
+set ::env(CLOCK_PORT) "mclk"
+
+set ::env(SYNTH_MAX_FANOUT) 4
+set ::env(SYNTH_BUFFERING) {0}
+
+## CTS BUFFER
+set ::env(CTS_CLK_BUFFER_LIST) "sky130_fd_sc_hd__clkbuf_4 sky130_fd_sc_hd__clkbuf_8"
+set ::env(CTS_SINK_CLUSTERING_SIZE) "16"
+set ::env(CLOCK_BUFFER_FANOUT) "8"
+
+# Sources
+# -------
+
+# Local sources + no2usb sources
+set ::env(VERILOG_FILES) "\
+ $::env(DESIGN_DIR)/../../verilog/rtl/clk_skew_adjust/src/clk_skew_adjust.gv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/lib/registers.v \
+ $::env(DESIGN_DIR)/../../verilog/rtl/lib/clk_ctl.v \
+ $::env(DESIGN_DIR)/../../verilog/rtl/lib/ser_inf_32b.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/glbl/src/glbl_cfg.sv \
+ "
+
+set ::env(SYNTH_READ_BLACKBOX_LIB) 1
+set ::env(SYNTH_DEFINES) [list SYNTHESIS ]
+set ::env(SDC_FILE) "$::env(DESIGN_DIR)/base.sdc"
+set ::env(BASE_SDC_FILE) "$::env(DESIGN_DIR)/base.sdc"
+
+set ::env(LEC_ENABLE) 0
+
+set ::env(VDD_PIN) [list {vccd1}]
+set ::env(GND_PIN) [list {vssd1}]
+
+set ::env(SCAN_TOTAL_CHAINS) 8
+
+# Floorplanning
+# -------------
+
+set ::env(FP_PIN_ORDER_CFG) $::env(DESIGN_DIR)/pin_order.cfg
+
+set ::env(FP_SIZING) absolute
+set ::env(DIE_AREA) "0 0 250 300"
+
+
+# If you're going to use multiple power domains, then keep this disabled.
+set ::env(RUN_CVC) 0
+
+#set ::env(PDN_CFG) $script_dir/pdn.tcl
+
+
+set ::env(PL_TIME_DRIVEN) 1
+set ::env(PL_TARGET_DENSITY) "0.35"
+
+# helps in anteena fix
+set ::env(USE_ARC_ANTENNA_CHECK) "1"
+
+set ::env(FP_IO_VEXTEND) 4
+set ::env(FP_IO_HEXTEND) 4
+
+set ::env(FP_PDN_VPITCH) 100
+set ::env(FP_PDN_HPITCH) 100
+set ::env(FP_PDN_VWIDTH) 6.2
+set ::env(FP_PDN_HWIDTH) 6.2
+
+#set ::env(GLB_RT_MAXLAYER) 5
+set ::env(RT_MAX_LAYER) {met4}
+
+#Lef
+set ::env(MAGIC_GENERATE_LEF) {1}
+set ::env(MAGIC_WRITE_FULL_LEF) {0}
+
+set ::env(DIODE_INSERTION_STRATEGY) 4
+
+
+#LVS Issue - DEF Base looks to having issue
+set ::env(MAGIC_EXT_USE_GDS) {1}
+
+set ::env(GLB_RESIZER_MAX_SLEW_MARGIN) {1.5}
+set ::env(PL_RESIZER_MAX_SLEW_MARGIN) {1.5}
+
+set ::env(GLB_RESIZER_MAX_CAP_MARGIN) {0.25}
+set ::env(PL_RESIZER_MAX_CAP_MARGIN) {0.25}
+
+set ::env(GLB_RESIZER_MAX_WIRE_LENGTH) {500}
+set ::env(PL_RESIZER_MAX_WIRE_LENGTH) {500}
+
+set ::env(QUIT_ON_TIMING_VIOLATIONS) "0"
+set ::env(QUIT_ON_MAGIC_DRC) "1"
+set ::env(QUIT_ON_LVS_ERROR) "1"
+set ::env(QUIT_ON_SLEW_VIOLATIONS) "0"
diff --git a/openlane/glbl_cfg/pdn.tcl b/openlane/glbl_cfg/pdn.tcl
new file mode 100644
index 0000000..1fe689b
--- /dev/null
+++ b/openlane/glbl_cfg/pdn.tcl
@@ -0,0 +1,49 @@
+# SPDX-FileCopyrightText: 2020 Efabless Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# SPDX-License-Identifier: Apache-2.0
+
+# Power nets
+set ::power_nets $::env(VDD_PIN)
+set ::ground_nets $::env(GND_PIN)
+
+set ::macro_blockage_layer_list "li1 met1 met2 met3 met4 met5"
+
+pdngen::specify_grid stdcell {
+ name grid
+ rails {
+ met1 {width 0.48 pitch $::env(PLACE_SITE_HEIGHT) offset 0}
+ }
+ straps {
+ met4 {width 1.6 pitch $::env(FP_PDN_VPITCH) offset $::env(FP_PDN_VOFFSET)}
+ met5 {width 1.6 pitch $::env(FP_PDN_HPITCH) offset $::env(FP_PDN_HOFFSET)}
+ }
+ connect {{met1 met4} {met4 met5}}
+}
+
+pdngen::specify_grid macro {
+ power_pins "VPWR"
+ ground_pins "VGND"
+ blockages "li1 met1 met2 met3 met4"
+ straps {
+ }
+ connect {{met4_PIN_ver met5}}
+}
+
+set ::halo 5
+
+# POWER or GROUND #Std. cell rails starting with power or ground rails at the bottom of the core area
+set ::rails_start_with "POWER" ;
+
+# POWER or GROUND #Upper metal stripes starting with power or ground rails at the left/bottom of the core area
+set ::stripes_start_with "POWER" ;
diff --git a/openlane/glbl_cfg/pin_order.cfg b/openlane/glbl_cfg/pin_order.cfg
new file mode 100644
index 0000000..d31edcc
--- /dev/null
+++ b/openlane/glbl_cfg/pin_order.cfg
@@ -0,0 +1,231 @@
+#BUS_SORT
+
+#MANUAL_PLACE
+
+
+#S
+scan_en_o 0100 0 2
+scan_mode_o
+scan_so\[7\]
+scan_so\[6\]
+scan_so\[5\]
+scan_so\[4\]
+scan_so\[3\]
+scan_so\[2\]
+scan_so\[1\]
+scan_so\[0\]
+
+
+#N
+reset_n 0000 0
+scan_en 0100 0 2
+scan_mode
+scan_si\[7\]
+scan_si\[6\]
+scan_si\[5\]
+scan_si\[4\]
+scan_si\[3\]
+scan_si\[2\]
+scan_si\[1\]
+scan_si\[0\]
+
+
+#E
+cfg_cska_glbl\[3\] 0000 0 4
+cfg_cska_glbl\[2\]
+cfg_cska_glbl\[1\]
+cfg_cska_glbl\[0\]
+mclk
+wbd_clk_glbl
+wbd_clk_int 0025 0 2
+reg_cs
+reg_wr
+reg_addr\[7\]
+reg_addr\[6\]
+reg_addr\[5\]
+reg_addr\[4\]
+reg_addr\[3\]
+reg_addr\[2\]
+reg_addr\[1\]
+reg_addr\[0\]
+reg_be\[3\]
+reg_be\[2\]
+reg_be\[1\]
+reg_be\[0\]
+reg_wdata\[31\]
+reg_wdata\[30\]
+reg_wdata\[29\]
+reg_wdata\[28\]
+reg_wdata\[27\]
+reg_wdata\[26\]
+reg_wdata\[25\]
+reg_wdata\[24\]
+reg_wdata\[23\]
+reg_wdata\[22\]
+reg_wdata\[21\]
+reg_wdata\[20\]
+reg_wdata\[19\]
+reg_wdata\[18\]
+reg_wdata\[17\]
+reg_wdata\[16\]
+reg_wdata\[15\]
+reg_wdata\[14\]
+reg_wdata\[13\]
+reg_wdata\[12\]
+reg_wdata\[11\]
+reg_wdata\[10\]
+reg_wdata\[9\]
+reg_wdata\[8\]
+reg_wdata\[7\]
+reg_wdata\[6\]
+reg_wdata\[5\]
+reg_wdata\[4\]
+reg_wdata\[3\]
+reg_wdata\[2\]
+reg_wdata\[1\]
+reg_wdata\[0\]
+reg_rdata\[31\]
+reg_rdata\[30\]
+reg_rdata\[29\]
+reg_rdata\[28\]
+reg_rdata\[27\]
+reg_rdata\[26\]
+reg_rdata\[25\]
+reg_rdata\[24\]
+reg_rdata\[23\]
+reg_rdata\[22\]
+reg_rdata\[21\]
+reg_rdata\[20\]
+reg_rdata\[19\]
+reg_rdata\[18\]
+reg_rdata\[17\]
+reg_rdata\[16\]
+reg_rdata\[15\]
+reg_rdata\[14\]
+reg_rdata\[13\]
+reg_rdata\[12\]
+reg_rdata\[11\]
+reg_rdata\[10\]
+reg_rdata\[9\]
+reg_rdata\[8\]
+reg_rdata\[7\]
+reg_rdata\[6\]
+reg_rdata\[5\]
+reg_rdata\[4\]
+reg_rdata\[3\]
+reg_rdata\[2\]
+reg_rdata\[1\]
+reg_rdata\[0\]
+reg_ack
+
+bist_en\[0\] 0150 0 2
+bist_run\[0\]
+bist_shift\[0\]
+bist_load\[0\]
+bist_sdi\[0\]
+bist_sdo\[0\]
+bist_done\[0\]
+bist_error\[0\]
+bist_correct\[0\]
+bist_error_cnt0\[0\]
+bist_error_cnt0\[1\]
+bist_error_cnt0\[2\]
+bist_error_cnt0\[3\]
+
+bist_en\[1\]
+bist_run\[1\]
+bist_shift\[1\]
+bist_load\[1\]
+bist_sdi\[1\]
+bist_sdo\[1\]
+bist_done\[1\]
+bist_error\[1\]
+bist_correct\[1\]
+bist_error_cnt1\[0\]
+bist_error_cnt1\[1\]
+bist_error_cnt1\[2\]
+bist_error_cnt1\[3\]
+
+bist_en\[2\]
+bist_run\[2\]
+bist_shift\[2\]
+bist_load\[2\]
+bist_sdi\[2\]
+bist_sdo\[2\]
+bist_done\[2\]
+bist_error\[2\]
+bist_correct\[2\]
+bist_error_cnt2\[0\]
+bist_error_cnt2\[1\]
+bist_error_cnt2\[2\]
+bist_error_cnt2\[3\]
+
+bist_en\[3\]
+bist_run\[3\]
+bist_shift\[3\]
+bist_load\[3\]
+bist_sdi\[3\]
+bist_sdo\[3\]
+bist_done\[3\]
+bist_error\[3\]
+bist_correct\[3\]
+bist_error_cnt3\[0\]
+bist_error_cnt3\[1\]
+bist_error_cnt3\[2\]
+bist_error_cnt3\[3\]
+
+bist_en\[4\]
+bist_run\[4\]
+bist_shift\[4\]
+bist_load\[4\]
+bist_sdi\[4\]
+bist_sdo\[4\]
+bist_done\[4\]
+bist_error\[4\]
+bist_correct\[4\]
+bist_error_cnt4\[0\]
+bist_error_cnt4\[1\]
+bist_error_cnt4\[2\]
+bist_error_cnt4\[3\]
+
+bist_en\[5\]
+bist_run\[5\]
+bist_shift\[5\]
+bist_load\[5\]
+bist_sdi\[5\]
+bist_sdo\[5\]
+bist_done\[5\]
+bist_error\[5\]
+bist_correct\[5\]
+bist_error_cnt5\[0\]
+bist_error_cnt5\[1\]
+bist_error_cnt5\[2\]
+bist_error_cnt5\[3\]
+
+bist_en\[6\]
+bist_run\[6\]
+bist_shift\[6\]
+bist_load\[6\]
+bist_sdi\[6\]
+bist_sdo\[6\]
+bist_done\[6\]
+bist_error\[6\]
+bist_correct\[6\]
+bist_error_cnt6\[0\]
+bist_error_cnt6\[1\]
+bist_error_cnt6\[2\]
+bist_error_cnt6\[3\]
+
+bist_en\[7\]
+bist_run\[7\]
+bist_shift\[7\]
+bist_load\[7\]
+bist_sdi\[7\]
+bist_sdo\[7\]
+bist_done\[7\]
+bist_error\[7\]
+bist_correct\[7\]
+bist_error_cnt7\[0\]
+bist_error_cnt7\[1\]
+bist_error_cnt7\[2\]
+bist_error_cnt7\[3\]
diff --git a/openlane/mbist_top1/base.sdc b/openlane/mbist_top1/base.sdc
new file mode 100644
index 0000000..8ae25b1
--- /dev/null
+++ b/openlane/mbist_top1/base.sdc
@@ -0,0 +1,163 @@
+###############################################################################
+# Created by write_sdc
+# Sun Nov 14 09:33:23 2021
+###############################################################################
+current_design mbist_top
+###############################################################################
+# Timing Constraints
+###############################################################################
+create_clock -name wb_clk_i -period 10.0000 [get_ports {wb_clk_i}]
+create_generated_clock -name bist_mem_clk_a -add -source [get_ports {wb_clk_i}] -master_clock [get_clocks wb_clk_i] -divide_by 1 -comment {Mem Clock A} [get_ports mem_clk_a]
+create_generated_clock -name bist_mem_clk_b -add -source [get_ports {wb_clk_i}] -master_clock [get_clocks wb_clk_i] -divide_by 1 -comment {Mem Clock B} [get_ports mem_clk_b]
+
+set_clock_groups -name async_clock -asynchronous -comment "Async Clock group" -group [get_clocks {wb_clk_i bist_mem_clk_a bist_mem_clk_b}]
+
+set_clock_transition 0.1500 [get_clocks {wb_clk_i}]
+set_clock_uncertainty -setup 0.2500 wb_clk_i
+set_clock_uncertainty -setup 0.2500 mem_clk_a
+set_clock_uncertainty -setup 0.2500 mem_clk_b
+
+set_clock_uncertainty -hold 0.2500 wb_clk_i
+set_clock_uncertainty -hold 0.2500 mem_clk_a
+set_clock_uncertainty -hold 0.2500 mem_clk_b
+
+set ::env(SYNTH_TIMING_DERATE) 0.05
+puts "\[INFO\]: Setting timing derate to: [expr {$::env(SYNTH_TIMING_DERATE) * 10}] %"
+set_timing_derate -early [expr {1-$::env(SYNTH_TIMING_DERATE)}]
+set_timing_derate -late [expr {1+$::env(SYNTH_TIMING_DERATE)}]
+
+set_input_delay -max 5.0000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {rst_n}]
+set_input_delay -min 2.0000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {rst_n}]
+
+set_output_delay -max 4.5000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_correct}]
+set_output_delay -max 4.5000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_done}]
+set_output_delay -max 4.5000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_error}]
+set_output_delay -max 4.5000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_error_cnt[0]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_error_cnt[1]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_error_cnt[2]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_error_cnt[3]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_sdo}]
+
+set_output_delay -min 2.0000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_correct}]
+set_output_delay -min 2.0000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_done}]
+set_output_delay -min 2.0000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_error}]
+set_output_delay -min 2.0000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_error_cnt[0]}]
+set_output_delay -min 2.0000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_error_cnt[1]}]
+set_output_delay -min 2.0000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_error_cnt[2]}]
+set_output_delay -min 2.0000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_error_cnt[3]}]
+set_output_delay -min 2.0000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_sdo}]
+
+set_false_path -from [get_ports {bist_en}]
+set_input_delay -max 4 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_load}]
+set_input_delay -max 4 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_run}]
+set_input_delay -max 4 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_sdi}]
+set_input_delay -max 4 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_shift}]
+
+set_input_delay -min 2 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_en}]
+set_input_delay -min 2 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_load}]
+set_input_delay -min 2 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_run}]
+set_input_delay -min 2 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_sdi}]
+set_input_delay -min 2 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_shift}]
+
+## Functional Inputs
+set_input_delay -max 4 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wb_adr_i[*]}]
+set_input_delay -max 4 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wb_stb_i}]
+set_input_delay -max 4 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wb_cyc_i}]
+set_input_delay -max 4 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wb_we_i}]
+set_input_delay -max 4 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wbd_mbist1_dat_o[*]}]
+set_input_delay -max 4 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wb_sel_i[*]}]
+
+set_input_delay -min 2 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wb_adr_i[*]}]
+set_input_delay -min 2 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wb_stb_i}]
+set_input_delay -min 2 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wb_cyc_i}]
+set_input_delay -min 2 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wb_we_i}]
+set_input_delay -min 2 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wbd_mbist1_dat_o[*]}]
+set_input_delay -min 2 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wb_sel_i[*]}]
+
+set_output_delay -max 5 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wb_dat_o[*]}]
+set_output_delay -max 5 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wb_ack_o}]
+set_output_delay -max 5 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wb_err_o}]
+
+set_output_delay -min 1 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wb_dat_o[*]}]
+set_output_delay -min 1 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wb_ack_o}]
+set_output_delay -min 1 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wb_err_o}]
+
+## Towards MEMORY from MBIST CLOCK
+## PORT-A
+set_input_delay -max 4.0000 -clock [get_clocks {bist_mem_clk_a}] -add_delay [get_ports {mem_dout_a[*]}]
+set_input_delay -min 1.0000 -clock [get_clocks {bist_mem_clk_a}] -add_delay [get_ports {mem_dout_a[*]}]
+
+
+set_output_delay -max 4 -clock [get_clocks {bist_mem_clk_a}] -add_delay [get_ports {mem_addr_a[*]}]
+set_output_delay -max 4 -clock [get_clocks {bist_mem_clk_a}] -add_delay [get_ports {mem_cen_a}]
+
+set_output_delay -min -0.5 -clock [get_clocks {bist_mem_clk_a}] -add_delay [get_ports {mem_addr_a[*]}]
+set_output_delay -min -0.5 -clock [get_clocks {bist_mem_clk_a}] -add_delay [get_ports {mem_cen_a}]
+
+
+
+## PORT-B
+set_output_delay -max 4 -clock [get_clocks {bist_mem_clk_b}] -add_delay [get_ports {mem_cen_b}]
+set_output_delay -max 4 -clock [get_clocks {bist_mem_clk_b}] -add_delay [get_ports {mem_din_b[*]}]
+set_output_delay -max 4 -clock [get_clocks {bist_mem_clk_b}] -add_delay [get_ports {mem_mask_b[*]}]
+set_output_delay -max 4 -clock [get_clocks {bist_mem_clk_b}] -add_delay [get_ports {mem_web_b}]
+set_output_delay -max 4 -clock [get_clocks {bist_mem_clk_b}] -add_delay [get_ports {mem_addr_b[*]}]
+
+set_output_delay -min -0.5 -clock [get_clocks {bist_mem_clk_b}] -add_delay [get_ports {mem_cen_b}]
+set_output_delay -min -0.5 -clock [get_clocks {bist_mem_clk_b}] -add_delay [get_ports {mem_din_b[*]}]
+set_output_delay -min -0.5 -clock [get_clocks {bist_mem_clk_b}] -add_delay [get_ports {mem_mask_b[*]}]
+set_output_delay -min -0.5 -clock [get_clocks {bist_mem_clk_b}] -add_delay [get_ports {mem_web_b}]
+set_output_delay -min -0.5 -clock [get_clocks {bist_mem_clk_b}] -add_delay [get_ports {mem_addr_b[*]}]
+
+
+# Set max delay for clock skew
+
+set_max_delay 3.5 -from [get_ports {wbd_clk_int}]
+set_max_delay 2 -to [get_ports {wbd_clk_mbist}]
+set_max_delay 3.5 -from wbd_clk_int -to wbd_clk_mbist
+
+###############################################################################
+# Environment
+###############################################################################
+set_load -pin_load 0.0334 [get_ports {bist_correct}]
+set_load -pin_load 0.0334 [get_ports {bist_done}]
+set_load -pin_load 0.0334 [get_ports {bist_error}]
+set_load -pin_load 0.0334 [get_ports {bist_sdo}]
+set_load -pin_load 0.0334 [get_ports {mem_cen_a}]
+set_load -pin_load 0.0334 [get_ports {mem_cen_b}]
+set_load -pin_load 0.0334 [get_ports {mem_clk_a}]
+set_load -pin_load 0.0334 [get_ports {mem_clk_b}]
+set_load -pin_load 0.0334 [get_ports {mem_web_b}]
+set_load -pin_load 0.0334 [get_ports {bist_error_cnt[3]}]
+set_load -pin_load 0.0334 [get_ports {bist_error_cnt[2]}]
+set_load -pin_load 0.0334 [get_ports {bist_error_cnt[1]}]
+set_load -pin_load 0.0334 [get_ports {bist_error_cnt[0]}]
+set_load -pin_load 0.0334 [get_ports {wb_cyc_i}]
+set_load -pin_load 0.0334 [get_ports {wb_stb_i}]
+set_load -pin_load 0.0334 [get_ports {wb_adr_i[*]}]
+set_load -pin_load 0.0334 [get_ports {wb_we_i}]
+set_load -pin_load 0.0334 [get_ports {wb_dat_i[*]}]
+set_load -pin_load 0.0334 [get_ports {wb_sel_i[*]}]
+set_load -pin_load 0.0334 [get_ports {mem_addr_a[*]}]
+set_load -pin_load 0.0334 [get_ports {mem_addr_b[*]}]
+set_load -pin_load 0.0334 [get_ports {mem_din_b[*]}]
+set_load -pin_load 0.0334 [get_ports {mem_mask_b[*]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wb_cyc_i}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {bist_en}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {bist_load}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {bist_run}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {bist_sdi}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {bist_shift}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wb_cyc_i}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wb_adr_i[*]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wb_we_i}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wb_dat_i[*]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wb_sel_i[*]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {rst_n}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {mem_dout_a[*]}]
+set_timing_derate -early 0.9500
+set_timing_derate -late 1.0500
+###############################################################################
+# Design Rules
+###############################################################################
+set_max_fanout 4.0000 [current_design]
diff --git a/openlane/mbist_top1/config.tcl b/openlane/mbist_top1/config.tcl
new file mode 100755
index 0000000..cce3320
--- /dev/null
+++ b/openlane/mbist_top1/config.tcl
@@ -0,0 +1,138 @@
+# SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# SPDX-License-Identifier: Apache-2.0
+# SPDX-FileContributor: Modified by Dinesh Annayya <dinesha@opencores.org>
+
+# Global
+# ------
+
+set script_dir [file dirname [file normalize [info script]]]
+# Name
+
+set ::env(DESIGN_NAME) mbist_top1
+
+set ::env(DESIGN_IS_CORE) "0"
+
+# Timing configuration
+set ::env(CLOCK_PERIOD) "10"
+set ::env(CLOCK_PORT) "u_cts_wb_clk_b1.u_buf/X u_cts_wb_clk_b2.u_buf/X u_mem_sel.u_cts_mem_clk_a.u_buf/X u_mem_sel.u_cts_mem_clk_b.u_buf/X"
+
+set ::env(SYNTH_MAX_FANOUT) 4
+set ::env(SYNTH_BUFFERING) {0}
+
+## CTS BUFFER
+set ::env(CTS_CLK_BUFFER_LIST) "sky130_fd_sc_hd__clkbuf_4 sky130_fd_sc_hd__clkbuf_8"
+set ::env(CTS_SINK_CLUSTERING_SIZE) "16"
+set ::env(CLOCK_BUFFER_FANOUT) "8"
+
+# Sources
+# -------
+
+# Local sources + no2usb sources
+set ::env(VERILOG_FILES) "\
+ $::env(DESIGN_DIR)/../../verilog/rtl/clk_skew_adjust/src/clk_skew_adjust.gv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/mbist/src/core/mbist_addr_gen.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/mbist/src/core/mbist_fsm.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/mbist/src/core/mbist_op_sel.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/mbist/src/core/mbist_repair_addr.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/mbist/src/core/mbist_sti_sel.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/mbist/src/core/mbist_pat_sel.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/mbist/src/core/mbist_mux.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/mbist/src/core/mbist_data_cmp.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/mbist/src/core/mbist_mem_wrapper.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/mbist/src/top/mbist_top1.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/lib/ctech_cells.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/lib/reset_sync.sv \
+ "
+
+set ::env(VERILOG_INCLUDE_DIRS) [glob $::env(DESIGN_DIR)/../../verilog/rtl/mbist/include ]
+
+
+set ::env(SYNTH_PARAMETERS) "SCW=8 \
+ BIST_ADDR_WD=9\
+ BIST_DATA_WD=32 \
+ BIST_ADDR_START=9'h000,\
+ BIST_ADDR_END=9'h1FB,\
+ BIST_REPAIR_ADDR_START=9'h1FC,\
+ BIST_RAD_WD_I=9,\
+ BIST_RAD_WD_O=9\
+ "
+
+set ::env(SYNTH_READ_BLACKBOX_LIB) 1
+set ::env(SYNTH_DEFINES) [list SYNTHESIS ]
+set ::env(SDC_FILE) "$::env(DESIGN_DIR)/base.sdc"
+set ::env(BASE_SDC_FILE) "$::env(DESIGN_DIR)/base.sdc"
+
+set ::env(LEC_ENABLE) 0
+
+set ::env(VDD_PIN) [list {vccd1}]
+set ::env(GND_PIN) [list {vssd1}]
+
+set ::env(SCAN_TOTAL_CHAINS) 8
+
+# Floorplanning
+# -------------
+
+set ::env(FP_PIN_ORDER_CFG) $::env(DESIGN_DIR)/pin_order.cfg
+
+set ::env(FP_SIZING) absolute
+set ::env(DIE_AREA) "0 0 250 350"
+
+
+# If you're going to use multiple power domains, then keep this disabled.
+set ::env(RUN_CVC) 0
+
+#set ::env(PDN_CFG) $script_dir/pdn.tcl
+
+
+set ::env(PL_TIME_DRIVEN) 1
+set ::env(PL_TARGET_DENSITY) "0.35"
+
+# helps in anteena fix
+set ::env(USE_ARC_ANTENNA_CHECK) "1"
+
+set ::env(FP_IO_VEXTEND) 4
+set ::env(FP_IO_HEXTEND) 4
+
+set ::env(FP_PDN_VPITCH) 100
+set ::env(FP_PDN_HPITCH) 100
+set ::env(FP_PDN_VWIDTH) 6.2
+set ::env(FP_PDN_HWIDTH) 6.2
+
+#set ::env(GLB_RT_MAXLAYER) 5
+set ::env(RT_MAX_LAYER) {met4}
+
+#Lef
+set ::env(MAGIC_GENERATE_LEF) {1}
+set ::env(MAGIC_WRITE_FULL_LEF) {0}
+
+set ::env(DIODE_INSERTION_STRATEGY) 4
+
+
+#LVS Issue - DEF Base looks to having issue
+set ::env(MAGIC_EXT_USE_GDS) {1}
+
+set ::env(GLB_RESIZER_MAX_SLEW_MARGIN) {1.5}
+set ::env(PL_RESIZER_MAX_SLEW_MARGIN) {1.5}
+
+set ::env(GLB_RESIZER_MAX_CAP_MARGIN) {0.25}
+set ::env(PL_RESIZER_MAX_CAP_MARGIN) {0.25}
+
+set ::env(GLB_RESIZER_MAX_WIRE_LENGTH) {500}
+set ::env(PL_RESIZER_MAX_WIRE_LENGTH) {500}
+
+set ::env(QUIT_ON_TIMING_VIOLATIONS) "0"
+set ::env(QUIT_ON_MAGIC_DRC) "1"
+set ::env(QUIT_ON_LVS_ERROR) "1"
+set ::env(QUIT_ON_SLEW_VIOLATIONS) "0"
diff --git a/openlane/mbist_top1/pin_order.cfg b/openlane/mbist_top1/pin_order.cfg
new file mode 100644
index 0000000..76d9147
--- /dev/null
+++ b/openlane/mbist_top1/pin_order.cfg
@@ -0,0 +1,235 @@
+#BUS_SORT
+
+#MANUAL_PLACE
+
+
+#S
+rst_n 0000 0
+cfg_mem_lphase
+
+scan_en 0100 0 2
+scan_mode
+scan_si\[7\]
+scan_si\[6\]
+scan_si\[5\]
+scan_si\[4\]
+scan_si\[3\]
+scan_si\[2\]
+scan_si\[1\]
+scan_si\[0\]
+
+#N
+scan_en_o 0100 0 2
+scan_mode_o
+scan_so\[7\]
+scan_so\[6\]
+scan_so\[5\]
+scan_so\[4\]
+scan_so\[3\]
+scan_so\[2\]
+scan_so\[1\]
+scan_so\[0\]
+
+
+#W
+cfg_cska_mbist\[3\] 0000 0 4
+cfg_cska_mbist\[2\]
+cfg_cska_mbist\[1\]
+cfg_cska_mbist\[0\]
+wb_clk_i
+wbd_clk_mbist
+wbd_clk_int 0025 0 2
+wb_cyc_i
+wb_stb_i
+wb_we_i
+wb_adr_i\[8\]
+wb_adr_i\[7\]
+wb_adr_i\[6\]
+wb_adr_i\[5\]
+wb_adr_i\[4\]
+wb_adr_i\[3\]
+wb_adr_i\[2\]
+wb_adr_i\[1\]
+wb_adr_i\[0\]
+wb_dat_i\[31\]
+wb_dat_i\[30\]
+wb_dat_i\[29\]
+wb_dat_i\[28\]
+wb_dat_i\[27\]
+wb_dat_i\[26\]
+wb_dat_i\[25\]
+wb_dat_i\[24\]
+wb_dat_i\[23\]
+wb_dat_i\[22\]
+wb_dat_i\[21\]
+wb_dat_i\[20\]
+wb_dat_i\[19\]
+wb_dat_i\[18\]
+wb_dat_i\[17\]
+wb_dat_i\[16\]
+wb_dat_i\[15\]
+wb_dat_i\[14\]
+wb_dat_i\[13\]
+wb_dat_i\[12\]
+wb_dat_i\[11\]
+wb_dat_i\[10\]
+wb_dat_i\[9\]
+wb_dat_i\[8\]
+wb_dat_i\[7\]
+wb_dat_i\[6\]
+wb_dat_i\[5\]
+wb_dat_i\[4\]
+wb_dat_i\[3\]
+wb_dat_i\[2\]
+wb_dat_i\[1\]
+wb_dat_i\[0\]
+wb_sel_i\[3\]
+wb_sel_i\[2\]
+wb_sel_i\[1\]
+wb_sel_i\[0\]
+wb_dat_o\[31\]
+wb_dat_o\[30\]
+wb_dat_o\[29\]
+wb_dat_o\[28\]
+wb_dat_o\[27\]
+wb_dat_o\[26\]
+wb_dat_o\[25\]
+wb_dat_o\[24\]
+wb_dat_o\[23\]
+wb_dat_o\[22\]
+wb_dat_o\[21\]
+wb_dat_o\[20\]
+wb_dat_o\[19\]
+wb_dat_o\[18\]
+wb_dat_o\[17\]
+wb_dat_o\[16\]
+wb_dat_o\[15\]
+wb_dat_o\[14\]
+wb_dat_o\[13\]
+wb_dat_o\[12\]
+wb_dat_o\[11\]
+wb_dat_o\[10\]
+wb_dat_o\[9\]
+wb_dat_o\[8\]
+wb_dat_o\[7\]
+wb_dat_o\[6\]
+wb_dat_o\[5\]
+wb_dat_o\[4\]
+wb_dat_o\[3\]
+wb_dat_o\[2\]
+wb_dat_o\[1\]
+wb_dat_o\[0\]
+wb_ack_o
+wb_err_o
+
+
+bist_en 0150 0 2
+bist_run
+bist_shift
+bist_load
+bist_sdi
+bist_done
+bist_sdo
+bist_error
+bist_correct
+bist_error_cnt\[0\]
+bist_error_cnt\[1\]
+bist_error_cnt\[2\]
+bist_error_cnt\[3\]
+
+#E
+mem_clk_b 0000 0 2
+mem_cen_b
+mem_web_b
+mem_mask_b\[0\]
+mem_mask_b\[1\]
+mem_mask_b\[2\]
+mem_mask_b\[3\]
+mem_addr_b\[0\]
+mem_addr_b\[1\]
+mem_addr_b\[2\]
+mem_addr_b\[3\]
+mem_addr_b\[4\]
+mem_addr_b\[5\]
+mem_addr_b\[6\]
+mem_addr_b\[7\]
+mem_addr_b\[8\]
+mem_din_b\[0\]
+mem_din_b\[1\]
+mem_din_b\[2\]
+mem_din_b\[3\]
+mem_din_b\[4\]
+mem_din_b\[5\]
+mem_din_b\[6\]
+mem_din_b\[7\]
+mem_din_b\[8\]
+mem_din_b\[9\]
+mem_din_b\[10\]
+mem_din_b\[11\]
+mem_din_b\[12\]
+mem_din_b\[13\]
+mem_din_b\[14\]
+mem_din_b\[15\]
+mem_din_b\[16\]
+mem_din_b\[17\]
+mem_din_b\[18\]
+mem_din_b\[19\]
+mem_din_b\[20\]
+mem_din_b\[21\]
+mem_din_b\[22\]
+mem_din_b\[23\]
+mem_din_b\[24\]
+mem_din_b\[25\]
+mem_din_b\[26\]
+mem_din_b\[27\]
+mem_din_b\[28\]
+mem_din_b\[29\]
+mem_din_b\[30\]
+mem_din_b\[31\]
+
+
+mem_dout_a\[0\] 0100 0 2
+mem_dout_a\[1\]
+mem_dout_a\[2\]
+mem_dout_a\[3\]
+mem_dout_a\[4\]
+mem_dout_a\[5\]
+mem_dout_a\[6\]
+mem_dout_a\[7\]
+mem_dout_a\[8\]
+mem_dout_a\[9\]
+mem_dout_a\[10\]
+mem_dout_a\[11\]
+mem_dout_a\[12\]
+mem_dout_a\[13\]
+mem_dout_a\[14\]
+mem_dout_a\[15\]
+mem_dout_a\[16\]
+mem_dout_a\[17\]
+mem_dout_a\[18\]
+mem_dout_a\[19\]
+mem_dout_a\[20\]
+mem_dout_a\[21\]
+mem_dout_a\[22\]
+mem_dout_a\[23\]
+mem_dout_a\[24\]
+mem_dout_a\[25\]
+mem_dout_a\[26\]
+mem_dout_a\[27\]
+mem_dout_a\[28\]
+mem_dout_a\[29\]
+mem_dout_a\[30\]
+mem_dout_a\[31\]
+
+
+mem_clk_a 0200 0 2
+mem_cen_a
+mem_addr_a\[8\]
+mem_addr_a\[7\]
+mem_addr_a\[6\]
+mem_addr_a\[5\]
+mem_addr_a\[4\]
+mem_addr_a\[3\]
+mem_addr_a\[2\]
+mem_addr_a\[1\]
+mem_addr_a\[0\]
diff --git a/openlane/mbist_top1/sta.tcl b/openlane/mbist_top1/sta.tcl
new file mode 100644
index 0000000..57a6c35
--- /dev/null
+++ b/openlane/mbist_top1/sta.tcl
@@ -0,0 +1,88 @@
+# SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# SPDX-License-Identifier: Apache-2.0
+# SPDX-FileContributor: Modified by Dinesh Annayya <dinesha@opencores.org>
+
+
+set ::env(LIB_FASTEST) "$::env(PDK_ROOT)/sky130A/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__ff_n40C_1v95.lib"
+set ::env(LIB_TYPICAL) "$::env(PDK_ROOT)/sky130A/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__tt_025C_1v80.lib"
+set ::env(LIB_SLOWEST) "$::env(PDK_ROOT)/sky130A/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__ss_100C_1v60.lib"
+set ::env(DESIGN_NAME) "mbist_top"
+set ::env(BASE_SDC_FILE) "base.sdc"
+set ::env(SYNTH_DRIVING_CELL) "sky130_fd_sc_hd__inv_8"
+set ::env(SYNTH_DRIVING_CELL_PIN) "Y"
+set ::env(SYNTH_CAP_LOAD) "17.65"
+set ::env(WIRE_RC_LAYER) "met1"
+
+#To disable empty filler cell black box get created
+#set link_make_black_boxes 0
+
+
+set_cmd_units -time ns -capacitance pF -current mA -voltage V -resistance kOhm -distance um
+define_corners wc bc tt
+read_liberty -corner bc $::env(LIB_FASTEST)
+read_liberty -corner wc $::env(LIB_SLOWEST)
+read_liberty -corner tt $::env(LIB_TYPICAL)
+
+
+read_verilog ../user_project_wrapper/netlist/mbist.v
+link_design $::env(DESIGN_NAME)
+
+
+read_spef ../../spef/mbist_top.spef
+
+
+read_sdc -echo $::env(BASE_SDC_FILE)
+
+# check for missing constraints
+check_setup -verbose > unconstraints.rpt
+
+set_operating_conditions -analysis_type single
+# Propgate the clock
+set_propagated_clock [all_clocks]
+
+report_tns
+report_wns
+#report_power
+echo "################ CORNER : WC (SLOW) TIMING Report ###################" > timing_ss_max.rpt
+report_checks -unique -path_delay max -slack_max -0.0 -group_count 100 -corner wc >> timing_ss_max.rpt
+report_checks -group_count 100 -path_delay max -path_group bist_clk -corner wc >> timing_ss_max.rpt
+report_checks -group_count 100 -path_delay max -path_group mem_clk_a -corner wc >> timing_ss_max.rpt
+report_checks -group_count 100 -path_delay max -path_group mem_clk_b -corner wc >> timing_ss_max.rpt
+report_checks -path_delay max -corner wc >> timing_ss_max.rpt
+
+echo "################ CORNER : BC (SLOW) TIMING Report ###################" > timing_ff_min.rpt
+report_checks -unique -path_delay min -slack_min -0.0 -group_count 100 -corner bc >> timing_ff_min.rpt
+report_checks -group_count 100 -path_delay min -path_group bist_clk -corner bc >> timing_ff_min.rpt
+report_checks -group_count 100 -path_delay min -path_group mem_clk_a -corner bc >> timing_ff_min.rpt
+report_checks -group_count 100 -path_delay min -path_group mem_clk_b -corner bc >> timing_ff_min.rpt
+report_checks -path_delay min -corner bc >> timing_ff_min.rpt
+
+echo "################ CORNER : TT (MAX) TIMING Report ###################" > timing_tt_max.rpt
+report_checks -unique -path_delay min -slack_min -0.0 -group_count 100 -corner tt >> timing_tt_max.rpt
+report_checks -group_count 100 -path_delay max -path_group bist_clk -corner tt >> timing_tt_max.rpt
+report_checks -group_count 100 -path_delay max -path_group mem_clk_a -corner tt >> timing_tt_max.rpt
+report_checks -group_count 100 -path_delay max -path_group mem_clk_b -corner tt >> timing_tt_max.rpt
+report_checks -path_delay min -corner tt >> timing_tt_min.rpt
+
+echo "################ CORNER : TT (MIN) TIMING Report ###################" > timing_tt_min.rpt
+report_checks -unique -path_delay min -slack_min -0.0 -group_count 100 -corner tt >> timing_tt_min.rpt
+report_checks -group_count 100 -path_delay min -path_group bist_clk -corner tt >> timing_tt_min.rpt
+report_checks -group_count 100 -path_delay min -path_group mem_clk_a -corner tt >> timing_tt_min.rpt
+report_checks -group_count 100 -path_delay min -path_group mem_clk_b -corner tt >> timing_tt_min.rpt
+report_checks -path_delay min -corner tt >> timing_tt_min.rpt
+
+report_checks -path_delay min
+
+#exit
diff --git a/openlane/mbist_top2/base.sdc b/openlane/mbist_top2/base.sdc
new file mode 100644
index 0000000..8ae25b1
--- /dev/null
+++ b/openlane/mbist_top2/base.sdc
@@ -0,0 +1,163 @@
+###############################################################################
+# Created by write_sdc
+# Sun Nov 14 09:33:23 2021
+###############################################################################
+current_design mbist_top
+###############################################################################
+# Timing Constraints
+###############################################################################
+create_clock -name wb_clk_i -period 10.0000 [get_ports {wb_clk_i}]
+create_generated_clock -name bist_mem_clk_a -add -source [get_ports {wb_clk_i}] -master_clock [get_clocks wb_clk_i] -divide_by 1 -comment {Mem Clock A} [get_ports mem_clk_a]
+create_generated_clock -name bist_mem_clk_b -add -source [get_ports {wb_clk_i}] -master_clock [get_clocks wb_clk_i] -divide_by 1 -comment {Mem Clock B} [get_ports mem_clk_b]
+
+set_clock_groups -name async_clock -asynchronous -comment "Async Clock group" -group [get_clocks {wb_clk_i bist_mem_clk_a bist_mem_clk_b}]
+
+set_clock_transition 0.1500 [get_clocks {wb_clk_i}]
+set_clock_uncertainty -setup 0.2500 wb_clk_i
+set_clock_uncertainty -setup 0.2500 mem_clk_a
+set_clock_uncertainty -setup 0.2500 mem_clk_b
+
+set_clock_uncertainty -hold 0.2500 wb_clk_i
+set_clock_uncertainty -hold 0.2500 mem_clk_a
+set_clock_uncertainty -hold 0.2500 mem_clk_b
+
+set ::env(SYNTH_TIMING_DERATE) 0.05
+puts "\[INFO\]: Setting timing derate to: [expr {$::env(SYNTH_TIMING_DERATE) * 10}] %"
+set_timing_derate -early [expr {1-$::env(SYNTH_TIMING_DERATE)}]
+set_timing_derate -late [expr {1+$::env(SYNTH_TIMING_DERATE)}]
+
+set_input_delay -max 5.0000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {rst_n}]
+set_input_delay -min 2.0000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {rst_n}]
+
+set_output_delay -max 4.5000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_correct}]
+set_output_delay -max 4.5000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_done}]
+set_output_delay -max 4.5000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_error}]
+set_output_delay -max 4.5000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_error_cnt[0]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_error_cnt[1]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_error_cnt[2]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_error_cnt[3]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_sdo}]
+
+set_output_delay -min 2.0000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_correct}]
+set_output_delay -min 2.0000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_done}]
+set_output_delay -min 2.0000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_error}]
+set_output_delay -min 2.0000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_error_cnt[0]}]
+set_output_delay -min 2.0000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_error_cnt[1]}]
+set_output_delay -min 2.0000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_error_cnt[2]}]
+set_output_delay -min 2.0000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_error_cnt[3]}]
+set_output_delay -min 2.0000 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_sdo}]
+
+set_false_path -from [get_ports {bist_en}]
+set_input_delay -max 4 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_load}]
+set_input_delay -max 4 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_run}]
+set_input_delay -max 4 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_sdi}]
+set_input_delay -max 4 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_shift}]
+
+set_input_delay -min 2 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_en}]
+set_input_delay -min 2 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_load}]
+set_input_delay -min 2 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_run}]
+set_input_delay -min 2 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_sdi}]
+set_input_delay -min 2 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {bist_shift}]
+
+## Functional Inputs
+set_input_delay -max 4 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wb_adr_i[*]}]
+set_input_delay -max 4 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wb_stb_i}]
+set_input_delay -max 4 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wb_cyc_i}]
+set_input_delay -max 4 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wb_we_i}]
+set_input_delay -max 4 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wbd_mbist1_dat_o[*]}]
+set_input_delay -max 4 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wb_sel_i[*]}]
+
+set_input_delay -min 2 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wb_adr_i[*]}]
+set_input_delay -min 2 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wb_stb_i}]
+set_input_delay -min 2 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wb_cyc_i}]
+set_input_delay -min 2 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wb_we_i}]
+set_input_delay -min 2 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wbd_mbist1_dat_o[*]}]
+set_input_delay -min 2 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wb_sel_i[*]}]
+
+set_output_delay -max 5 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wb_dat_o[*]}]
+set_output_delay -max 5 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wb_ack_o}]
+set_output_delay -max 5 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wb_err_o}]
+
+set_output_delay -min 1 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wb_dat_o[*]}]
+set_output_delay -min 1 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wb_ack_o}]
+set_output_delay -min 1 -clock [get_clocks {wb_clk_i}] -add_delay [get_ports {wb_err_o}]
+
+## Towards MEMORY from MBIST CLOCK
+## PORT-A
+set_input_delay -max 4.0000 -clock [get_clocks {bist_mem_clk_a}] -add_delay [get_ports {mem_dout_a[*]}]
+set_input_delay -min 1.0000 -clock [get_clocks {bist_mem_clk_a}] -add_delay [get_ports {mem_dout_a[*]}]
+
+
+set_output_delay -max 4 -clock [get_clocks {bist_mem_clk_a}] -add_delay [get_ports {mem_addr_a[*]}]
+set_output_delay -max 4 -clock [get_clocks {bist_mem_clk_a}] -add_delay [get_ports {mem_cen_a}]
+
+set_output_delay -min -0.5 -clock [get_clocks {bist_mem_clk_a}] -add_delay [get_ports {mem_addr_a[*]}]
+set_output_delay -min -0.5 -clock [get_clocks {bist_mem_clk_a}] -add_delay [get_ports {mem_cen_a}]
+
+
+
+## PORT-B
+set_output_delay -max 4 -clock [get_clocks {bist_mem_clk_b}] -add_delay [get_ports {mem_cen_b}]
+set_output_delay -max 4 -clock [get_clocks {bist_mem_clk_b}] -add_delay [get_ports {mem_din_b[*]}]
+set_output_delay -max 4 -clock [get_clocks {bist_mem_clk_b}] -add_delay [get_ports {mem_mask_b[*]}]
+set_output_delay -max 4 -clock [get_clocks {bist_mem_clk_b}] -add_delay [get_ports {mem_web_b}]
+set_output_delay -max 4 -clock [get_clocks {bist_mem_clk_b}] -add_delay [get_ports {mem_addr_b[*]}]
+
+set_output_delay -min -0.5 -clock [get_clocks {bist_mem_clk_b}] -add_delay [get_ports {mem_cen_b}]
+set_output_delay -min -0.5 -clock [get_clocks {bist_mem_clk_b}] -add_delay [get_ports {mem_din_b[*]}]
+set_output_delay -min -0.5 -clock [get_clocks {bist_mem_clk_b}] -add_delay [get_ports {mem_mask_b[*]}]
+set_output_delay -min -0.5 -clock [get_clocks {bist_mem_clk_b}] -add_delay [get_ports {mem_web_b}]
+set_output_delay -min -0.5 -clock [get_clocks {bist_mem_clk_b}] -add_delay [get_ports {mem_addr_b[*]}]
+
+
+# Set max delay for clock skew
+
+set_max_delay 3.5 -from [get_ports {wbd_clk_int}]
+set_max_delay 2 -to [get_ports {wbd_clk_mbist}]
+set_max_delay 3.5 -from wbd_clk_int -to wbd_clk_mbist
+
+###############################################################################
+# Environment
+###############################################################################
+set_load -pin_load 0.0334 [get_ports {bist_correct}]
+set_load -pin_load 0.0334 [get_ports {bist_done}]
+set_load -pin_load 0.0334 [get_ports {bist_error}]
+set_load -pin_load 0.0334 [get_ports {bist_sdo}]
+set_load -pin_load 0.0334 [get_ports {mem_cen_a}]
+set_load -pin_load 0.0334 [get_ports {mem_cen_b}]
+set_load -pin_load 0.0334 [get_ports {mem_clk_a}]
+set_load -pin_load 0.0334 [get_ports {mem_clk_b}]
+set_load -pin_load 0.0334 [get_ports {mem_web_b}]
+set_load -pin_load 0.0334 [get_ports {bist_error_cnt[3]}]
+set_load -pin_load 0.0334 [get_ports {bist_error_cnt[2]}]
+set_load -pin_load 0.0334 [get_ports {bist_error_cnt[1]}]
+set_load -pin_load 0.0334 [get_ports {bist_error_cnt[0]}]
+set_load -pin_load 0.0334 [get_ports {wb_cyc_i}]
+set_load -pin_load 0.0334 [get_ports {wb_stb_i}]
+set_load -pin_load 0.0334 [get_ports {wb_adr_i[*]}]
+set_load -pin_load 0.0334 [get_ports {wb_we_i}]
+set_load -pin_load 0.0334 [get_ports {wb_dat_i[*]}]
+set_load -pin_load 0.0334 [get_ports {wb_sel_i[*]}]
+set_load -pin_load 0.0334 [get_ports {mem_addr_a[*]}]
+set_load -pin_load 0.0334 [get_ports {mem_addr_b[*]}]
+set_load -pin_load 0.0334 [get_ports {mem_din_b[*]}]
+set_load -pin_load 0.0334 [get_ports {mem_mask_b[*]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wb_cyc_i}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {bist_en}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {bist_load}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {bist_run}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {bist_sdi}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {bist_shift}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wb_cyc_i}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wb_adr_i[*]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wb_we_i}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wb_dat_i[*]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wb_sel_i[*]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {rst_n}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {mem_dout_a[*]}]
+set_timing_derate -early 0.9500
+set_timing_derate -late 1.0500
+###############################################################################
+# Design Rules
+###############################################################################
+set_max_fanout 4.0000 [current_design]
diff --git a/openlane/mbist_top2/config.tcl b/openlane/mbist_top2/config.tcl
new file mode 100755
index 0000000..a11b5e2
--- /dev/null
+++ b/openlane/mbist_top2/config.tcl
@@ -0,0 +1,138 @@
+# SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# SPDX-License-Identifier: Apache-2.0
+# SPDX-FileContributor: Modified by Dinesh Annayya <dinesha@opencores.org>
+
+# Global
+# ------
+
+set script_dir [file dirname [file normalize [info script]]]
+# Name
+
+set ::env(DESIGN_NAME) mbist_top2
+
+set ::env(DESIGN_IS_CORE) "0"
+
+# Timing configuration
+set ::env(CLOCK_PERIOD) "10"
+set ::env(CLOCK_PORT) "u_cts_wb_clk_b1.u_buf/X u_cts_wb_clk_b2.u_buf/X u_mem_sel.u_cts_mem_clk_a.u_buf/X u_mem_sel.u_cts_mem_clk_b.u_buf/X"
+
+set ::env(SYNTH_MAX_FANOUT) 4
+set ::env(SYNTH_BUFFERING) {0}
+
+## CTS BUFFER
+set ::env(CTS_CLK_BUFFER_LIST) "sky130_fd_sc_hd__clkbuf_4 sky130_fd_sc_hd__clkbuf_8"
+set ::env(CTS_SINK_CLUSTERING_SIZE) "16"
+set ::env(CLOCK_BUFFER_FANOUT) "8"
+
+# Sources
+# -------
+
+# Local sources + no2usb sources
+set ::env(VERILOG_FILES) "\
+ $::env(DESIGN_DIR)/../../verilog/rtl/clk_skew_adjust/src/clk_skew_adjust.gv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/mbist/src/core/mbist_addr_gen.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/mbist/src/core/mbist_fsm.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/mbist/src/core/mbist_op_sel.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/mbist/src/core/mbist_repair_addr.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/mbist/src/core/mbist_sti_sel.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/mbist/src/core/mbist_pat_sel.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/mbist/src/core/mbist_mux.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/mbist/src/core/mbist_data_cmp.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/mbist/src/core/mbist_mem_wrapper.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/mbist/src/top/mbist_top2.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/lib/ctech_cells.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/lib/reset_sync.sv \
+ "
+
+set ::env(VERILOG_INCLUDE_DIRS) [glob $::env(DESIGN_DIR)/../../verilog/rtl/mbist/include ]
+
+
+set ::env(SYNTH_PARAMETERS) "SCW=8 \
+ BIST_ADDR_WD=8\
+ BIST_DATA_WD=32\
+ BIST_ADDR_START=8'h000\
+ BIST_ADDR_END=8'h0FB\
+ BIST_REPAIR_ADDR_START=8'h0FC\
+ BIST_RAD_WD_I=8\
+ BIST_RAD_WD_O=8\
+ "
+
+set ::env(SYNTH_READ_BLACKBOX_LIB) 1
+set ::env(SYNTH_DEFINES) [list SYNTHESIS ]
+set ::env(SDC_FILE) "$::env(DESIGN_DIR)/base.sdc"
+set ::env(BASE_SDC_FILE) "$::env(DESIGN_DIR)/base.sdc"
+
+set ::env(LEC_ENABLE) 0
+
+set ::env(VDD_PIN) [list {vccd1}]
+set ::env(GND_PIN) [list {vssd1}]
+
+set ::env(SCAN_TOTAL_CHAINS) 8
+
+# Floorplanning
+# -------------
+
+set ::env(FP_PIN_ORDER_CFG) $::env(DESIGN_DIR)/pin_order.cfg
+
+set ::env(FP_SIZING) absolute
+set ::env(DIE_AREA) "0 0 250 250"
+
+
+# If you're going to use multiple power domains, then keep this disabled.
+set ::env(RUN_CVC) 0
+
+#set ::env(PDN_CFG) $script_dir/pdn.tcl
+
+
+set ::env(PL_TIME_DRIVEN) 1
+set ::env(PL_TARGET_DENSITY) "0.35"
+
+# helps in anteena fix
+set ::env(USE_ARC_ANTENNA_CHECK) "1"
+
+set ::env(FP_IO_VEXTEND) 4
+set ::env(FP_IO_HEXTEND) 4
+
+set ::env(FP_PDN_VPITCH) 100
+set ::env(FP_PDN_HPITCH) 100
+set ::env(FP_PDN_VWIDTH) 6.2
+set ::env(FP_PDN_HWIDTH) 6.2
+
+#set ::env(GLB_RT_MAXLAYER) 5
+set ::env(RT_MAX_LAYER) {met4}
+
+#Lef
+set ::env(MAGIC_GENERATE_LEF) {1}
+set ::env(MAGIC_WRITE_FULL_LEF) {0}
+
+set ::env(DIODE_INSERTION_STRATEGY) 4
+
+
+#LVS Issue - DEF Base looks to having issue
+set ::env(MAGIC_EXT_USE_GDS) {1}
+
+set ::env(GLB_RESIZER_MAX_SLEW_MARGIN) {1.5}
+set ::env(PL_RESIZER_MAX_SLEW_MARGIN) {1.5}
+
+set ::env(GLB_RESIZER_MAX_CAP_MARGIN) {0.25}
+set ::env(PL_RESIZER_MAX_CAP_MARGIN) {0.25}
+
+set ::env(GLB_RESIZER_MAX_WIRE_LENGTH) {500}
+set ::env(PL_RESIZER_MAX_WIRE_LENGTH) {500}
+
+set ::env(QUIT_ON_TIMING_VIOLATIONS) "0"
+set ::env(QUIT_ON_MAGIC_DRC) "1"
+set ::env(QUIT_ON_LVS_ERROR) "1"
+set ::env(QUIT_ON_SLEW_VIOLATIONS) "0"
diff --git a/openlane/mbist_top2/pin_order.cfg b/openlane/mbist_top2/pin_order.cfg
new file mode 100644
index 0000000..b15dd5a
--- /dev/null
+++ b/openlane/mbist_top2/pin_order.cfg
@@ -0,0 +1,232 @@
+#BUS_SORT
+
+#MANUAL_PLACE
+
+
+#S
+scan_en_o 0100 0 2
+scan_mode_o
+scan_so\[7\]
+scan_so\[6\]
+scan_so\[5\]
+scan_so\[4\]
+scan_so\[3\]
+scan_so\[2\]
+scan_so\[1\]
+scan_so\[0\]
+
+
+#N
+rst_n 0000 0
+cfg_mem_lphase
+
+scan_en 0100 0 2
+scan_mode
+scan_si\[7\]
+scan_si\[6\]
+scan_si\[5\]
+scan_si\[4\]
+scan_si\[3\]
+scan_si\[2\]
+scan_si\[1\]
+scan_si\[0\]
+
+
+#E
+cfg_cska_mbist\[3\] 0000 0 4
+cfg_cska_mbist\[2\]
+cfg_cska_mbist\[1\]
+cfg_cska_mbist\[0\]
+wb_clk_i
+wbd_clk_mbist
+wbd_clk_int 0025 0 2
+wb_cyc_i
+wb_stb_i
+wb_we_i
+wb_adr_i\[7\]
+wb_adr_i\[6\]
+wb_adr_i\[5\]
+wb_adr_i\[4\]
+wb_adr_i\[3\]
+wb_adr_i\[2\]
+wb_adr_i\[1\]
+wb_adr_i\[0\]
+wb_dat_i\[31\]
+wb_dat_i\[30\]
+wb_dat_i\[29\]
+wb_dat_i\[28\]
+wb_dat_i\[27\]
+wb_dat_i\[26\]
+wb_dat_i\[25\]
+wb_dat_i\[24\]
+wb_dat_i\[23\]
+wb_dat_i\[22\]
+wb_dat_i\[21\]
+wb_dat_i\[20\]
+wb_dat_i\[19\]
+wb_dat_i\[18\]
+wb_dat_i\[17\]
+wb_dat_i\[16\]
+wb_dat_i\[15\]
+wb_dat_i\[14\]
+wb_dat_i\[13\]
+wb_dat_i\[12\]
+wb_dat_i\[11\]
+wb_dat_i\[10\]
+wb_dat_i\[9\]
+wb_dat_i\[8\]
+wb_dat_i\[7\]
+wb_dat_i\[6\]
+wb_dat_i\[5\]
+wb_dat_i\[4\]
+wb_dat_i\[3\]
+wb_dat_i\[2\]
+wb_dat_i\[1\]
+wb_dat_i\[0\]
+wb_sel_i\[3\]
+wb_sel_i\[2\]
+wb_sel_i\[1\]
+wb_sel_i\[0\]
+wb_dat_o\[31\]
+wb_dat_o\[30\]
+wb_dat_o\[29\]
+wb_dat_o\[28\]
+wb_dat_o\[27\]
+wb_dat_o\[26\]
+wb_dat_o\[25\]
+wb_dat_o\[24\]
+wb_dat_o\[23\]
+wb_dat_o\[22\]
+wb_dat_o\[21\]
+wb_dat_o\[20\]
+wb_dat_o\[19\]
+wb_dat_o\[18\]
+wb_dat_o\[17\]
+wb_dat_o\[16\]
+wb_dat_o\[15\]
+wb_dat_o\[14\]
+wb_dat_o\[13\]
+wb_dat_o\[12\]
+wb_dat_o\[11\]
+wb_dat_o\[10\]
+wb_dat_o\[9\]
+wb_dat_o\[8\]
+wb_dat_o\[7\]
+wb_dat_o\[6\]
+wb_dat_o\[5\]
+wb_dat_o\[4\]
+wb_dat_o\[3\]
+wb_dat_o\[2\]
+wb_dat_o\[1\]
+wb_dat_o\[0\]
+wb_ack_o
+wb_err_o
+
+bist_en 0150 0 2
+bist_run
+bist_shift
+bist_load
+bist_sdi
+bist_done
+bist_sdo
+bist_error
+bist_correct
+bist_error_cnt\[0\]
+bist_error_cnt\[1\]
+bist_error_cnt\[2\]
+bist_error_cnt\[3\]
+
+#W
+mem_clk_b 0000 0 2
+mem_cen_b
+mem_web_b
+mem_mask_b\[0\]
+mem_mask_b\[1\]
+mem_mask_b\[2\]
+mem_mask_b\[3\]
+mem_addr_b\[0\]
+mem_addr_b\[1\]
+mem_addr_b\[2\]
+mem_addr_b\[3\]
+mem_addr_b\[4\]
+mem_addr_b\[5\]
+mem_addr_b\[6\]
+mem_addr_b\[7\]
+mem_din_b\[0\]
+mem_din_b\[1\]
+mem_din_b\[2\]
+mem_din_b\[3\]
+mem_din_b\[4\]
+mem_din_b\[5\]
+mem_din_b\[6\]
+mem_din_b\[7\]
+mem_din_b\[8\]
+mem_din_b\[9\]
+mem_din_b\[10\]
+mem_din_b\[11\]
+mem_din_b\[12\]
+mem_din_b\[13\]
+mem_din_b\[14\]
+mem_din_b\[15\]
+mem_din_b\[16\]
+mem_din_b\[17\]
+mem_din_b\[18\]
+mem_din_b\[19\]
+mem_din_b\[20\]
+mem_din_b\[21\]
+mem_din_b\[22\]
+mem_din_b\[23\]
+mem_din_b\[24\]
+mem_din_b\[25\]
+mem_din_b\[26\]
+mem_din_b\[27\]
+mem_din_b\[28\]
+mem_din_b\[29\]
+mem_din_b\[30\]
+mem_din_b\[31\]
+
+
+mem_dout_a\[0\] 0100 0 2
+mem_dout_a\[1\]
+mem_dout_a\[2\]
+mem_dout_a\[3\]
+mem_dout_a\[4\]
+mem_dout_a\[5\]
+mem_dout_a\[6\]
+mem_dout_a\[7\]
+mem_dout_a\[8\]
+mem_dout_a\[9\]
+mem_dout_a\[10\]
+mem_dout_a\[11\]
+mem_dout_a\[12\]
+mem_dout_a\[13\]
+mem_dout_a\[14\]
+mem_dout_a\[15\]
+mem_dout_a\[16\]
+mem_dout_a\[17\]
+mem_dout_a\[18\]
+mem_dout_a\[19\]
+mem_dout_a\[20\]
+mem_dout_a\[21\]
+mem_dout_a\[22\]
+mem_dout_a\[23\]
+mem_dout_a\[24\]
+mem_dout_a\[25\]
+mem_dout_a\[26\]
+mem_dout_a\[27\]
+mem_dout_a\[28\]
+mem_dout_a\[29\]
+mem_dout_a\[30\]
+mem_dout_a\[31\]
+
+
+mem_clk_a 0200 0 2
+mem_cen_a
+mem_addr_a\[7\]
+mem_addr_a\[6\]
+mem_addr_a\[5\]
+mem_addr_a\[4\]
+mem_addr_a\[3\]
+mem_addr_a\[2\]
+mem_addr_a\[1\]
+mem_addr_a\[0\]
diff --git a/openlane/mbist_top2/sta.tcl b/openlane/mbist_top2/sta.tcl
new file mode 100644
index 0000000..57a6c35
--- /dev/null
+++ b/openlane/mbist_top2/sta.tcl
@@ -0,0 +1,88 @@
+# SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# SPDX-License-Identifier: Apache-2.0
+# SPDX-FileContributor: Modified by Dinesh Annayya <dinesha@opencores.org>
+
+
+set ::env(LIB_FASTEST) "$::env(PDK_ROOT)/sky130A/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__ff_n40C_1v95.lib"
+set ::env(LIB_TYPICAL) "$::env(PDK_ROOT)/sky130A/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__tt_025C_1v80.lib"
+set ::env(LIB_SLOWEST) "$::env(PDK_ROOT)/sky130A/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__ss_100C_1v60.lib"
+set ::env(DESIGN_NAME) "mbist_top"
+set ::env(BASE_SDC_FILE) "base.sdc"
+set ::env(SYNTH_DRIVING_CELL) "sky130_fd_sc_hd__inv_8"
+set ::env(SYNTH_DRIVING_CELL_PIN) "Y"
+set ::env(SYNTH_CAP_LOAD) "17.65"
+set ::env(WIRE_RC_LAYER) "met1"
+
+#To disable empty filler cell black box get created
+#set link_make_black_boxes 0
+
+
+set_cmd_units -time ns -capacitance pF -current mA -voltage V -resistance kOhm -distance um
+define_corners wc bc tt
+read_liberty -corner bc $::env(LIB_FASTEST)
+read_liberty -corner wc $::env(LIB_SLOWEST)
+read_liberty -corner tt $::env(LIB_TYPICAL)
+
+
+read_verilog ../user_project_wrapper/netlist/mbist.v
+link_design $::env(DESIGN_NAME)
+
+
+read_spef ../../spef/mbist_top.spef
+
+
+read_sdc -echo $::env(BASE_SDC_FILE)
+
+# check for missing constraints
+check_setup -verbose > unconstraints.rpt
+
+set_operating_conditions -analysis_type single
+# Propgate the clock
+set_propagated_clock [all_clocks]
+
+report_tns
+report_wns
+#report_power
+echo "################ CORNER : WC (SLOW) TIMING Report ###################" > timing_ss_max.rpt
+report_checks -unique -path_delay max -slack_max -0.0 -group_count 100 -corner wc >> timing_ss_max.rpt
+report_checks -group_count 100 -path_delay max -path_group bist_clk -corner wc >> timing_ss_max.rpt
+report_checks -group_count 100 -path_delay max -path_group mem_clk_a -corner wc >> timing_ss_max.rpt
+report_checks -group_count 100 -path_delay max -path_group mem_clk_b -corner wc >> timing_ss_max.rpt
+report_checks -path_delay max -corner wc >> timing_ss_max.rpt
+
+echo "################ CORNER : BC (SLOW) TIMING Report ###################" > timing_ff_min.rpt
+report_checks -unique -path_delay min -slack_min -0.0 -group_count 100 -corner bc >> timing_ff_min.rpt
+report_checks -group_count 100 -path_delay min -path_group bist_clk -corner bc >> timing_ff_min.rpt
+report_checks -group_count 100 -path_delay min -path_group mem_clk_a -corner bc >> timing_ff_min.rpt
+report_checks -group_count 100 -path_delay min -path_group mem_clk_b -corner bc >> timing_ff_min.rpt
+report_checks -path_delay min -corner bc >> timing_ff_min.rpt
+
+echo "################ CORNER : TT (MAX) TIMING Report ###################" > timing_tt_max.rpt
+report_checks -unique -path_delay min -slack_min -0.0 -group_count 100 -corner tt >> timing_tt_max.rpt
+report_checks -group_count 100 -path_delay max -path_group bist_clk -corner tt >> timing_tt_max.rpt
+report_checks -group_count 100 -path_delay max -path_group mem_clk_a -corner tt >> timing_tt_max.rpt
+report_checks -group_count 100 -path_delay max -path_group mem_clk_b -corner tt >> timing_tt_max.rpt
+report_checks -path_delay min -corner tt >> timing_tt_min.rpt
+
+echo "################ CORNER : TT (MIN) TIMING Report ###################" > timing_tt_min.rpt
+report_checks -unique -path_delay min -slack_min -0.0 -group_count 100 -corner tt >> timing_tt_min.rpt
+report_checks -group_count 100 -path_delay min -path_group bist_clk -corner tt >> timing_tt_min.rpt
+report_checks -group_count 100 -path_delay min -path_group mem_clk_a -corner tt >> timing_tt_min.rpt
+report_checks -group_count 100 -path_delay min -path_group mem_clk_b -corner tt >> timing_tt_min.rpt
+report_checks -path_delay min -corner tt >> timing_tt_min.rpt
+
+report_checks -path_delay min
+
+#exit
diff --git a/openlane/user_project_wrapper/base.sdc b/openlane/user_project_wrapper/base.sdc
new file mode 100644
index 0000000..689e7e8
--- /dev/null
+++ b/openlane/user_project_wrapper/base.sdc
@@ -0,0 +1,896 @@
+# SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# SPDX-License-Identifier: Apache-2.0
+# SPDX-FileContributor: Modified by Dinesh Annayya <dinesha@opencores.org>
+
+
+set_units -time ns
+set ::env(WBM_CLOCK_PERIOD) "10"
+set ::env(WBM_CLOCK_PORT) "wb_clk_i"
+set ::env(WBM_CLOCK_NAME) "wbm_clk_i"
+
+set ::env(WBS_CLOCK_PERIOD) "10"
+set ::env(WBS_CLOCK_PORT) "u_wb_host*mem_clk"
+set ::env(WBS_CLOCK_NAME) "mem_clk"
+
+set ::env(BIST_CLOCK_PERIOD) "20"
+set ::env(BIST_CLOCK_PORT) "u_wb_host*bist_clk"
+set ::env(BIST_CLOCK_NAME) "bist_clk"
+
+######################################
+# WB MASTER Clock domain input output
+######################################
+create_clock -name user_clock2 -period 100.0000 [get_ports {user_clock2}]
+create_clock -name wbm_clk_i -period 10.0000 [get_ports {wb_clk_i}]
+create_clock -name wbs_clk_i -period 10.0000 [get_pins {u_wb_host/wbs_clk_out}]
+
+set_clock_uncertainty -rise_from [get_clocks {user_clock2}] -rise_to [get_clocks {user_clock2}] -hold 0.1000
+set_clock_uncertainty -rise_from [get_clocks {user_clock2}] -rise_to [get_clocks {user_clock2}] -setup 0.2000
+set_clock_uncertainty -rise_from [get_clocks {user_clock2}] -fall_to [get_clocks {user_clock2}] -hold 0.1000
+set_clock_uncertainty -rise_from [get_clocks {user_clock2}] -fall_to [get_clocks {user_clock2}] -setup 0.2000
+set_clock_uncertainty -fall_from [get_clocks {user_clock2}] -rise_to [get_clocks {user_clock2}] -hold 0.1000
+set_clock_uncertainty -fall_from [get_clocks {user_clock2}] -rise_to [get_clocks {user_clock2}] -setup 0.2000
+set_clock_uncertainty -fall_from [get_clocks {user_clock2}] -fall_to [get_clocks {user_clock2}] -hold 0.1000
+set_clock_uncertainty -fall_from [get_clocks {user_clock2}] -fall_to [get_clocks {user_clock2}] -setup 0.2000
+
+set_clock_uncertainty -rise_from [get_clocks {wbm_clk_i}] -rise_to [get_clocks {wbm_clk_i}] -hold 0.1000
+set_clock_uncertainty -rise_from [get_clocks {wbm_clk_i}] -rise_to [get_clocks {wbm_clk_i}] -setup 0.2000
+set_clock_uncertainty -rise_from [get_clocks {wbm_clk_i}] -fall_to [get_clocks {wbm_clk_i}] -hold 0.1000
+set_clock_uncertainty -rise_from [get_clocks {wbm_clk_i}] -fall_to [get_clocks {wbm_clk_i}] -setup 0.2000
+set_clock_uncertainty -fall_from [get_clocks {wbm_clk_i}] -rise_to [get_clocks {wbm_clk_i}] -hold 0.1000
+set_clock_uncertainty -fall_from [get_clocks {wbm_clk_i}] -rise_to [get_clocks {wbm_clk_i}] -setup 0.2000
+set_clock_uncertainty -fall_from [get_clocks {wbm_clk_i}] -fall_to [get_clocks {wbm_clk_i}] -hold 0.1000
+set_clock_uncertainty -fall_from [get_clocks {wbm_clk_i}] -fall_to [get_clocks {wbm_clk_i}] -setup 0.2000
+
+set_clock_uncertainty -rise_from [get_clocks {wbs_clk_i}] -rise_to [get_clocks {wbs_clk_i}] -hold 0.1000
+set_clock_uncertainty -rise_from [get_clocks {wbs_clk_i}] -rise_to [get_clocks {wbs_clk_i}] -setup 0.2000
+set_clock_uncertainty -rise_from [get_clocks {wbs_clk_i}] -fall_to [get_clocks {wbs_clk_i}] -hold 0.1000
+set_clock_uncertainty -rise_from [get_clocks {wbs_clk_i}] -fall_to [get_clocks {wbs_clk_i}] -setup 0.2000
+set_clock_uncertainty -fall_from [get_clocks {wbs_clk_i}] -rise_to [get_clocks {wbs_clk_i}] -hold 0.1000
+set_clock_uncertainty -fall_from [get_clocks {wbs_clk_i}] -rise_to [get_clocks {wbs_clk_i}] -setup 0.2000
+set_clock_uncertainty -fall_from [get_clocks {wbs_clk_i}] -fall_to [get_clocks {wbs_clk_i}] -hold 0.1000
+set_clock_uncertainty -fall_from [get_clocks {wbs_clk_i}] -fall_to [get_clocks {wbs_clk_i}] -setup 0.2000
+
+set_clock_groups -name async_clock -asynchronous \
+ -group [get_clocks {user_clock2}]\
+ -group [get_clocks {wbm_clk_i}]\
+ -group [get_clocks {wbs_clk_i}] -comment {Async Clock group}
+
+set_input_delay 2.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wb_rst_i}]
+
+set_input_delay -max 5.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_adr_i[*]}]
+set_input_delay -max 5.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_cyc_i}]
+set_input_delay -max 5.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_i[*]}]
+set_input_delay -max 5.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_sel_i[*]}]
+set_input_delay -max 5.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_stb_i}]
+set_input_delay -max 5.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_we_i}]
+
+set_input_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_adr_i[*]}]
+set_input_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_cyc_i}]
+set_input_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_i[*]}]
+set_input_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_sel_i[*]}]
+set_input_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_stb_i}]
+set_input_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_we_i}]
+
+
+set_output_delay -max 4.5000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_ack_o}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[0]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[10]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[11]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[12]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[13]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[14]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[15]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[16]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[17]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[18]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[19]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[1]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[20]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[21]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[22]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[23]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[24]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[25]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[26]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[27]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[28]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[29]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[2]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[30]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[31]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[3]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[4]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[5]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[6]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[7]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[8]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[9]}]
+
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_ack_o}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[0]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[10]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[11]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[12]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[13]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[14]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[15]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[16]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[17]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[18]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[19]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[1]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[20]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[21]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[22]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[23]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[24]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[25]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[26]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[27]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[28]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[29]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[2]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[30]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[31]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[3]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[4]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[5]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[6]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[7]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[8]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbs_dat_o[9]}]
+###############################################################################
+# Environment
+###############################################################################
+set_load -pin_load 0.0334 [get_ports {wbs_ack_o}]
+set_load -pin_load 0.0334 [get_ports {analog_io[28]}]
+set_load -pin_load 0.0334 [get_ports {analog_io[27]}]
+set_load -pin_load 0.0334 [get_ports {analog_io[26]}]
+set_load -pin_load 0.0334 [get_ports {analog_io[25]}]
+set_load -pin_load 0.0334 [get_ports {analog_io[24]}]
+set_load -pin_load 0.0334 [get_ports {analog_io[23]}]
+set_load -pin_load 0.0334 [get_ports {analog_io[22]}]
+set_load -pin_load 0.0334 [get_ports {analog_io[21]}]
+set_load -pin_load 0.0334 [get_ports {analog_io[20]}]
+set_load -pin_load 0.0334 [get_ports {analog_io[19]}]
+set_load -pin_load 0.0334 [get_ports {analog_io[18]}]
+set_load -pin_load 0.0334 [get_ports {analog_io[17]}]
+set_load -pin_load 0.0334 [get_ports {analog_io[16]}]
+set_load -pin_load 0.0334 [get_ports {analog_io[15]}]
+set_load -pin_load 0.0334 [get_ports {analog_io[14]}]
+set_load -pin_load 0.0334 [get_ports {analog_io[13]}]
+set_load -pin_load 0.0334 [get_ports {analog_io[12]}]
+set_load -pin_load 0.0334 [get_ports {analog_io[11]}]
+set_load -pin_load 0.0334 [get_ports {analog_io[10]}]
+set_load -pin_load 0.0334 [get_ports {analog_io[9]}]
+set_load -pin_load 0.0334 [get_ports {analog_io[8]}]
+set_load -pin_load 0.0334 [get_ports {analog_io[7]}]
+set_load -pin_load 0.0334 [get_ports {analog_io[6]}]
+set_load -pin_load 0.0334 [get_ports {analog_io[5]}]
+set_load -pin_load 0.0334 [get_ports {analog_io[4]}]
+set_load -pin_load 0.0334 [get_ports {analog_io[3]}]
+set_load -pin_load 0.0334 [get_ports {analog_io[2]}]
+set_load -pin_load 0.0334 [get_ports {analog_io[1]}]
+set_load -pin_load 0.0334 [get_ports {analog_io[0]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[37]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[36]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[35]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[34]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[33]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[32]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[31]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[30]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[29]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[28]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[27]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[26]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[25]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[24]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[23]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[22]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[21]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[20]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[19]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[18]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[17]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[16]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[15]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[14]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[13]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[12]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[11]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[10]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[9]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[8]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[7]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[6]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[5]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[4]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[3]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[2]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[1]}]
+set_load -pin_load 0.0334 [get_ports {io_oeb[0]}]
+set_load -pin_load 0.0334 [get_ports {io_out[37]}]
+set_load -pin_load 0.0334 [get_ports {io_out[36]}]
+set_load -pin_load 0.0334 [get_ports {io_out[35]}]
+set_load -pin_load 0.0334 [get_ports {io_out[34]}]
+set_load -pin_load 0.0334 [get_ports {io_out[33]}]
+set_load -pin_load 0.0334 [get_ports {io_out[32]}]
+set_load -pin_load 0.0334 [get_ports {io_out[31]}]
+set_load -pin_load 0.0334 [get_ports {io_out[30]}]
+set_load -pin_load 0.0334 [get_ports {io_out[29]}]
+set_load -pin_load 0.0334 [get_ports {io_out[28]}]
+set_load -pin_load 0.0334 [get_ports {io_out[27]}]
+set_load -pin_load 0.0334 [get_ports {io_out[26]}]
+set_load -pin_load 0.0334 [get_ports {io_out[25]}]
+set_load -pin_load 0.0334 [get_ports {io_out[24]}]
+set_load -pin_load 0.0334 [get_ports {io_out[23]}]
+set_load -pin_load 0.0334 [get_ports {io_out[22]}]
+set_load -pin_load 0.0334 [get_ports {io_out[21]}]
+set_load -pin_load 0.0334 [get_ports {io_out[20]}]
+set_load -pin_load 0.0334 [get_ports {io_out[19]}]
+set_load -pin_load 0.0334 [get_ports {io_out[18]}]
+set_load -pin_load 0.0334 [get_ports {io_out[17]}]
+set_load -pin_load 0.0334 [get_ports {io_out[16]}]
+set_load -pin_load 0.0334 [get_ports {io_out[15]}]
+set_load -pin_load 0.0334 [get_ports {io_out[14]}]
+set_load -pin_load 0.0334 [get_ports {io_out[13]}]
+set_load -pin_load 0.0334 [get_ports {io_out[12]}]
+set_load -pin_load 0.0334 [get_ports {io_out[11]}]
+set_load -pin_load 0.0334 [get_ports {io_out[10]}]
+set_load -pin_load 0.0334 [get_ports {io_out[9]}]
+set_load -pin_load 0.0334 [get_ports {io_out[8]}]
+set_load -pin_load 0.0334 [get_ports {io_out[7]}]
+set_load -pin_load 0.0334 [get_ports {io_out[6]}]
+set_load -pin_load 0.0334 [get_ports {io_out[5]}]
+set_load -pin_load 0.0334 [get_ports {io_out[4]}]
+set_load -pin_load 0.0334 [get_ports {io_out[3]}]
+set_load -pin_load 0.0334 [get_ports {io_out[2]}]
+set_load -pin_load 0.0334 [get_ports {io_out[1]}]
+set_load -pin_load 0.0334 [get_ports {io_out[0]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[127]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[126]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[125]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[124]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[123]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[122]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[121]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[120]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[119]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[118]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[117]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[116]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[115]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[114]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[113]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[112]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[111]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[110]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[109]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[108]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[107]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[106]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[105]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[104]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[103]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[102]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[101]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[100]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[99]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[98]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[97]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[96]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[95]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[94]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[93]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[92]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[91]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[90]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[89]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[88]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[87]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[86]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[85]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[84]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[83]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[82]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[81]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[80]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[79]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[78]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[77]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[76]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[75]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[74]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[73]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[72]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[71]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[70]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[69]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[68]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[67]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[66]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[65]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[64]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[63]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[62]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[61]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[60]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[59]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[58]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[57]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[56]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[55]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[54]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[53]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[52]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[51]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[50]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[49]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[48]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[47]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[46]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[45]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[44]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[43]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[42]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[41]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[40]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[39]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[38]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[37]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[36]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[35]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[34]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[33]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[32]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[31]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[30]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[29]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[28]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[27]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[26]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[25]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[24]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[23]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[22]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[21]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[20]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[19]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[18]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[17]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[16]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[15]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[14]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[13]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[12]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[11]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[10]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[9]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[8]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[7]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[6]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[5]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[4]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[3]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[2]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[1]}]
+set_load -pin_load 0.0334 [get_ports {la_data_out[0]}]
+set_load -pin_load 0.0334 [get_ports {user_irq[2]}]
+set_load -pin_load 0.0334 [get_ports {user_irq[1]}]
+set_load -pin_load 0.0334 [get_ports {user_irq[0]}]
+set_load -pin_load 0.0334 [get_ports {wbs_dat_o[31]}]
+set_load -pin_load 0.0334 [get_ports {wbs_dat_o[30]}]
+set_load -pin_load 0.0334 [get_ports {wbs_dat_o[29]}]
+set_load -pin_load 0.0334 [get_ports {wbs_dat_o[28]}]
+set_load -pin_load 0.0334 [get_ports {wbs_dat_o[27]}]
+set_load -pin_load 0.0334 [get_ports {wbs_dat_o[26]}]
+set_load -pin_load 0.0334 [get_ports {wbs_dat_o[25]}]
+set_load -pin_load 0.0334 [get_ports {wbs_dat_o[24]}]
+set_load -pin_load 0.0334 [get_ports {wbs_dat_o[23]}]
+set_load -pin_load 0.0334 [get_ports {wbs_dat_o[22]}]
+set_load -pin_load 0.0334 [get_ports {wbs_dat_o[21]}]
+set_load -pin_load 0.0334 [get_ports {wbs_dat_o[20]}]
+set_load -pin_load 0.0334 [get_ports {wbs_dat_o[19]}]
+set_load -pin_load 0.0334 [get_ports {wbs_dat_o[18]}]
+set_load -pin_load 0.0334 [get_ports {wbs_dat_o[17]}]
+set_load -pin_load 0.0334 [get_ports {wbs_dat_o[16]}]
+set_load -pin_load 0.0334 [get_ports {wbs_dat_o[15]}]
+set_load -pin_load 0.0334 [get_ports {wbs_dat_o[14]}]
+set_load -pin_load 0.0334 [get_ports {wbs_dat_o[13]}]
+set_load -pin_load 0.0334 [get_ports {wbs_dat_o[12]}]
+set_load -pin_load 0.0334 [get_ports {wbs_dat_o[11]}]
+set_load -pin_load 0.0334 [get_ports {wbs_dat_o[10]}]
+set_load -pin_load 0.0334 [get_ports {wbs_dat_o[9]}]
+set_load -pin_load 0.0334 [get_ports {wbs_dat_o[8]}]
+set_load -pin_load 0.0334 [get_ports {wbs_dat_o[7]}]
+set_load -pin_load 0.0334 [get_ports {wbs_dat_o[6]}]
+set_load -pin_load 0.0334 [get_ports {wbs_dat_o[5]}]
+set_load -pin_load 0.0334 [get_ports {wbs_dat_o[4]}]
+set_load -pin_load 0.0334 [get_ports {wbs_dat_o[3]}]
+set_load -pin_load 0.0334 [get_ports {wbs_dat_o[2]}]
+set_load -pin_load 0.0334 [get_ports {wbs_dat_o[1]}]
+set_load -pin_load 0.0334 [get_ports {wbs_dat_o[0]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {user_clock2}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wb_clk_i}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wb_rst_i}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_cyc_i}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_stb_i}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_we_i}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {analog_io[28]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {analog_io[27]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {analog_io[26]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {analog_io[25]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {analog_io[24]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {analog_io[23]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {analog_io[22]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {analog_io[21]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {analog_io[20]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {analog_io[19]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {analog_io[18]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {analog_io[17]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {analog_io[16]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {analog_io[15]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {analog_io[14]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {analog_io[13]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {analog_io[12]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {analog_io[11]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {analog_io[10]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {analog_io[9]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {analog_io[8]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {analog_io[7]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {analog_io[6]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {analog_io[5]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {analog_io[4]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {analog_io[3]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {analog_io[2]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {analog_io[1]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {analog_io[0]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[37]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[36]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[35]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[34]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[33]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[32]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[31]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[30]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[29]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[28]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[27]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[26]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[25]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[24]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[23]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[22]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[21]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[20]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[19]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[18]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[17]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[16]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[15]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[14]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[13]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[12]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[11]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[10]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[9]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[8]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[7]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[6]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[5]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[4]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[3]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[2]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[1]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {io_in[0]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[127]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[126]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[125]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[124]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[123]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[122]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[121]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[120]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[119]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[118]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[117]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[116]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[115]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[114]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[113]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[112]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[111]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[110]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[109]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[108]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[107]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[106]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[105]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[104]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[103]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[102]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[101]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[100]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[99]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[98]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[97]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[96]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[95]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[94]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[93]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[92]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[91]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[90]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[89]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[88]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[87]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[86]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[85]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[84]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[83]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[82]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[81]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[80]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[79]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[78]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[77]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[76]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[75]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[74]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[73]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[72]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[71]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[70]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[69]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[68]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[67]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[66]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[65]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[64]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[63]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[62]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[61]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[60]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[59]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[58]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[57]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[56]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[55]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[54]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[53]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[52]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[51]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[50]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[49]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[48]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[47]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[46]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[45]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[44]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[43]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[42]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[41]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[40]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[39]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[38]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[37]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[36]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[35]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[34]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[33]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[32]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[31]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[30]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[29]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[28]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[27]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[26]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[25]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[24]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[23]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[22]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[21]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[20]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[19]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[18]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[17]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[16]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[15]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[14]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[13]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[12]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[11]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[10]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[9]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[8]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[7]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[6]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[5]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[4]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[3]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[2]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[1]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_data_in[0]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[127]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[126]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[125]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[124]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[123]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[122]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[121]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[120]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[119]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[118]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[117]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[116]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[115]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[114]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[113]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[112]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[111]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[110]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[109]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[108]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[107]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[106]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[105]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[104]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[103]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[102]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[101]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[100]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[99]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[98]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[97]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[96]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[95]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[94]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[93]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[92]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[91]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[90]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[89]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[88]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[87]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[86]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[85]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[84]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[83]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[82]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[81]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[80]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[79]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[78]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[77]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[76]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[75]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[74]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[73]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[72]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[71]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[70]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[69]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[68]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[67]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[66]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[65]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[64]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[63]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[62]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[61]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[60]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[59]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[58]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[57]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[56]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[55]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[54]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[53]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[52]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[51]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[50]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[49]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[48]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[47]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[46]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[45]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[44]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[43]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[42]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[41]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[40]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[39]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[38]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[37]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[36]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[35]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[34]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[33]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[32]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[31]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[30]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[29]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[28]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[27]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[26]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[25]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[24]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[23]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[22]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[21]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[20]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[19]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[18]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[17]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[16]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[15]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[14]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[13]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[12]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[11]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[10]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[9]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[8]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[7]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[6]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[5]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[4]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[3]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[2]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[1]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {la_oenb[0]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_adr_i[31]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_adr_i[30]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_adr_i[29]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_adr_i[28]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_adr_i[27]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_adr_i[26]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_adr_i[25]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_adr_i[24]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_adr_i[23]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_adr_i[22]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_adr_i[21]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_adr_i[20]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_adr_i[19]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_adr_i[18]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_adr_i[17]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_adr_i[16]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_adr_i[15]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_adr_i[14]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_adr_i[13]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_adr_i[12]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_adr_i[11]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_adr_i[10]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_adr_i[9]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_adr_i[8]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_adr_i[7]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_adr_i[6]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_adr_i[5]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_adr_i[4]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_adr_i[3]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_adr_i[2]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_adr_i[1]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_adr_i[0]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_dat_i[31]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_dat_i[30]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_dat_i[29]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_dat_i[28]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_dat_i[27]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_dat_i[26]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_dat_i[25]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_dat_i[24]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_dat_i[23]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_dat_i[22]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_dat_i[21]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_dat_i[20]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_dat_i[19]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_dat_i[18]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_dat_i[17]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_dat_i[16]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_dat_i[15]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_dat_i[14]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_dat_i[13]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_dat_i[12]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_dat_i[11]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_dat_i[10]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_dat_i[9]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_dat_i[8]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_dat_i[7]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_dat_i[6]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_dat_i[5]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_dat_i[4]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_dat_i[3]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_dat_i[2]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_dat_i[1]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_dat_i[0]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_sel_i[3]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_sel_i[2]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_sel_i[1]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbs_sel_i[0]}]
+
+## Case analysis
+set_case_analysis 0 [get_pins {u_intercon/cfg_cska_wi[0]}]
+set_case_analysis 0 [get_pins {u_intercon/cfg_cska_wi[1]}]
+set_case_analysis 0 [get_pins {u_intercon/cfg_cska_wi[2]}]
+set_case_analysis 1 [get_pins {u_intercon/cfg_cska_wi[3]}]
+
+set_case_analysis 1 [get_pins {u_glbl/cfg_cska_glbl[0]}]
+set_case_analysis 1 [get_pins {u_glbl/cfg_cska_glbl[1]}]
+set_case_analysis 1 [get_pins {u_glbl/cfg_cska_glbl[2]}]
+set_case_analysis 0 [get_pins {u_glbl/cfg_cska_glbl[3]}]
+
+set_case_analysis 1 [get_pins {u_mbist1/cfg_cska_mbist[0]}]
+set_case_analysis 1 [get_pins {u_mbist1/cfg_cska_mbist[1]}]
+set_case_analysis 1 [get_pins {u_mbist1/cfg_cska_mbist[2]}]
+set_case_analysis 0 [get_pins {u_mbist1/cfg_cska_mbist[3]}]
+
+set_case_analysis 1 [get_pins {u_mbist2/cfg_cska_mbist[0]}]
+set_case_analysis 1 [get_pins {u_mbist2/cfg_cska_mbist[1]}]
+set_case_analysis 1 [get_pins {u_mbist2/cfg_cska_mbist[2]}]
+set_case_analysis 0 [get_pins {u_mbist2/cfg_cska_mbist[3]}]
+
+set_case_analysis 1 [get_pins {u_mbist3/cfg_cska_mbist[0]}]
+set_case_analysis 1 [get_pins {u_mbist3/cfg_cska_mbist[1]}]
+set_case_analysis 1 [get_pins {u_mbist3/cfg_cska_mbist[2]}]
+set_case_analysis 0 [get_pins {u_mbist3/cfg_cska_mbist[3]}]
+
+set_case_analysis 1 [get_pins {u_mbist4/cfg_cska_mbist[0]}]
+set_case_analysis 1 [get_pins {u_mbist4/cfg_cska_mbist[1]}]
+set_case_analysis 1 [get_pins {u_mbist4/cfg_cska_mbist[2]}]
+set_case_analysis 0 [get_pins {u_mbist4/cfg_cska_mbist[3]}]
+
+set_case_analysis 1 [get_pins {u_mbist5/cfg_cska_mbist[0]}]
+set_case_analysis 1 [get_pins {u_mbist5/cfg_cska_mbist[1]}]
+set_case_analysis 1 [get_pins {u_mbist5/cfg_cska_mbist[2]}]
+set_case_analysis 0 [get_pins {u_mbist5/cfg_cska_mbist[3]}]
+
+set_case_analysis 1 [get_pins {u_mbist6/cfg_cska_mbist[0]}]
+set_case_analysis 1 [get_pins {u_mbist6/cfg_cska_mbist[1]}]
+set_case_analysis 1 [get_pins {u_mbist6/cfg_cska_mbist[2]}]
+set_case_analysis 0 [get_pins {u_mbist6/cfg_cska_mbist[3]}]
+
+set_case_analysis 1 [get_pins {u_mbist7/cfg_cska_mbist[0]}]
+set_case_analysis 1 [get_pins {u_mbist7/cfg_cska_mbist[1]}]
+set_case_analysis 1 [get_pins {u_mbist7/cfg_cska_mbist[2]}]
+set_case_analysis 0 [get_pins {u_mbist7/cfg_cska_mbist[3]}]
+
+set_case_analysis 1 [get_pins {u_mbist8/cfg_cska_mbist[0]}]
+set_case_analysis 1 [get_pins {u_mbist8/cfg_cska_mbist[1]}]
+set_case_analysis 1 [get_pins {u_mbist8/cfg_cska_mbist[2]}]
+set_case_analysis 0 [get_pins {u_mbist8/cfg_cska_mbist[3]}]
+
+set_case_analysis 0 [get_pins {u_wb_host/cfg_cska_wh[0]}]
+set_case_analysis 1 [get_pins {u_wb_host/cfg_cska_wh[1]}]
+set_case_analysis 1 [get_pins {u_wb_host/cfg_cska_wh[2]}]
+set_case_analysis 0 [get_pins {u_wb_host/cfg_cska_wh[3]}]
+
+#disable clock gating check at static clock select pins
+set_false_path -through [get_pins u_wb_host/u_wbs_clk_sel.u_mux/S]
+
+#Strobe is registered inside the wb_host before generating chip select
+# So wbm_adr_i wbm_we_i wbm_sel_i wbm_dat_i are having 2 cycle setup
+
+set_multicycle_path -setup -from [get_ports {wbs_adr_i[*]}] 2
+set_multicycle_path -setup -from [get_ports {wbs_cyc_i}] 2
+set_multicycle_path -setup -from [get_ports {wbs_dat_i[*]}] 2
+set_multicycle_path -setup -from [get_ports {wbs_sel_i[*]}] 2
+set_multicycle_path -setup -from [get_ports {wbs_we_i}] 2
+
+set_multicycle_path -hold -from [get_ports {wbs_adr_i[*]}] 2
+set_multicycle_path -hold -from [get_ports {wbs_cyc_i}] 2
+set_multicycle_path -hold -from [get_ports {wbs_dat_i[*]}] 2
+set_multicycle_path -hold -from [get_ports {wbs_sel_i[*]}] 2
+set_multicycle_path -hold -from [get_ports {wbs_we_i}] 2
diff --git a/openlane/user_project_wrapper/config.tcl b/openlane/user_project_wrapper/config.tcl
new file mode 100755
index 0000000..3632430
--- /dev/null
+++ b/openlane/user_project_wrapper/config.tcl
@@ -0,0 +1,198 @@
+# SPDX-FileCopyrightText: 2020 Efabless Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# SPDX-License-Identifier: Apache-2.0
+
+# Base Configurations. Don't Touch
+# section begin
+
+set ::env(STD_CELL_LIBRARY) "sky130_fd_sc_hd"
+
+# YOU ARE NOT ALLOWED TO CHANGE ANY VARIABLES DEFINED IN THE FIXED WRAPPER CFGS
+source $::env(DESIGN_DIR)/fixed_dont_change/fixed_wrapper_cfgs.tcl
+
+
+# YOU CAN CHANGE ANY VARIABLES DEFINED IN THE DEFAULT WRAPPER CFGS BY OVERRIDING THEM IN THIS CONFIG.TCL
+source $::env(DESIGN_DIR)/fixed_dont_change/default_wrapper_cfgs.tcl
+
+
+set script_dir [file dirname [file normalize [info script]]]
+set proj_dir [file dirname [file normalize [info script]]]
+
+set ::env(DESIGN_NAME) user_project_wrapper
+set verilog_root $::env(DESIGN_DIR)/../../verilog/
+set lef_root $::env(DESIGN_DIR)/../../lef/
+set gds_root $::env(DESIGN_DIR)/../../gds/
+#section end
+
+# User Configurations
+#
+set ::env(DESIGN_IS_CORE) 1
+
+
+## Source Verilog Files
+set ::env(VERILOG_FILES) "\
+ $::env(DESIGN_DIR)/../../verilog/rtl/user_project_wrapper.v"
+
+
+## Clock configurations
+set ::env(CLOCK_PORT) "user_clock2 wb_clk_i"
+#set ::env(CLOCK_NET) "mprj.clk"
+
+set ::env(CLOCK_PERIOD) "10"
+
+## Internal Macros
+### Macro Placement
+set ::env(MACRO_PLACEMENT_CFG) $::env(DESIGN_DIR)/macro.cfg
+
+set ::env(PDN_CFG) $::env(DESIGN_DIR)/pdn_cfg.tcl
+
+set ::env(SDC_FILE) $::env(DESIGN_DIR)/base.sdc
+set ::env(BASE_SDC_FILE) $::env(DESIGN_DIR)/base.sdc
+
+set ::env(SYNTH_READ_BLACKBOX_LIB) 1
+
+### Black-box verilog and views
+set ::env(VERILOG_FILES_BLACKBOX) "\
+ $::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_sram_macros/verilog/sky130_sram_2kbyte_1rw1r_32x512_8.v \
+ $::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_sram_macros/verilog/sky130_sram_1kbyte_1rw1r_32x256_8.v \
+ $::env(DESIGN_DIR)/../../verilog/gl/wb_interconnect.v \
+ $::env(DESIGN_DIR)/../../verilog/gl/wb_host.v \
+ $::env(DESIGN_DIR)/../../verilog/gl/glbl_cfg.v\
+ $::env(DESIGN_DIR)/../../verilog/gl/mbist_top1.v\
+ $::env(DESIGN_DIR)/../../verilog/gl/mbist_top2.v\
+ "
+
+set ::env(EXTRA_LEFS) "\
+ $::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_sram_macros/lef/sky130_sram_2kbyte_1rw1r_32x512_8.lef \
+ $::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_sram_macros/lef/sky130_sram_1kbyte_1rw1r_32x256_8.lef \
+ $::env(DESIGN_DIR)/../../lef/glbl_cfg.lef \
+ $::env(DESIGN_DIR)/../../lef/mbist_top1.lef \
+ $::env(DESIGN_DIR)/../../lef/mbist_top2.lef \
+ $::env(DESIGN_DIR)/../../lef/wb_interconnect.lef \
+ $::env(DESIGN_DIR)/../../lef/wb_host.lef"
+
+set ::env(EXTRA_GDS_FILES) "\
+ $::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_sram_macros/gds/sky130_sram_2kbyte_1rw1r_32x512_8.gds \
+ $::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_sram_macros/gds/sky130_sram_1kbyte_1rw1r_32x256_8.gds \
+ $::env(DESIGN_DIR)/../../gds/glbl_cfg.gds \
+ $::env(DESIGN_DIR)/../../gds/mbist_top1.gds \
+ $::env(DESIGN_DIR)/../../gds/mbist_top2.gds \
+ $::env(DESIGN_DIR)/../../gds/wb_interconnect.gds \
+ $::env(DESIGN_DIR)/../../gds/wb_host.gds"
+
+set ::env(SYNTH_DEFINES) [list SYNTHESIS ]
+
+#set ::env(VERILOG_INCLUDE_DIRS) [glob $::env(DESIGN_DIR)/../../verilog/rtl/yifive/ycr1c/src/includes ]
+
+#set ::env(GLB_RT_MAXLAYER) 6
+set ::env(RT_MAX_LAYER) {met5}
+
+## Internal Macros
+### Macro PDN Connections
+set ::env(FP_PDN_CHECK_NODES) 1
+set ::env(FP_PDN_IRDROP) "1"
+set ::env(RUN_IRDROP_REPORT) "1"
+####################
+
+set ::env(FP_PDN_ENABLE_MACROS_GRID) {1}
+set ::env(FP_PDN_ENABLE_GLOBAL_CONNECTIONS) "0"
+set ::env(FP_PDN_CHECK_NODES) 1
+set ::env(FP_PDN_ENABLE_RAILS) 0
+set ::env(FP_PDN_IRDROP) "1"
+
+set ::env(VDD_NETS) {vccd1 vccd2 vdda1 vdda2}
+set ::env(GND_NETS) {vssd1 vssd2 vssa1 vssa2}
+#
+set ::env(VDD_NET) {vccd1}
+set ::env(GND_NET) {vssd1}
+set ::env(VDD_PIN) {vccd1}
+set ::env(GND_PIN) {vssd1}
+
+set ::env(PDN_STRIPE) {vccd1 vssd1 }
+set ::env(DRT_OPT_ITERS) {32}
+
+# Add Blockage arond the SRAM to avoid Magic DRC &
+# add signal routing blockage for met5
+set ::env(GLB_RT_OBS) "met1 2000.00 800.00 2683.10 1216.54, \
+ met2 2000.00 800.00 2683.10 1216.54, \
+ met3 2000.00 800.00 2683.10 1216.54, \
+ met1 2000.00 1400.00 2683.10 1816.54, \
+ met2 2000.00 1400.00 2683.10 1816.54, \
+ met3 2000.00 1400.00 2683.10 1816.54, \
+ met1 2000.00 2000.00 2683.10 2416.54, \
+ met2 2000.00 2000.00 2683.10 2416.54, \
+ met3 2000.00 2000.00 2683.10 2416.54, \
+ met1 2000.00 2600.00 2683.10 3016.54, \
+ met2 2000.00 2600.00 2683.10 3016.54, \
+ met3 2000.00 2600.00 2683.10 3016.54, \
+ met1 200.00 1200.00 679.78 1597.5, \
+ met2 200.00 1200.00 679.78 1597.5, \
+ met3 200.00 1200.00 679.78 1597.5, \
+ met1 200.00 1800.00 679.78 2197.5, \
+ met2 200.00 1800.00 679.78 2197.5, \
+ met3 200.00 1800.00 679.78 2197.5, \
+ met1 200.00 2400.00 679.78 2797.5, \
+ met2 200.00 2400.00 679.78 2797.5, \
+ met3 200.00 2400.00 679.78 2797.5, \
+ met1 200.00 3000.00 679.78 3397.5, \
+ met2 200.00 3000.00 679.78 3397.5, \
+ met3 200.00 3000.00 679.78 3397.5, \
+ met5 0 0 2920 3520"
+
+
+set ::env(FP_PDN_MACRO_HOOKS) "\
+ u_wb_host vccd1 vssd1 vccd1 vssd1,\
+ u_intercon vccd1 vssd1 vccd1 vssd1,\
+ u_glbl vccd1 vssd1 vccd1 vssd1,\
+ u_mbist1 vccd1 vssd1 vccd1 vssd1,\
+ u_mbist2 vccd1 vssd1 vccd1 vssd1,\
+ u_mbist3 vccd1 vssd1 vccd1 vssd1,\
+ u_mbist4 vccd1 vssd1 vccd1 vssd1,\
+ u_mbist5 vccd1 vssd1 vccd1 vssd1,\
+ u_mbist6 vccd1 vssd1 vccd1 vssd1,\
+ u_mbist7 vccd1 vssd1 vccd1 vssd1,\
+ u_mbist8 vccd1 vssd1 vccd1 vssd1,\
+ u_sram1_2kb vccd1 vssd1 vccd1 vssd1,\
+ u_sram2_2kb vccd1 vssd1 vccd1 vssd1,\
+ u_sram3_2kb vccd1 vssd1 vccd1 vssd1,\
+ u_sram4_2kb vccd1 vssd1 vccd1 vssd1,\
+ u_sram5_1kb vccd1 vssd1 vccd1 vssd1,\
+ u_sram6_1kb vccd1 vssd1 vccd1 vssd1,\
+ u_sram7_1kb vccd1 vssd1 vccd1 vssd1,\
+ u_sram8_1kb vccd1 vssd1 vccd1 vssd1\
+ "
+
+
+# The following is because there are no std cells in the example wrapper project.
+set ::env(SYNTH_TOP_LEVEL) 0
+set ::env(PL_RANDOM_GLB_PLACEMENT) 1
+set ::env(PL_RESIZER_DESIGN_OPTIMIZATIONS) 0
+set ::env(PL_RESIZER_TIMING_OPTIMIZATIONS) 0
+set ::env(PL_RESIZER_BUFFER_INPUT_PORTS) 0
+set ::env(PL_RESIZER_BUFFER_OUTPUT_PORTS) 0
+set ::env(GLB_RESIZER_TIMING_OPTIMIZATIONS) {0}
+set ::env(GLB_OPTIMIZE_MIRRORING) {0}
+set ::env(DIODE_INSERTION_STRATEGY) 0
+set ::env(RUN_FILL_INSERTION) 0
+set ::env(RUN_TAP_DECAP_INSERTION) 0
+set ::env(CLOCK_TREE_SYNTH) 0
+set ::env(QUIT_ON_LVS_ERROR) "1"
+set ::env(QUIT_ON_MAGIC_DRC) "0"
+set ::env(QUIT_ON_NEGATIVE_WNS) "0"
+set ::env(QUIT_ON_SLEW_VIOLATIONS) "0"
+set ::env(QUIT_ON_TIMING_VIOLATIONS) "0"
+
+## Temp Masked due to long Run Time
+set ::env(RUN_KLAYOUT_XOR) {0}
+
diff --git a/openlane/user_project_wrapper/fixed_dont_change/default_wrapper_cfgs.tcl b/openlane/user_project_wrapper/fixed_dont_change/default_wrapper_cfgs.tcl
new file mode 100644
index 0000000..4a4f8a2
--- /dev/null
+++ b/openlane/user_project_wrapper/fixed_dont_change/default_wrapper_cfgs.tcl
@@ -0,0 +1,24 @@
+# SPDX-FileCopyrightText: 2020 Efabless Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# SPDX-License-Identifier: Apache-2.0
+
+# THE FOLLOWING SECTIONS CAN BE CHANGED IF NEEDED
+
+# PDN Pitch
+set ::env(FP_PDN_VPITCH) 180
+set ::env(FP_PDN_HPITCH) $::env(FP_PDN_VPITCH)
+
+# PDN Offset
+set ::env(FP_PDN_VOFFSET) 5
+set ::env(FP_PDN_HOFFSET) $::env(FP_PDN_VOFFSET)
\ No newline at end of file
diff --git a/openlane/user_project_wrapper/fixed_dont_change/fixed_wrapper_cfgs.tcl b/openlane/user_project_wrapper/fixed_dont_change/fixed_wrapper_cfgs.tcl
new file mode 100644
index 0000000..e602da7
--- /dev/null
+++ b/openlane/user_project_wrapper/fixed_dont_change/fixed_wrapper_cfgs.tcl
@@ -0,0 +1,57 @@
+# SPDX-FileCopyrightText: 2020 Efabless Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# SPDX-License-Identifier: Apache-2.0
+
+# DON'T TOUCH THE FOLLOWING SECTIONS
+set script_dir [file dirname [file normalize [info script]]]
+
+# This makes sure that the core rings are outside the boundaries
+# of your block.
+set ::env(MAGIC_ZEROIZE_ORIGIN) 0
+
+# Area Configurations. DON'T TOUCH.
+set ::env(FP_SIZING) absolute
+set ::env(DIE_AREA) "0 0 2920 3520"
+
+set ::env(RUN_CVC) 0
+
+set ::unit 2.4
+set ::env(FP_IO_VEXTEND) [expr 2*$::unit]
+set ::env(FP_IO_HEXTEND) [expr 2*$::unit]
+set ::env(FP_IO_VLENGTH) $::unit
+set ::env(FP_IO_HLENGTH) $::unit
+
+set ::env(FP_IO_VTHICKNESS_MULT) 4
+set ::env(FP_IO_HTHICKNESS_MULT) 4
+
+# Power & Pin Configurations. DON'T TOUCH.
+set ::env(FP_PDN_CORE_RING) 1
+set ::env(FP_PDN_CORE_RING_VWIDTH) 3.1
+set ::env(FP_PDN_CORE_RING_HWIDTH) 3.1
+set ::env(FP_PDN_CORE_RING_VOFFSET) 12.45
+set ::env(FP_PDN_CORE_RING_HOFFSET) $::env(FP_PDN_CORE_RING_VOFFSET)
+set ::env(FP_PDN_CORE_RING_VSPACING) 1.7
+set ::env(FP_PDN_CORE_RING_HSPACING) $::env(FP_PDN_CORE_RING_VSPACING)
+
+set ::env(FP_PDN_VWIDTH) 3.1
+set ::env(FP_PDN_HWIDTH) 3.1
+set ::env(FP_PDN_VSPACING) [expr 5*$::env(FP_PDN_CORE_RING_VWIDTH)]
+set ::env(FP_PDN_HSPACING) [expr 5*$::env(FP_PDN_CORE_RING_HWIDTH)]
+
+set ::env(VDD_NETS) [list {vccd1} {vccd2} {vdda1} {vdda2}]
+set ::env(GND_NETS) [list {vssd1} {vssd2} {vssa1} {vssa2}]
+set ::env(SYNTH_USE_PG_PINS_DEFINES) "USE_POWER_PINS"
+
+# Pin placement template
+set ::env(FP_DEF_TEMPLATE) $::env(DESIGN_DIR)/fixed_dont_change/user_project_wrapper.def
diff --git a/openlane/user_project_wrapper/fixed_dont_change/user_project_wrapper.def b/openlane/user_project_wrapper/fixed_dont_change/user_project_wrapper.def
new file mode 100644
index 0000000..0647d54
--- /dev/null
+++ b/openlane/user_project_wrapper/fixed_dont_change/user_project_wrapper.def
@@ -0,0 +1,7656 @@
+VERSION 5.8 ;
+DIVIDERCHAR "/" ;
+BUSBITCHARS "[]" ;
+DESIGN user_project_wrapper ;
+UNITS DISTANCE MICRONS 1000 ;
+DIEAREA ( 0 0 ) ( 2920000 3520000 ) ;
+ROW ROW_0 unithd 5520 10880 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1 unithd 5520 13600 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_2 unithd 5520 16320 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_3 unithd 5520 19040 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_4 unithd 5520 21760 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_5 unithd 5520 24480 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_6 unithd 5520 27200 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_7 unithd 5520 29920 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_8 unithd 5520 32640 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_9 unithd 5520 35360 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_10 unithd 5520 38080 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_11 unithd 5520 40800 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_12 unithd 5520 43520 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_13 unithd 5520 46240 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_14 unithd 5520 48960 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_15 unithd 5520 51680 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_16 unithd 5520 54400 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_17 unithd 5520 57120 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_18 unithd 5520 59840 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_19 unithd 5520 62560 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_20 unithd 5520 65280 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_21 unithd 5520 68000 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_22 unithd 5520 70720 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_23 unithd 5520 73440 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_24 unithd 5520 76160 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_25 unithd 5520 78880 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_26 unithd 5520 81600 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_27 unithd 5520 84320 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_28 unithd 5520 87040 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_29 unithd 5520 89760 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_30 unithd 5520 92480 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_31 unithd 5520 95200 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_32 unithd 5520 97920 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_33 unithd 5520 100640 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_34 unithd 5520 103360 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_35 unithd 5520 106080 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_36 unithd 5520 108800 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_37 unithd 5520 111520 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_38 unithd 5520 114240 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_39 unithd 5520 116960 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_40 unithd 5520 119680 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_41 unithd 5520 122400 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_42 unithd 5520 125120 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_43 unithd 5520 127840 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_44 unithd 5520 130560 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_45 unithd 5520 133280 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_46 unithd 5520 136000 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_47 unithd 5520 138720 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_48 unithd 5520 141440 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_49 unithd 5520 144160 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_50 unithd 5520 146880 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_51 unithd 5520 149600 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_52 unithd 5520 152320 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_53 unithd 5520 155040 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_54 unithd 5520 157760 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_55 unithd 5520 160480 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_56 unithd 5520 163200 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_57 unithd 5520 165920 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_58 unithd 5520 168640 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_59 unithd 5520 171360 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_60 unithd 5520 174080 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_61 unithd 5520 176800 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_62 unithd 5520 179520 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_63 unithd 5520 182240 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_64 unithd 5520 184960 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_65 unithd 5520 187680 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_66 unithd 5520 190400 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_67 unithd 5520 193120 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_68 unithd 5520 195840 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_69 unithd 5520 198560 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_70 unithd 5520 201280 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_71 unithd 5520 204000 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_72 unithd 5520 206720 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_73 unithd 5520 209440 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_74 unithd 5520 212160 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_75 unithd 5520 214880 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_76 unithd 5520 217600 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_77 unithd 5520 220320 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_78 unithd 5520 223040 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_79 unithd 5520 225760 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_80 unithd 5520 228480 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_81 unithd 5520 231200 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_82 unithd 5520 233920 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_83 unithd 5520 236640 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_84 unithd 5520 239360 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_85 unithd 5520 242080 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_86 unithd 5520 244800 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_87 unithd 5520 247520 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_88 unithd 5520 250240 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_89 unithd 5520 252960 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_90 unithd 5520 255680 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_91 unithd 5520 258400 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_92 unithd 5520 261120 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_93 unithd 5520 263840 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_94 unithd 5520 266560 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_95 unithd 5520 269280 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_96 unithd 5520 272000 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_97 unithd 5520 274720 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_98 unithd 5520 277440 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_99 unithd 5520 280160 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_100 unithd 5520 282880 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_101 unithd 5520 285600 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_102 unithd 5520 288320 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_103 unithd 5520 291040 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_104 unithd 5520 293760 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_105 unithd 5520 296480 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_106 unithd 5520 299200 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_107 unithd 5520 301920 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_108 unithd 5520 304640 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_109 unithd 5520 307360 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_110 unithd 5520 310080 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_111 unithd 5520 312800 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_112 unithd 5520 315520 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_113 unithd 5520 318240 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_114 unithd 5520 320960 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_115 unithd 5520 323680 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_116 unithd 5520 326400 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_117 unithd 5520 329120 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_118 unithd 5520 331840 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_119 unithd 5520 334560 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_120 unithd 5520 337280 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_121 unithd 5520 340000 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_122 unithd 5520 342720 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_123 unithd 5520 345440 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_124 unithd 5520 348160 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_125 unithd 5520 350880 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_126 unithd 5520 353600 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_127 unithd 5520 356320 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_128 unithd 5520 359040 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_129 unithd 5520 361760 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_130 unithd 5520 364480 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_131 unithd 5520 367200 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_132 unithd 5520 369920 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_133 unithd 5520 372640 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_134 unithd 5520 375360 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_135 unithd 5520 378080 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_136 unithd 5520 380800 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_137 unithd 5520 383520 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_138 unithd 5520 386240 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_139 unithd 5520 388960 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_140 unithd 5520 391680 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_141 unithd 5520 394400 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_142 unithd 5520 397120 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_143 unithd 5520 399840 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_144 unithd 5520 402560 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_145 unithd 5520 405280 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_146 unithd 5520 408000 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_147 unithd 5520 410720 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_148 unithd 5520 413440 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_149 unithd 5520 416160 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_150 unithd 5520 418880 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_151 unithd 5520 421600 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_152 unithd 5520 424320 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_153 unithd 5520 427040 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_154 unithd 5520 429760 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_155 unithd 5520 432480 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_156 unithd 5520 435200 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_157 unithd 5520 437920 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_158 unithd 5520 440640 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_159 unithd 5520 443360 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_160 unithd 5520 446080 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_161 unithd 5520 448800 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_162 unithd 5520 451520 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_163 unithd 5520 454240 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_164 unithd 5520 456960 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_165 unithd 5520 459680 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_166 unithd 5520 462400 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_167 unithd 5520 465120 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_168 unithd 5520 467840 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_169 unithd 5520 470560 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_170 unithd 5520 473280 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_171 unithd 5520 476000 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_172 unithd 5520 478720 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_173 unithd 5520 481440 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_174 unithd 5520 484160 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_175 unithd 5520 486880 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_176 unithd 5520 489600 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_177 unithd 5520 492320 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_178 unithd 5520 495040 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_179 unithd 5520 497760 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_180 unithd 5520 500480 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_181 unithd 5520 503200 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_182 unithd 5520 505920 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_183 unithd 5520 508640 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_184 unithd 5520 511360 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_185 unithd 5520 514080 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_186 unithd 5520 516800 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_187 unithd 5520 519520 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_188 unithd 5520 522240 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_189 unithd 5520 524960 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_190 unithd 5520 527680 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_191 unithd 5520 530400 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_192 unithd 5520 533120 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_193 unithd 5520 535840 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_194 unithd 5520 538560 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_195 unithd 5520 541280 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_196 unithd 5520 544000 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_197 unithd 5520 546720 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_198 unithd 5520 549440 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_199 unithd 5520 552160 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_200 unithd 5520 554880 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_201 unithd 5520 557600 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_202 unithd 5520 560320 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_203 unithd 5520 563040 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_204 unithd 5520 565760 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_205 unithd 5520 568480 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_206 unithd 5520 571200 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_207 unithd 5520 573920 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_208 unithd 5520 576640 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_209 unithd 5520 579360 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_210 unithd 5520 582080 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_211 unithd 5520 584800 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_212 unithd 5520 587520 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_213 unithd 5520 590240 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_214 unithd 5520 592960 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_215 unithd 5520 595680 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_216 unithd 5520 598400 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_217 unithd 5520 601120 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_218 unithd 5520 603840 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_219 unithd 5520 606560 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_220 unithd 5520 609280 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_221 unithd 5520 612000 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_222 unithd 5520 614720 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_223 unithd 5520 617440 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_224 unithd 5520 620160 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_225 unithd 5520 622880 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_226 unithd 5520 625600 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_227 unithd 5520 628320 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_228 unithd 5520 631040 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_229 unithd 5520 633760 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_230 unithd 5520 636480 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_231 unithd 5520 639200 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_232 unithd 5520 641920 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_233 unithd 5520 644640 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_234 unithd 5520 647360 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_235 unithd 5520 650080 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_236 unithd 5520 652800 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_237 unithd 5520 655520 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_238 unithd 5520 658240 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_239 unithd 5520 660960 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_240 unithd 5520 663680 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_241 unithd 5520 666400 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_242 unithd 5520 669120 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_243 unithd 5520 671840 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_244 unithd 5520 674560 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_245 unithd 5520 677280 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_246 unithd 5520 680000 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_247 unithd 5520 682720 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_248 unithd 5520 685440 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_249 unithd 5520 688160 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_250 unithd 5520 690880 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_251 unithd 5520 693600 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_252 unithd 5520 696320 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_253 unithd 5520 699040 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_254 unithd 5520 701760 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_255 unithd 5520 704480 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_256 unithd 5520 707200 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_257 unithd 5520 709920 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_258 unithd 5520 712640 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_259 unithd 5520 715360 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_260 unithd 5520 718080 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_261 unithd 5520 720800 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_262 unithd 5520 723520 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_263 unithd 5520 726240 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_264 unithd 5520 728960 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_265 unithd 5520 731680 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_266 unithd 5520 734400 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_267 unithd 5520 737120 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_268 unithd 5520 739840 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_269 unithd 5520 742560 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_270 unithd 5520 745280 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_271 unithd 5520 748000 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_272 unithd 5520 750720 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_273 unithd 5520 753440 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_274 unithd 5520 756160 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_275 unithd 5520 758880 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_276 unithd 5520 761600 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_277 unithd 5520 764320 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_278 unithd 5520 767040 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_279 unithd 5520 769760 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_280 unithd 5520 772480 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_281 unithd 5520 775200 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_282 unithd 5520 777920 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_283 unithd 5520 780640 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_284 unithd 5520 783360 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_285 unithd 5520 786080 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_286 unithd 5520 788800 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_287 unithd 5520 791520 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_288 unithd 5520 794240 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_289 unithd 5520 796960 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_290 unithd 5520 799680 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_291 unithd 5520 802400 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_292 unithd 5520 805120 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_293 unithd 5520 807840 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_294 unithd 5520 810560 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_295 unithd 5520 813280 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_296 unithd 5520 816000 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_297 unithd 5520 818720 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_298 unithd 5520 821440 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_299 unithd 5520 824160 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_300 unithd 5520 826880 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_301 unithd 5520 829600 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_302 unithd 5520 832320 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_303 unithd 5520 835040 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_304 unithd 5520 837760 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_305 unithd 5520 840480 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_306 unithd 5520 843200 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_307 unithd 5520 845920 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_308 unithd 5520 848640 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_309 unithd 5520 851360 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_310 unithd 5520 854080 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_311 unithd 5520 856800 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_312 unithd 5520 859520 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_313 unithd 5520 862240 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_314 unithd 5520 864960 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_315 unithd 5520 867680 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_316 unithd 5520 870400 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_317 unithd 5520 873120 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_318 unithd 5520 875840 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_319 unithd 5520 878560 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_320 unithd 5520 881280 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_321 unithd 5520 884000 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_322 unithd 5520 886720 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_323 unithd 5520 889440 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_324 unithd 5520 892160 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_325 unithd 5520 894880 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_326 unithd 5520 897600 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_327 unithd 5520 900320 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_328 unithd 5520 903040 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_329 unithd 5520 905760 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_330 unithd 5520 908480 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_331 unithd 5520 911200 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_332 unithd 5520 913920 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_333 unithd 5520 916640 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_334 unithd 5520 919360 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_335 unithd 5520 922080 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_336 unithd 5520 924800 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_337 unithd 5520 927520 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_338 unithd 5520 930240 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_339 unithd 5520 932960 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_340 unithd 5520 935680 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_341 unithd 5520 938400 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_342 unithd 5520 941120 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_343 unithd 5520 943840 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_344 unithd 5520 946560 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_345 unithd 5520 949280 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_346 unithd 5520 952000 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_347 unithd 5520 954720 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_348 unithd 5520 957440 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_349 unithd 5520 960160 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_350 unithd 5520 962880 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_351 unithd 5520 965600 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_352 unithd 5520 968320 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_353 unithd 5520 971040 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_354 unithd 5520 973760 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_355 unithd 5520 976480 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_356 unithd 5520 979200 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_357 unithd 5520 981920 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_358 unithd 5520 984640 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_359 unithd 5520 987360 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_360 unithd 5520 990080 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_361 unithd 5520 992800 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_362 unithd 5520 995520 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_363 unithd 5520 998240 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_364 unithd 5520 1000960 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_365 unithd 5520 1003680 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_366 unithd 5520 1006400 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_367 unithd 5520 1009120 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_368 unithd 5520 1011840 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_369 unithd 5520 1014560 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_370 unithd 5520 1017280 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_371 unithd 5520 1020000 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_372 unithd 5520 1022720 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_373 unithd 5520 1025440 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_374 unithd 5520 1028160 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_375 unithd 5520 1030880 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_376 unithd 5520 1033600 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_377 unithd 5520 1036320 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_378 unithd 5520 1039040 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_379 unithd 5520 1041760 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_380 unithd 5520 1044480 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_381 unithd 5520 1047200 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_382 unithd 5520 1049920 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_383 unithd 5520 1052640 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_384 unithd 5520 1055360 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_385 unithd 5520 1058080 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_386 unithd 5520 1060800 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_387 unithd 5520 1063520 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_388 unithd 5520 1066240 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_389 unithd 5520 1068960 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_390 unithd 5520 1071680 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_391 unithd 5520 1074400 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_392 unithd 5520 1077120 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_393 unithd 5520 1079840 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_394 unithd 5520 1082560 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_395 unithd 5520 1085280 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_396 unithd 5520 1088000 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_397 unithd 5520 1090720 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_398 unithd 5520 1093440 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_399 unithd 5520 1096160 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_400 unithd 5520 1098880 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_401 unithd 5520 1101600 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_402 unithd 5520 1104320 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_403 unithd 5520 1107040 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_404 unithd 5520 1109760 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_405 unithd 5520 1112480 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_406 unithd 5520 1115200 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_407 unithd 5520 1117920 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_408 unithd 5520 1120640 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_409 unithd 5520 1123360 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_410 unithd 5520 1126080 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_411 unithd 5520 1128800 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_412 unithd 5520 1131520 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_413 unithd 5520 1134240 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_414 unithd 5520 1136960 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_415 unithd 5520 1139680 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_416 unithd 5520 1142400 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_417 unithd 5520 1145120 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_418 unithd 5520 1147840 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_419 unithd 5520 1150560 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_420 unithd 5520 1153280 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_421 unithd 5520 1156000 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_422 unithd 5520 1158720 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_423 unithd 5520 1161440 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_424 unithd 5520 1164160 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_425 unithd 5520 1166880 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_426 unithd 5520 1169600 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_427 unithd 5520 1172320 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_428 unithd 5520 1175040 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_429 unithd 5520 1177760 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_430 unithd 5520 1180480 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_431 unithd 5520 1183200 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_432 unithd 5520 1185920 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_433 unithd 5520 1188640 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_434 unithd 5520 1191360 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_435 unithd 5520 1194080 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_436 unithd 5520 1196800 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_437 unithd 5520 1199520 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_438 unithd 5520 1202240 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_439 unithd 5520 1204960 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_440 unithd 5520 1207680 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_441 unithd 5520 1210400 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_442 unithd 5520 1213120 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_443 unithd 5520 1215840 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_444 unithd 5520 1218560 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_445 unithd 5520 1221280 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_446 unithd 5520 1224000 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_447 unithd 5520 1226720 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_448 unithd 5520 1229440 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_449 unithd 5520 1232160 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_450 unithd 5520 1234880 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_451 unithd 5520 1237600 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_452 unithd 5520 1240320 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_453 unithd 5520 1243040 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_454 unithd 5520 1245760 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_455 unithd 5520 1248480 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_456 unithd 5520 1251200 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_457 unithd 5520 1253920 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_458 unithd 5520 1256640 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_459 unithd 5520 1259360 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_460 unithd 5520 1262080 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_461 unithd 5520 1264800 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_462 unithd 5520 1267520 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_463 unithd 5520 1270240 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_464 unithd 5520 1272960 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_465 unithd 5520 1275680 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_466 unithd 5520 1278400 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_467 unithd 5520 1281120 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_468 unithd 5520 1283840 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_469 unithd 5520 1286560 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_470 unithd 5520 1289280 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_471 unithd 5520 1292000 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_472 unithd 5520 1294720 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_473 unithd 5520 1297440 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_474 unithd 5520 1300160 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_475 unithd 5520 1302880 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_476 unithd 5520 1305600 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_477 unithd 5520 1308320 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_478 unithd 5520 1311040 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_479 unithd 5520 1313760 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_480 unithd 5520 1316480 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_481 unithd 5520 1319200 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_482 unithd 5520 1321920 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_483 unithd 5520 1324640 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_484 unithd 5520 1327360 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_485 unithd 5520 1330080 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_486 unithd 5520 1332800 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_487 unithd 5520 1335520 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_488 unithd 5520 1338240 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_489 unithd 5520 1340960 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_490 unithd 5520 1343680 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_491 unithd 5520 1346400 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_492 unithd 5520 1349120 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_493 unithd 5520 1351840 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_494 unithd 5520 1354560 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_495 unithd 5520 1357280 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_496 unithd 5520 1360000 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_497 unithd 5520 1362720 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_498 unithd 5520 1365440 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_499 unithd 5520 1368160 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_500 unithd 5520 1370880 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_501 unithd 5520 1373600 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_502 unithd 5520 1376320 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_503 unithd 5520 1379040 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_504 unithd 5520 1381760 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_505 unithd 5520 1384480 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_506 unithd 5520 1387200 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_507 unithd 5520 1389920 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_508 unithd 5520 1392640 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_509 unithd 5520 1395360 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_510 unithd 5520 1398080 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_511 unithd 5520 1400800 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_512 unithd 5520 1403520 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_513 unithd 5520 1406240 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_514 unithd 5520 1408960 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_515 unithd 5520 1411680 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_516 unithd 5520 1414400 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_517 unithd 5520 1417120 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_518 unithd 5520 1419840 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_519 unithd 5520 1422560 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_520 unithd 5520 1425280 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_521 unithd 5520 1428000 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_522 unithd 5520 1430720 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_523 unithd 5520 1433440 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_524 unithd 5520 1436160 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_525 unithd 5520 1438880 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_526 unithd 5520 1441600 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_527 unithd 5520 1444320 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_528 unithd 5520 1447040 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_529 unithd 5520 1449760 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_530 unithd 5520 1452480 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_531 unithd 5520 1455200 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_532 unithd 5520 1457920 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_533 unithd 5520 1460640 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_534 unithd 5520 1463360 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_535 unithd 5520 1466080 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_536 unithd 5520 1468800 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_537 unithd 5520 1471520 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_538 unithd 5520 1474240 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_539 unithd 5520 1476960 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_540 unithd 5520 1479680 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_541 unithd 5520 1482400 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_542 unithd 5520 1485120 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_543 unithd 5520 1487840 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_544 unithd 5520 1490560 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_545 unithd 5520 1493280 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_546 unithd 5520 1496000 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_547 unithd 5520 1498720 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_548 unithd 5520 1501440 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_549 unithd 5520 1504160 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_550 unithd 5520 1506880 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_551 unithd 5520 1509600 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_552 unithd 5520 1512320 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_553 unithd 5520 1515040 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_554 unithd 5520 1517760 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_555 unithd 5520 1520480 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_556 unithd 5520 1523200 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_557 unithd 5520 1525920 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_558 unithd 5520 1528640 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_559 unithd 5520 1531360 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_560 unithd 5520 1534080 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_561 unithd 5520 1536800 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_562 unithd 5520 1539520 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_563 unithd 5520 1542240 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_564 unithd 5520 1544960 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_565 unithd 5520 1547680 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_566 unithd 5520 1550400 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_567 unithd 5520 1553120 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_568 unithd 5520 1555840 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_569 unithd 5520 1558560 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_570 unithd 5520 1561280 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_571 unithd 5520 1564000 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_572 unithd 5520 1566720 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_573 unithd 5520 1569440 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_574 unithd 5520 1572160 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_575 unithd 5520 1574880 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_576 unithd 5520 1577600 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_577 unithd 5520 1580320 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_578 unithd 5520 1583040 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_579 unithd 5520 1585760 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_580 unithd 5520 1588480 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_581 unithd 5520 1591200 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_582 unithd 5520 1593920 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_583 unithd 5520 1596640 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_584 unithd 5520 1599360 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_585 unithd 5520 1602080 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_586 unithd 5520 1604800 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_587 unithd 5520 1607520 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_588 unithd 5520 1610240 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_589 unithd 5520 1612960 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_590 unithd 5520 1615680 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_591 unithd 5520 1618400 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_592 unithd 5520 1621120 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_593 unithd 5520 1623840 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_594 unithd 5520 1626560 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_595 unithd 5520 1629280 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_596 unithd 5520 1632000 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_597 unithd 5520 1634720 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_598 unithd 5520 1637440 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_599 unithd 5520 1640160 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_600 unithd 5520 1642880 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_601 unithd 5520 1645600 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_602 unithd 5520 1648320 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_603 unithd 5520 1651040 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_604 unithd 5520 1653760 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_605 unithd 5520 1656480 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_606 unithd 5520 1659200 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_607 unithd 5520 1661920 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_608 unithd 5520 1664640 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_609 unithd 5520 1667360 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_610 unithd 5520 1670080 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_611 unithd 5520 1672800 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_612 unithd 5520 1675520 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_613 unithd 5520 1678240 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_614 unithd 5520 1680960 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_615 unithd 5520 1683680 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_616 unithd 5520 1686400 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_617 unithd 5520 1689120 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_618 unithd 5520 1691840 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_619 unithd 5520 1694560 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_620 unithd 5520 1697280 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_621 unithd 5520 1700000 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_622 unithd 5520 1702720 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_623 unithd 5520 1705440 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_624 unithd 5520 1708160 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_625 unithd 5520 1710880 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_626 unithd 5520 1713600 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_627 unithd 5520 1716320 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_628 unithd 5520 1719040 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_629 unithd 5520 1721760 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_630 unithd 5520 1724480 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_631 unithd 5520 1727200 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_632 unithd 5520 1729920 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_633 unithd 5520 1732640 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_634 unithd 5520 1735360 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_635 unithd 5520 1738080 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_636 unithd 5520 1740800 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_637 unithd 5520 1743520 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_638 unithd 5520 1746240 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_639 unithd 5520 1748960 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_640 unithd 5520 1751680 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_641 unithd 5520 1754400 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_642 unithd 5520 1757120 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_643 unithd 5520 1759840 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_644 unithd 5520 1762560 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_645 unithd 5520 1765280 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_646 unithd 5520 1768000 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_647 unithd 5520 1770720 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_648 unithd 5520 1773440 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_649 unithd 5520 1776160 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_650 unithd 5520 1778880 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_651 unithd 5520 1781600 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_652 unithd 5520 1784320 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_653 unithd 5520 1787040 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_654 unithd 5520 1789760 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_655 unithd 5520 1792480 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_656 unithd 5520 1795200 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_657 unithd 5520 1797920 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_658 unithd 5520 1800640 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_659 unithd 5520 1803360 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_660 unithd 5520 1806080 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_661 unithd 5520 1808800 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_662 unithd 5520 1811520 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_663 unithd 5520 1814240 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_664 unithd 5520 1816960 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_665 unithd 5520 1819680 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_666 unithd 5520 1822400 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_667 unithd 5520 1825120 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_668 unithd 5520 1827840 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_669 unithd 5520 1830560 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_670 unithd 5520 1833280 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_671 unithd 5520 1836000 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_672 unithd 5520 1838720 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_673 unithd 5520 1841440 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_674 unithd 5520 1844160 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_675 unithd 5520 1846880 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_676 unithd 5520 1849600 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_677 unithd 5520 1852320 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_678 unithd 5520 1855040 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_679 unithd 5520 1857760 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_680 unithd 5520 1860480 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_681 unithd 5520 1863200 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_682 unithd 5520 1865920 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_683 unithd 5520 1868640 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_684 unithd 5520 1871360 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_685 unithd 5520 1874080 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_686 unithd 5520 1876800 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_687 unithd 5520 1879520 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_688 unithd 5520 1882240 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_689 unithd 5520 1884960 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_690 unithd 5520 1887680 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_691 unithd 5520 1890400 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_692 unithd 5520 1893120 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_693 unithd 5520 1895840 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_694 unithd 5520 1898560 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_695 unithd 5520 1901280 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_696 unithd 5520 1904000 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_697 unithd 5520 1906720 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_698 unithd 5520 1909440 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_699 unithd 5520 1912160 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_700 unithd 5520 1914880 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_701 unithd 5520 1917600 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_702 unithd 5520 1920320 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_703 unithd 5520 1923040 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_704 unithd 5520 1925760 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_705 unithd 5520 1928480 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_706 unithd 5520 1931200 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_707 unithd 5520 1933920 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_708 unithd 5520 1936640 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_709 unithd 5520 1939360 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_710 unithd 5520 1942080 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_711 unithd 5520 1944800 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_712 unithd 5520 1947520 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_713 unithd 5520 1950240 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_714 unithd 5520 1952960 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_715 unithd 5520 1955680 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_716 unithd 5520 1958400 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_717 unithd 5520 1961120 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_718 unithd 5520 1963840 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_719 unithd 5520 1966560 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_720 unithd 5520 1969280 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_721 unithd 5520 1972000 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_722 unithd 5520 1974720 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_723 unithd 5520 1977440 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_724 unithd 5520 1980160 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_725 unithd 5520 1982880 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_726 unithd 5520 1985600 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_727 unithd 5520 1988320 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_728 unithd 5520 1991040 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_729 unithd 5520 1993760 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_730 unithd 5520 1996480 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_731 unithd 5520 1999200 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_732 unithd 5520 2001920 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_733 unithd 5520 2004640 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_734 unithd 5520 2007360 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_735 unithd 5520 2010080 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_736 unithd 5520 2012800 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_737 unithd 5520 2015520 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_738 unithd 5520 2018240 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_739 unithd 5520 2020960 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_740 unithd 5520 2023680 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_741 unithd 5520 2026400 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_742 unithd 5520 2029120 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_743 unithd 5520 2031840 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_744 unithd 5520 2034560 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_745 unithd 5520 2037280 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_746 unithd 5520 2040000 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_747 unithd 5520 2042720 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_748 unithd 5520 2045440 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_749 unithd 5520 2048160 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_750 unithd 5520 2050880 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_751 unithd 5520 2053600 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_752 unithd 5520 2056320 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_753 unithd 5520 2059040 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_754 unithd 5520 2061760 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_755 unithd 5520 2064480 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_756 unithd 5520 2067200 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_757 unithd 5520 2069920 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_758 unithd 5520 2072640 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_759 unithd 5520 2075360 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_760 unithd 5520 2078080 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_761 unithd 5520 2080800 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_762 unithd 5520 2083520 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_763 unithd 5520 2086240 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_764 unithd 5520 2088960 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_765 unithd 5520 2091680 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_766 unithd 5520 2094400 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_767 unithd 5520 2097120 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_768 unithd 5520 2099840 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_769 unithd 5520 2102560 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_770 unithd 5520 2105280 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_771 unithd 5520 2108000 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_772 unithd 5520 2110720 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_773 unithd 5520 2113440 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_774 unithd 5520 2116160 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_775 unithd 5520 2118880 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_776 unithd 5520 2121600 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_777 unithd 5520 2124320 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_778 unithd 5520 2127040 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_779 unithd 5520 2129760 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_780 unithd 5520 2132480 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_781 unithd 5520 2135200 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_782 unithd 5520 2137920 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_783 unithd 5520 2140640 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_784 unithd 5520 2143360 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_785 unithd 5520 2146080 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_786 unithd 5520 2148800 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_787 unithd 5520 2151520 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_788 unithd 5520 2154240 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_789 unithd 5520 2156960 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_790 unithd 5520 2159680 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_791 unithd 5520 2162400 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_792 unithd 5520 2165120 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_793 unithd 5520 2167840 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_794 unithd 5520 2170560 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_795 unithd 5520 2173280 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_796 unithd 5520 2176000 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_797 unithd 5520 2178720 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_798 unithd 5520 2181440 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_799 unithd 5520 2184160 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_800 unithd 5520 2186880 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_801 unithd 5520 2189600 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_802 unithd 5520 2192320 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_803 unithd 5520 2195040 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_804 unithd 5520 2197760 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_805 unithd 5520 2200480 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_806 unithd 5520 2203200 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_807 unithd 5520 2205920 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_808 unithd 5520 2208640 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_809 unithd 5520 2211360 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_810 unithd 5520 2214080 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_811 unithd 5520 2216800 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_812 unithd 5520 2219520 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_813 unithd 5520 2222240 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_814 unithd 5520 2224960 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_815 unithd 5520 2227680 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_816 unithd 5520 2230400 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_817 unithd 5520 2233120 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_818 unithd 5520 2235840 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_819 unithd 5520 2238560 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_820 unithd 5520 2241280 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_821 unithd 5520 2244000 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_822 unithd 5520 2246720 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_823 unithd 5520 2249440 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_824 unithd 5520 2252160 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_825 unithd 5520 2254880 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_826 unithd 5520 2257600 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_827 unithd 5520 2260320 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_828 unithd 5520 2263040 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_829 unithd 5520 2265760 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_830 unithd 5520 2268480 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_831 unithd 5520 2271200 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_832 unithd 5520 2273920 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_833 unithd 5520 2276640 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_834 unithd 5520 2279360 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_835 unithd 5520 2282080 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_836 unithd 5520 2284800 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_837 unithd 5520 2287520 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_838 unithd 5520 2290240 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_839 unithd 5520 2292960 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_840 unithd 5520 2295680 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_841 unithd 5520 2298400 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_842 unithd 5520 2301120 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_843 unithd 5520 2303840 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_844 unithd 5520 2306560 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_845 unithd 5520 2309280 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_846 unithd 5520 2312000 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_847 unithd 5520 2314720 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_848 unithd 5520 2317440 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_849 unithd 5520 2320160 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_850 unithd 5520 2322880 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_851 unithd 5520 2325600 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_852 unithd 5520 2328320 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_853 unithd 5520 2331040 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_854 unithd 5520 2333760 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_855 unithd 5520 2336480 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_856 unithd 5520 2339200 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_857 unithd 5520 2341920 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_858 unithd 5520 2344640 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_859 unithd 5520 2347360 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_860 unithd 5520 2350080 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_861 unithd 5520 2352800 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_862 unithd 5520 2355520 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_863 unithd 5520 2358240 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_864 unithd 5520 2360960 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_865 unithd 5520 2363680 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_866 unithd 5520 2366400 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_867 unithd 5520 2369120 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_868 unithd 5520 2371840 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_869 unithd 5520 2374560 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_870 unithd 5520 2377280 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_871 unithd 5520 2380000 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_872 unithd 5520 2382720 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_873 unithd 5520 2385440 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_874 unithd 5520 2388160 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_875 unithd 5520 2390880 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_876 unithd 5520 2393600 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_877 unithd 5520 2396320 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_878 unithd 5520 2399040 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_879 unithd 5520 2401760 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_880 unithd 5520 2404480 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_881 unithd 5520 2407200 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_882 unithd 5520 2409920 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_883 unithd 5520 2412640 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_884 unithd 5520 2415360 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_885 unithd 5520 2418080 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_886 unithd 5520 2420800 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_887 unithd 5520 2423520 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_888 unithd 5520 2426240 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_889 unithd 5520 2428960 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_890 unithd 5520 2431680 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_891 unithd 5520 2434400 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_892 unithd 5520 2437120 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_893 unithd 5520 2439840 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_894 unithd 5520 2442560 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_895 unithd 5520 2445280 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_896 unithd 5520 2448000 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_897 unithd 5520 2450720 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_898 unithd 5520 2453440 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_899 unithd 5520 2456160 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_900 unithd 5520 2458880 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_901 unithd 5520 2461600 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_902 unithd 5520 2464320 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_903 unithd 5520 2467040 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_904 unithd 5520 2469760 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_905 unithd 5520 2472480 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_906 unithd 5520 2475200 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_907 unithd 5520 2477920 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_908 unithd 5520 2480640 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_909 unithd 5520 2483360 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_910 unithd 5520 2486080 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_911 unithd 5520 2488800 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_912 unithd 5520 2491520 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_913 unithd 5520 2494240 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_914 unithd 5520 2496960 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_915 unithd 5520 2499680 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_916 unithd 5520 2502400 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_917 unithd 5520 2505120 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_918 unithd 5520 2507840 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_919 unithd 5520 2510560 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_920 unithd 5520 2513280 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_921 unithd 5520 2516000 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_922 unithd 5520 2518720 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_923 unithd 5520 2521440 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_924 unithd 5520 2524160 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_925 unithd 5520 2526880 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_926 unithd 5520 2529600 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_927 unithd 5520 2532320 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_928 unithd 5520 2535040 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_929 unithd 5520 2537760 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_930 unithd 5520 2540480 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_931 unithd 5520 2543200 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_932 unithd 5520 2545920 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_933 unithd 5520 2548640 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_934 unithd 5520 2551360 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_935 unithd 5520 2554080 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_936 unithd 5520 2556800 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_937 unithd 5520 2559520 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_938 unithd 5520 2562240 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_939 unithd 5520 2564960 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_940 unithd 5520 2567680 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_941 unithd 5520 2570400 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_942 unithd 5520 2573120 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_943 unithd 5520 2575840 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_944 unithd 5520 2578560 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_945 unithd 5520 2581280 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_946 unithd 5520 2584000 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_947 unithd 5520 2586720 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_948 unithd 5520 2589440 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_949 unithd 5520 2592160 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_950 unithd 5520 2594880 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_951 unithd 5520 2597600 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_952 unithd 5520 2600320 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_953 unithd 5520 2603040 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_954 unithd 5520 2605760 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_955 unithd 5520 2608480 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_956 unithd 5520 2611200 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_957 unithd 5520 2613920 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_958 unithd 5520 2616640 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_959 unithd 5520 2619360 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_960 unithd 5520 2622080 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_961 unithd 5520 2624800 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_962 unithd 5520 2627520 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_963 unithd 5520 2630240 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_964 unithd 5520 2632960 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_965 unithd 5520 2635680 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_966 unithd 5520 2638400 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_967 unithd 5520 2641120 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_968 unithd 5520 2643840 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_969 unithd 5520 2646560 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_970 unithd 5520 2649280 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_971 unithd 5520 2652000 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_972 unithd 5520 2654720 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_973 unithd 5520 2657440 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_974 unithd 5520 2660160 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_975 unithd 5520 2662880 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_976 unithd 5520 2665600 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_977 unithd 5520 2668320 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_978 unithd 5520 2671040 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_979 unithd 5520 2673760 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_980 unithd 5520 2676480 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_981 unithd 5520 2679200 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_982 unithd 5520 2681920 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_983 unithd 5520 2684640 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_984 unithd 5520 2687360 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_985 unithd 5520 2690080 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_986 unithd 5520 2692800 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_987 unithd 5520 2695520 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_988 unithd 5520 2698240 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_989 unithd 5520 2700960 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_990 unithd 5520 2703680 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_991 unithd 5520 2706400 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_992 unithd 5520 2709120 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_993 unithd 5520 2711840 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_994 unithd 5520 2714560 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_995 unithd 5520 2717280 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_996 unithd 5520 2720000 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_997 unithd 5520 2722720 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_998 unithd 5520 2725440 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_999 unithd 5520 2728160 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1000 unithd 5520 2730880 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1001 unithd 5520 2733600 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1002 unithd 5520 2736320 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1003 unithd 5520 2739040 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1004 unithd 5520 2741760 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1005 unithd 5520 2744480 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1006 unithd 5520 2747200 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1007 unithd 5520 2749920 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1008 unithd 5520 2752640 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1009 unithd 5520 2755360 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1010 unithd 5520 2758080 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1011 unithd 5520 2760800 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1012 unithd 5520 2763520 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1013 unithd 5520 2766240 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1014 unithd 5520 2768960 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1015 unithd 5520 2771680 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1016 unithd 5520 2774400 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1017 unithd 5520 2777120 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1018 unithd 5520 2779840 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1019 unithd 5520 2782560 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1020 unithd 5520 2785280 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1021 unithd 5520 2788000 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1022 unithd 5520 2790720 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1023 unithd 5520 2793440 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1024 unithd 5520 2796160 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1025 unithd 5520 2798880 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1026 unithd 5520 2801600 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1027 unithd 5520 2804320 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1028 unithd 5520 2807040 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1029 unithd 5520 2809760 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1030 unithd 5520 2812480 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1031 unithd 5520 2815200 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1032 unithd 5520 2817920 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1033 unithd 5520 2820640 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1034 unithd 5520 2823360 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1035 unithd 5520 2826080 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1036 unithd 5520 2828800 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1037 unithd 5520 2831520 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1038 unithd 5520 2834240 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1039 unithd 5520 2836960 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1040 unithd 5520 2839680 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1041 unithd 5520 2842400 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1042 unithd 5520 2845120 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1043 unithd 5520 2847840 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1044 unithd 5520 2850560 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1045 unithd 5520 2853280 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1046 unithd 5520 2856000 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1047 unithd 5520 2858720 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1048 unithd 5520 2861440 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1049 unithd 5520 2864160 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1050 unithd 5520 2866880 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1051 unithd 5520 2869600 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1052 unithd 5520 2872320 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1053 unithd 5520 2875040 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1054 unithd 5520 2877760 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1055 unithd 5520 2880480 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1056 unithd 5520 2883200 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1057 unithd 5520 2885920 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1058 unithd 5520 2888640 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1059 unithd 5520 2891360 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1060 unithd 5520 2894080 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1061 unithd 5520 2896800 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1062 unithd 5520 2899520 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1063 unithd 5520 2902240 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1064 unithd 5520 2904960 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1065 unithd 5520 2907680 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1066 unithd 5520 2910400 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1067 unithd 5520 2913120 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1068 unithd 5520 2915840 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1069 unithd 5520 2918560 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1070 unithd 5520 2921280 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1071 unithd 5520 2924000 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1072 unithd 5520 2926720 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1073 unithd 5520 2929440 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1074 unithd 5520 2932160 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1075 unithd 5520 2934880 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1076 unithd 5520 2937600 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1077 unithd 5520 2940320 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1078 unithd 5520 2943040 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1079 unithd 5520 2945760 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1080 unithd 5520 2948480 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1081 unithd 5520 2951200 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1082 unithd 5520 2953920 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1083 unithd 5520 2956640 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1084 unithd 5520 2959360 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1085 unithd 5520 2962080 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1086 unithd 5520 2964800 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1087 unithd 5520 2967520 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1088 unithd 5520 2970240 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1089 unithd 5520 2972960 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1090 unithd 5520 2975680 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1091 unithd 5520 2978400 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1092 unithd 5520 2981120 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1093 unithd 5520 2983840 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1094 unithd 5520 2986560 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1095 unithd 5520 2989280 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1096 unithd 5520 2992000 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1097 unithd 5520 2994720 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1098 unithd 5520 2997440 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1099 unithd 5520 3000160 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1100 unithd 5520 3002880 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1101 unithd 5520 3005600 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1102 unithd 5520 3008320 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1103 unithd 5520 3011040 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1104 unithd 5520 3013760 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1105 unithd 5520 3016480 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1106 unithd 5520 3019200 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1107 unithd 5520 3021920 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1108 unithd 5520 3024640 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1109 unithd 5520 3027360 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1110 unithd 5520 3030080 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1111 unithd 5520 3032800 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1112 unithd 5520 3035520 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1113 unithd 5520 3038240 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1114 unithd 5520 3040960 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1115 unithd 5520 3043680 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1116 unithd 5520 3046400 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1117 unithd 5520 3049120 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1118 unithd 5520 3051840 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1119 unithd 5520 3054560 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1120 unithd 5520 3057280 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1121 unithd 5520 3060000 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1122 unithd 5520 3062720 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1123 unithd 5520 3065440 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1124 unithd 5520 3068160 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1125 unithd 5520 3070880 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1126 unithd 5520 3073600 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1127 unithd 5520 3076320 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1128 unithd 5520 3079040 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1129 unithd 5520 3081760 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1130 unithd 5520 3084480 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1131 unithd 5520 3087200 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1132 unithd 5520 3089920 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1133 unithd 5520 3092640 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1134 unithd 5520 3095360 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1135 unithd 5520 3098080 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1136 unithd 5520 3100800 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1137 unithd 5520 3103520 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1138 unithd 5520 3106240 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1139 unithd 5520 3108960 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1140 unithd 5520 3111680 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1141 unithd 5520 3114400 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1142 unithd 5520 3117120 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1143 unithd 5520 3119840 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1144 unithd 5520 3122560 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1145 unithd 5520 3125280 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1146 unithd 5520 3128000 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1147 unithd 5520 3130720 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1148 unithd 5520 3133440 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1149 unithd 5520 3136160 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1150 unithd 5520 3138880 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1151 unithd 5520 3141600 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1152 unithd 5520 3144320 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1153 unithd 5520 3147040 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1154 unithd 5520 3149760 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1155 unithd 5520 3152480 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1156 unithd 5520 3155200 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1157 unithd 5520 3157920 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1158 unithd 5520 3160640 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1159 unithd 5520 3163360 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1160 unithd 5520 3166080 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1161 unithd 5520 3168800 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1162 unithd 5520 3171520 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1163 unithd 5520 3174240 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1164 unithd 5520 3176960 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1165 unithd 5520 3179680 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1166 unithd 5520 3182400 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1167 unithd 5520 3185120 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1168 unithd 5520 3187840 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1169 unithd 5520 3190560 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1170 unithd 5520 3193280 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1171 unithd 5520 3196000 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1172 unithd 5520 3198720 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1173 unithd 5520 3201440 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1174 unithd 5520 3204160 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1175 unithd 5520 3206880 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1176 unithd 5520 3209600 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1177 unithd 5520 3212320 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1178 unithd 5520 3215040 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1179 unithd 5520 3217760 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1180 unithd 5520 3220480 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1181 unithd 5520 3223200 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1182 unithd 5520 3225920 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1183 unithd 5520 3228640 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1184 unithd 5520 3231360 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1185 unithd 5520 3234080 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1186 unithd 5520 3236800 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1187 unithd 5520 3239520 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1188 unithd 5520 3242240 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1189 unithd 5520 3244960 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1190 unithd 5520 3247680 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1191 unithd 5520 3250400 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1192 unithd 5520 3253120 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1193 unithd 5520 3255840 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1194 unithd 5520 3258560 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1195 unithd 5520 3261280 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1196 unithd 5520 3264000 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1197 unithd 5520 3266720 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1198 unithd 5520 3269440 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1199 unithd 5520 3272160 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1200 unithd 5520 3274880 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1201 unithd 5520 3277600 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1202 unithd 5520 3280320 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1203 unithd 5520 3283040 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1204 unithd 5520 3285760 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1205 unithd 5520 3288480 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1206 unithd 5520 3291200 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1207 unithd 5520 3293920 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1208 unithd 5520 3296640 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1209 unithd 5520 3299360 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1210 unithd 5520 3302080 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1211 unithd 5520 3304800 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1212 unithd 5520 3307520 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1213 unithd 5520 3310240 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1214 unithd 5520 3312960 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1215 unithd 5520 3315680 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1216 unithd 5520 3318400 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1217 unithd 5520 3321120 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1218 unithd 5520 3323840 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1219 unithd 5520 3326560 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1220 unithd 5520 3329280 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1221 unithd 5520 3332000 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1222 unithd 5520 3334720 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1223 unithd 5520 3337440 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1224 unithd 5520 3340160 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1225 unithd 5520 3342880 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1226 unithd 5520 3345600 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1227 unithd 5520 3348320 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1228 unithd 5520 3351040 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1229 unithd 5520 3353760 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1230 unithd 5520 3356480 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1231 unithd 5520 3359200 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1232 unithd 5520 3361920 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1233 unithd 5520 3364640 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1234 unithd 5520 3367360 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1235 unithd 5520 3370080 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1236 unithd 5520 3372800 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1237 unithd 5520 3375520 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1238 unithd 5520 3378240 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1239 unithd 5520 3380960 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1240 unithd 5520 3383680 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1241 unithd 5520 3386400 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1242 unithd 5520 3389120 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1243 unithd 5520 3391840 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1244 unithd 5520 3394560 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1245 unithd 5520 3397280 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1246 unithd 5520 3400000 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1247 unithd 5520 3402720 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1248 unithd 5520 3405440 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1249 unithd 5520 3408160 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1250 unithd 5520 3410880 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1251 unithd 5520 3413600 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1252 unithd 5520 3416320 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1253 unithd 5520 3419040 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1254 unithd 5520 3421760 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1255 unithd 5520 3424480 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1256 unithd 5520 3427200 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1257 unithd 5520 3429920 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1258 unithd 5520 3432640 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1259 unithd 5520 3435360 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1260 unithd 5520 3438080 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1261 unithd 5520 3440800 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1262 unithd 5520 3443520 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1263 unithd 5520 3446240 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1264 unithd 5520 3448960 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1265 unithd 5520 3451680 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1266 unithd 5520 3454400 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1267 unithd 5520 3457120 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1268 unithd 5520 3459840 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1269 unithd 5520 3462560 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1270 unithd 5520 3465280 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1271 unithd 5520 3468000 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1272 unithd 5520 3470720 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1273 unithd 5520 3473440 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1274 unithd 5520 3476160 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1275 unithd 5520 3478880 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1276 unithd 5520 3481600 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1277 unithd 5520 3484320 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1278 unithd 5520 3487040 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1279 unithd 5520 3489760 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1280 unithd 5520 3492480 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1281 unithd 5520 3495200 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1282 unithd 5520 3497920 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1283 unithd 5520 3500640 FS DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1284 unithd 5520 3503360 N DO 6323 BY 1 STEP 460 0 ;
+ROW ROW_1285 unithd 5520 3506080 FS DO 6323 BY 1 STEP 460 0 ;
+TRACKS X 230 DO 6348 STEP 460 LAYER li1 ;
+TRACKS Y 170 DO 10353 STEP 340 LAYER li1 ;
+TRACKS X 170 DO 8588 STEP 340 LAYER met1 ;
+TRACKS Y 170 DO 10353 STEP 340 LAYER met1 ;
+TRACKS X 230 DO 6348 STEP 460 LAYER met2 ;
+TRACKS Y 230 DO 7652 STEP 460 LAYER met2 ;
+TRACKS X 340 DO 4294 STEP 680 LAYER met3 ;
+TRACKS Y 340 DO 5176 STEP 680 LAYER met3 ;
+TRACKS X 460 DO 3174 STEP 920 LAYER met4 ;
+TRACKS Y 460 DO 3826 STEP 920 LAYER met4 ;
+TRACKS X 1700 DO 859 STEP 3400 LAYER met5 ;
+TRACKS Y 1700 DO 1035 STEP 3400 LAYER met5 ;
+GCELLGRID X 0 DO 423 STEP 6900 ;
+GCELLGRID Y 0 DO 510 STEP 6900 ;
+VIAS 2 ;
+ - via4_3100x3100 + VIARULE M4M5_PR + CUTSIZE 800 800 + LAYERS met4 via4 met5 + CUTSPACING 800 800 + ENCLOSURE 350 350 350 350 + ROWCOL 2 2 ;
+ - via4_1600x3100 + VIARULE M4M5_PR + CUTSIZE 800 800 + LAYERS met4 via4 met5 + CUTSPACING 800 800 + ENCLOSURE 400 350 400 350 + ROWCOL 2 1 ;
+END VIAS
+PINS 645 ;
+ - analog_io[0] + NET analog_io[0] + DIRECTION INOUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 1426980 ) N ;
+ - analog_io[10] + NET analog_io[10] + DIRECTION INOUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2230770 3521200 ) N ;
+ - analog_io[11] + NET analog_io[11] + DIRECTION INOUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1906010 3521200 ) N ;
+ - analog_io[12] + NET analog_io[12] + DIRECTION INOUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1581710 3521200 ) N ;
+ - analog_io[13] + NET analog_io[13] + DIRECTION INOUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1257410 3521200 ) N ;
+ - analog_io[14] + NET analog_io[14] + DIRECTION INOUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 932650 3521200 ) N ;
+ - analog_io[15] + NET analog_io[15] + DIRECTION INOUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 608350 3521200 ) N ;
+ - analog_io[16] + NET analog_io[16] + DIRECTION INOUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 284050 3521200 ) N ;
+ - analog_io[17] + NET analog_io[17] + DIRECTION INOUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 3486700 ) N ;
+ - analog_io[18] + NET analog_io[18] + DIRECTION INOUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 3225580 ) N ;
+ - analog_io[19] + NET analog_io[19] + DIRECTION INOUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 2965140 ) N ;
+ - analog_io[1] + NET analog_io[1] + DIRECTION INOUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 1692860 ) N ;
+ - analog_io[20] + NET analog_io[20] + DIRECTION INOUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 2704020 ) N ;
+ - analog_io[21] + NET analog_io[21] + DIRECTION INOUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 2443580 ) N ;
+ - analog_io[22] + NET analog_io[22] + DIRECTION INOUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 2183140 ) N ;
+ - analog_io[23] + NET analog_io[23] + DIRECTION INOUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 1922020 ) N ;
+ - analog_io[24] + NET analog_io[24] + DIRECTION INOUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 1661580 ) N ;
+ - analog_io[25] + NET analog_io[25] + DIRECTION INOUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 1400460 ) N ;
+ - analog_io[26] + NET analog_io[26] + DIRECTION INOUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 1140020 ) N ;
+ - analog_io[27] + NET analog_io[27] + DIRECTION INOUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 879580 ) N ;
+ - analog_io[28] + NET analog_io[28] + DIRECTION INOUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 618460 ) N ;
+ - analog_io[2] + NET analog_io[2] + DIRECTION INOUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 1958740 ) N ;
+ - analog_io[3] + NET analog_io[3] + DIRECTION INOUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 2223940 ) N ;
+ - analog_io[4] + NET analog_io[4] + DIRECTION INOUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 2489820 ) N ;
+ - analog_io[5] + NET analog_io[5] + DIRECTION INOUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 2755700 ) N ;
+ - analog_io[6] + NET analog_io[6] + DIRECTION INOUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 3020900 ) N ;
+ - analog_io[7] + NET analog_io[7] + DIRECTION INOUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 3286780 ) N ;
+ - analog_io[8] + NET analog_io[8] + DIRECTION INOUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2879370 3521200 ) N ;
+ - analog_io[9] + NET analog_io[9] + DIRECTION INOUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2555070 3521200 ) N ;
+ - io_in[0] + NET io_in[0] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 32980 ) N ;
+ - io_in[10] + NET io_in[10] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 2290580 ) N ;
+ - io_in[11] + NET io_in[11] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 2556460 ) N ;
+ - io_in[12] + NET io_in[12] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 2821660 ) N ;
+ - io_in[13] + NET io_in[13] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 3087540 ) N ;
+ - io_in[14] + NET io_in[14] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 3353420 ) N ;
+ - io_in[15] + NET io_in[15] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2798410 3521200 ) N ;
+ - io_in[16] + NET io_in[16] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2474110 3521200 ) N ;
+ - io_in[17] + NET io_in[17] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2149350 3521200 ) N ;
+ - io_in[18] + NET io_in[18] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1825050 3521200 ) N ;
+ - io_in[19] + NET io_in[19] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1500750 3521200 ) N ;
+ - io_in[1] + NET io_in[1] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 231540 ) N ;
+ - io_in[20] + NET io_in[20] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1175990 3521200 ) N ;
+ - io_in[21] + NET io_in[21] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 851690 3521200 ) N ;
+ - io_in[22] + NET io_in[22] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 527390 3521200 ) N ;
+ - io_in[23] + NET io_in[23] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 202630 3521200 ) N ;
+ - io_in[24] + NET io_in[24] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 3421420 ) N ;
+ - io_in[25] + NET io_in[25] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 3160300 ) N ;
+ - io_in[26] + NET io_in[26] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 2899860 ) N ;
+ - io_in[27] + NET io_in[27] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 2639420 ) N ;
+ - io_in[28] + NET io_in[28] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 2378300 ) N ;
+ - io_in[29] + NET io_in[29] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 2117860 ) N ;
+ - io_in[2] + NET io_in[2] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 430780 ) N ;
+ - io_in[30] + NET io_in[30] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 1856740 ) N ;
+ - io_in[31] + NET io_in[31] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 1596300 ) N ;
+ - io_in[32] + NET io_in[32] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 1335860 ) N ;
+ - io_in[33] + NET io_in[33] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 1074740 ) N ;
+ - io_in[34] + NET io_in[34] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 814300 ) N ;
+ - io_in[35] + NET io_in[35] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 553180 ) N ;
+ - io_in[36] + NET io_in[36] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 358020 ) N ;
+ - io_in[37] + NET io_in[37] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 162180 ) N ;
+ - io_in[3] + NET io_in[3] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 630020 ) N ;
+ - io_in[4] + NET io_in[4] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 829260 ) N ;
+ - io_in[5] + NET io_in[5] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 1028500 ) N ;
+ - io_in[6] + NET io_in[6] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 1227740 ) N ;
+ - io_in[7] + NET io_in[7] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 1493620 ) N ;
+ - io_in[8] + NET io_in[8] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 1759500 ) N ;
+ - io_in[9] + NET io_in[9] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 2024700 ) N ;
+ - io_oeb[0] + NET io_oeb[0] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 165580 ) N ;
+ - io_oeb[10] + NET io_oeb[10] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 2423180 ) N ;
+ - io_oeb[11] + NET io_oeb[11] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 2689060 ) N ;
+ - io_oeb[12] + NET io_oeb[12] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 2954940 ) N ;
+ - io_oeb[13] + NET io_oeb[13] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 3220140 ) N ;
+ - io_oeb[14] + NET io_oeb[14] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 3486020 ) N ;
+ - io_oeb[15] + NET io_oeb[15] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2636030 3521200 ) N ;
+ - io_oeb[16] + NET io_oeb[16] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2311730 3521200 ) N ;
+ - io_oeb[17] + NET io_oeb[17] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1987430 3521200 ) N ;
+ - io_oeb[18] + NET io_oeb[18] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1662670 3521200 ) N ;
+ - io_oeb[19] + NET io_oeb[19] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1338370 3521200 ) N ;
+ - io_oeb[1] + NET io_oeb[1] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 364820 ) N ;
+ - io_oeb[20] + NET io_oeb[20] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1014070 3521200 ) N ;
+ - io_oeb[21] + NET io_oeb[21] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 689310 3521200 ) N ;
+ - io_oeb[22] + NET io_oeb[22] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 365010 3521200 ) N ;
+ - io_oeb[23] + NET io_oeb[23] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 40710 3521200 ) N ;
+ - io_oeb[24] + NET io_oeb[24] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 3290860 ) N ;
+ - io_oeb[25] + NET io_oeb[25] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 3030420 ) N ;
+ - io_oeb[26] + NET io_oeb[26] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 2769300 ) N ;
+ - io_oeb[27] + NET io_oeb[27] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 2508860 ) N ;
+ - io_oeb[28] + NET io_oeb[28] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 2247740 ) N ;
+ - io_oeb[29] + NET io_oeb[29] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 1987300 ) N ;
+ - io_oeb[2] + NET io_oeb[2] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 564060 ) N ;
+ - io_oeb[30] + NET io_oeb[30] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 1726860 ) N ;
+ - io_oeb[31] + NET io_oeb[31] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 1465740 ) N ;
+ - io_oeb[32] + NET io_oeb[32] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 1205300 ) N ;
+ - io_oeb[33] + NET io_oeb[33] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 944180 ) N ;
+ - io_oeb[34] + NET io_oeb[34] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 683740 ) N ;
+ - io_oeb[35] + NET io_oeb[35] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 423300 ) N ;
+ - io_oeb[36] + NET io_oeb[36] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 227460 ) N ;
+ - io_oeb[37] + NET io_oeb[37] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 32300 ) N ;
+ - io_oeb[3] + NET io_oeb[3] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 763300 ) N ;
+ - io_oeb[4] + NET io_oeb[4] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 962540 ) N ;
+ - io_oeb[5] + NET io_oeb[5] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 1161780 ) N ;
+ - io_oeb[6] + NET io_oeb[6] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 1361020 ) N ;
+ - io_oeb[7] + NET io_oeb[7] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 1626220 ) N ;
+ - io_oeb[8] + NET io_oeb[8] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 1892100 ) N ;
+ - io_oeb[9] + NET io_oeb[9] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 2157980 ) N ;
+ - io_out[0] + NET io_out[0] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 98940 ) N ;
+ - io_out[10] + NET io_out[10] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 2357220 ) N ;
+ - io_out[11] + NET io_out[11] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 2622420 ) N ;
+ - io_out[12] + NET io_out[12] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 2888300 ) N ;
+ - io_out[13] + NET io_out[13] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 3154180 ) N ;
+ - io_out[14] + NET io_out[14] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 3419380 ) N ;
+ - io_out[15] + NET io_out[15] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2717450 3521200 ) N ;
+ - io_out[16] + NET io_out[16] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2392690 3521200 ) N ;
+ - io_out[17] + NET io_out[17] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2068390 3521200 ) N ;
+ - io_out[18] + NET io_out[18] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1744090 3521200 ) N ;
+ - io_out[19] + NET io_out[19] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1419330 3521200 ) N ;
+ - io_out[1] + NET io_out[1] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 298180 ) N ;
+ - io_out[20] + NET io_out[20] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1095030 3521200 ) N ;
+ - io_out[21] + NET io_out[21] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 770730 3521200 ) N ;
+ - io_out[22] + NET io_out[22] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 445970 3521200 ) N ;
+ - io_out[23] + NET io_out[23] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 121670 3521200 ) N ;
+ - io_out[24] + NET io_out[24] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 3356140 ) N ;
+ - io_out[25] + NET io_out[25] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 3095700 ) N ;
+ - io_out[26] + NET io_out[26] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 2834580 ) N ;
+ - io_out[27] + NET io_out[27] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 2574140 ) N ;
+ - io_out[28] + NET io_out[28] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 2313020 ) N ;
+ - io_out[29] + NET io_out[29] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 2052580 ) N ;
+ - io_out[2] + NET io_out[2] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 497420 ) N ;
+ - io_out[30] + NET io_out[30] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 1792140 ) N ;
+ - io_out[31] + NET io_out[31] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 1531020 ) N ;
+ - io_out[32] + NET io_out[32] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 1270580 ) N ;
+ - io_out[33] + NET io_out[33] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 1009460 ) N ;
+ - io_out[34] + NET io_out[34] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 749020 ) N ;
+ - io_out[35] + NET io_out[35] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 487900 ) N ;
+ - io_out[36] + NET io_out[36] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 292740 ) N ;
+ - io_out[37] + NET io_out[37] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( -1200 96900 ) N ;
+ - io_out[3] + NET io_out[3] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 696660 ) N ;
+ - io_out[4] + NET io_out[4] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 895900 ) N ;
+ - io_out[5] + NET io_out[5] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 1095140 ) N ;
+ - io_out[6] + NET io_out[6] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 1294380 ) N ;
+ - io_out[7] + NET io_out[7] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 1560260 ) N ;
+ - io_out[8] + NET io_out[8] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 1825460 ) N ;
+ - io_out[9] + NET io_out[9] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met3 ( -3600 -600 ) ( 3600 600 )
+ + PLACED ( 2921200 2091340 ) N ;
+ - la_data_in[0] + NET la_data_in[0] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 629510 -1200 ) N ;
+ - la_data_in[100] + NET la_data_in[100] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2402810 -1200 ) N ;
+ - la_data_in[101] + NET la_data_in[101] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2420290 -1200 ) N ;
+ - la_data_in[102] + NET la_data_in[102] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2438230 -1200 ) N ;
+ - la_data_in[103] + NET la_data_in[103] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2455710 -1200 ) N ;
+ - la_data_in[104] + NET la_data_in[104] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2473650 -1200 ) N ;
+ - la_data_in[105] + NET la_data_in[105] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2491130 -1200 ) N ;
+ - la_data_in[106] + NET la_data_in[106] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2509070 -1200 ) N ;
+ - la_data_in[107] + NET la_data_in[107] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2527010 -1200 ) N ;
+ - la_data_in[108] + NET la_data_in[108] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2544490 -1200 ) N ;
+ - la_data_in[109] + NET la_data_in[109] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2562430 -1200 ) N ;
+ - la_data_in[10] + NET la_data_in[10] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 806610 -1200 ) N ;
+ - la_data_in[110] + NET la_data_in[110] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2579910 -1200 ) N ;
+ - la_data_in[111] + NET la_data_in[111] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2597850 -1200 ) N ;
+ - la_data_in[112] + NET la_data_in[112] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2615330 -1200 ) N ;
+ - la_data_in[113] + NET la_data_in[113] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2633270 -1200 ) N ;
+ - la_data_in[114] + NET la_data_in[114] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2650750 -1200 ) N ;
+ - la_data_in[115] + NET la_data_in[115] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2668690 -1200 ) N ;
+ - la_data_in[116] + NET la_data_in[116] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2686170 -1200 ) N ;
+ - la_data_in[117] + NET la_data_in[117] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2704110 -1200 ) N ;
+ - la_data_in[118] + NET la_data_in[118] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2722050 -1200 ) N ;
+ - la_data_in[119] + NET la_data_in[119] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2739530 -1200 ) N ;
+ - la_data_in[11] + NET la_data_in[11] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 824550 -1200 ) N ;
+ - la_data_in[120] + NET la_data_in[120] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2757470 -1200 ) N ;
+ - la_data_in[121] + NET la_data_in[121] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2774950 -1200 ) N ;
+ - la_data_in[122] + NET la_data_in[122] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2792890 -1200 ) N ;
+ - la_data_in[123] + NET la_data_in[123] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2810370 -1200 ) N ;
+ - la_data_in[124] + NET la_data_in[124] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2828310 -1200 ) N ;
+ - la_data_in[125] + NET la_data_in[125] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2845790 -1200 ) N ;
+ - la_data_in[126] + NET la_data_in[126] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2863730 -1200 ) N ;
+ - la_data_in[127] + NET la_data_in[127] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2881670 -1200 ) N ;
+ - la_data_in[12] + NET la_data_in[12] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 842030 -1200 ) N ;
+ - la_data_in[13] + NET la_data_in[13] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 859970 -1200 ) N ;
+ - la_data_in[14] + NET la_data_in[14] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 877450 -1200 ) N ;
+ - la_data_in[15] + NET la_data_in[15] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 895390 -1200 ) N ;
+ - la_data_in[16] + NET la_data_in[16] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 912870 -1200 ) N ;
+ - la_data_in[17] + NET la_data_in[17] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 930810 -1200 ) N ;
+ - la_data_in[18] + NET la_data_in[18] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 948750 -1200 ) N ;
+ - la_data_in[19] + NET la_data_in[19] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 966230 -1200 ) N ;
+ - la_data_in[1] + NET la_data_in[1] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 646990 -1200 ) N ;
+ - la_data_in[20] + NET la_data_in[20] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 984170 -1200 ) N ;
+ - la_data_in[21] + NET la_data_in[21] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1001650 -1200 ) N ;
+ - la_data_in[22] + NET la_data_in[22] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1019590 -1200 ) N ;
+ - la_data_in[23] + NET la_data_in[23] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1037070 -1200 ) N ;
+ - la_data_in[24] + NET la_data_in[24] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1055010 -1200 ) N ;
+ - la_data_in[25] + NET la_data_in[25] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1072490 -1200 ) N ;
+ - la_data_in[26] + NET la_data_in[26] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1090430 -1200 ) N ;
+ - la_data_in[27] + NET la_data_in[27] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1107910 -1200 ) N ;
+ - la_data_in[28] + NET la_data_in[28] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1125850 -1200 ) N ;
+ - la_data_in[29] + NET la_data_in[29] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1143790 -1200 ) N ;
+ - la_data_in[2] + NET la_data_in[2] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 664930 -1200 ) N ;
+ - la_data_in[30] + NET la_data_in[30] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1161270 -1200 ) N ;
+ - la_data_in[31] + NET la_data_in[31] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1179210 -1200 ) N ;
+ - la_data_in[32] + NET la_data_in[32] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1196690 -1200 ) N ;
+ - la_data_in[33] + NET la_data_in[33] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1214630 -1200 ) N ;
+ - la_data_in[34] + NET la_data_in[34] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1232110 -1200 ) N ;
+ - la_data_in[35] + NET la_data_in[35] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1250050 -1200 ) N ;
+ - la_data_in[36] + NET la_data_in[36] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1267530 -1200 ) N ;
+ - la_data_in[37] + NET la_data_in[37] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1285470 -1200 ) N ;
+ - la_data_in[38] + NET la_data_in[38] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1303410 -1200 ) N ;
+ - la_data_in[39] + NET la_data_in[39] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1320890 -1200 ) N ;
+ - la_data_in[3] + NET la_data_in[3] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 682410 -1200 ) N ;
+ - la_data_in[40] + NET la_data_in[40] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1338830 -1200 ) N ;
+ - la_data_in[41] + NET la_data_in[41] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1356310 -1200 ) N ;
+ - la_data_in[42] + NET la_data_in[42] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1374250 -1200 ) N ;
+ - la_data_in[43] + NET la_data_in[43] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1391730 -1200 ) N ;
+ - la_data_in[44] + NET la_data_in[44] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1409670 -1200 ) N ;
+ - la_data_in[45] + NET la_data_in[45] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1427150 -1200 ) N ;
+ - la_data_in[46] + NET la_data_in[46] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1445090 -1200 ) N ;
+ - la_data_in[47] + NET la_data_in[47] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1463030 -1200 ) N ;
+ - la_data_in[48] + NET la_data_in[48] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1480510 -1200 ) N ;
+ - la_data_in[49] + NET la_data_in[49] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1498450 -1200 ) N ;
+ - la_data_in[4] + NET la_data_in[4] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 700350 -1200 ) N ;
+ - la_data_in[50] + NET la_data_in[50] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1515930 -1200 ) N ;
+ - la_data_in[51] + NET la_data_in[51] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1533870 -1200 ) N ;
+ - la_data_in[52] + NET la_data_in[52] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1551350 -1200 ) N ;
+ - la_data_in[53] + NET la_data_in[53] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1569290 -1200 ) N ;
+ - la_data_in[54] + NET la_data_in[54] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1586770 -1200 ) N ;
+ - la_data_in[55] + NET la_data_in[55] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1604710 -1200 ) N ;
+ - la_data_in[56] + NET la_data_in[56] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1622190 -1200 ) N ;
+ - la_data_in[57] + NET la_data_in[57] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1640130 -1200 ) N ;
+ - la_data_in[58] + NET la_data_in[58] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1658070 -1200 ) N ;
+ - la_data_in[59] + NET la_data_in[59] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1675550 -1200 ) N ;
+ - la_data_in[5] + NET la_data_in[5] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 717830 -1200 ) N ;
+ - la_data_in[60] + NET la_data_in[60] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1693490 -1200 ) N ;
+ - la_data_in[61] + NET la_data_in[61] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1710970 -1200 ) N ;
+ - la_data_in[62] + NET la_data_in[62] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1728910 -1200 ) N ;
+ - la_data_in[63] + NET la_data_in[63] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1746390 -1200 ) N ;
+ - la_data_in[64] + NET la_data_in[64] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1764330 -1200 ) N ;
+ - la_data_in[65] + NET la_data_in[65] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1781810 -1200 ) N ;
+ - la_data_in[66] + NET la_data_in[66] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1799750 -1200 ) N ;
+ - la_data_in[67] + NET la_data_in[67] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1817690 -1200 ) N ;
+ - la_data_in[68] + NET la_data_in[68] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1835170 -1200 ) N ;
+ - la_data_in[69] + NET la_data_in[69] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1853110 -1200 ) N ;
+ - la_data_in[6] + NET la_data_in[6] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 735770 -1200 ) N ;
+ - la_data_in[70] + NET la_data_in[70] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1870590 -1200 ) N ;
+ - la_data_in[71] + NET la_data_in[71] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1888530 -1200 ) N ;
+ - la_data_in[72] + NET la_data_in[72] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1906010 -1200 ) N ;
+ - la_data_in[73] + NET la_data_in[73] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1923950 -1200 ) N ;
+ - la_data_in[74] + NET la_data_in[74] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1941430 -1200 ) N ;
+ - la_data_in[75] + NET la_data_in[75] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1959370 -1200 ) N ;
+ - la_data_in[76] + NET la_data_in[76] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1976850 -1200 ) N ;
+ - la_data_in[77] + NET la_data_in[77] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1994790 -1200 ) N ;
+ - la_data_in[78] + NET la_data_in[78] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2012730 -1200 ) N ;
+ - la_data_in[79] + NET la_data_in[79] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2030210 -1200 ) N ;
+ - la_data_in[7] + NET la_data_in[7] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 753250 -1200 ) N ;
+ - la_data_in[80] + NET la_data_in[80] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2048150 -1200 ) N ;
+ - la_data_in[81] + NET la_data_in[81] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2065630 -1200 ) N ;
+ - la_data_in[82] + NET la_data_in[82] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2083570 -1200 ) N ;
+ - la_data_in[83] + NET la_data_in[83] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2101050 -1200 ) N ;
+ - la_data_in[84] + NET la_data_in[84] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2118990 -1200 ) N ;
+ - la_data_in[85] + NET la_data_in[85] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2136470 -1200 ) N ;
+ - la_data_in[86] + NET la_data_in[86] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2154410 -1200 ) N ;
+ - la_data_in[87] + NET la_data_in[87] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2172350 -1200 ) N ;
+ - la_data_in[88] + NET la_data_in[88] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2189830 -1200 ) N ;
+ - la_data_in[89] + NET la_data_in[89] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2207770 -1200 ) N ;
+ - la_data_in[8] + NET la_data_in[8] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 771190 -1200 ) N ;
+ - la_data_in[90] + NET la_data_in[90] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2225250 -1200 ) N ;
+ - la_data_in[91] + NET la_data_in[91] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2243190 -1200 ) N ;
+ - la_data_in[92] + NET la_data_in[92] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2260670 -1200 ) N ;
+ - la_data_in[93] + NET la_data_in[93] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2278610 -1200 ) N ;
+ - la_data_in[94] + NET la_data_in[94] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2296090 -1200 ) N ;
+ - la_data_in[95] + NET la_data_in[95] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2314030 -1200 ) N ;
+ - la_data_in[96] + NET la_data_in[96] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2331510 -1200 ) N ;
+ - la_data_in[97] + NET la_data_in[97] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2349450 -1200 ) N ;
+ - la_data_in[98] + NET la_data_in[98] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2367390 -1200 ) N ;
+ - la_data_in[99] + NET la_data_in[99] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2384870 -1200 ) N ;
+ - la_data_in[9] + NET la_data_in[9] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 789130 -1200 ) N ;
+ - la_data_out[0] + NET la_data_out[0] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 635030 -1200 ) N ;
+ - la_data_out[100] + NET la_data_out[100] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2408790 -1200 ) N ;
+ - la_data_out[101] + NET la_data_out[101] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2426270 -1200 ) N ;
+ - la_data_out[102] + NET la_data_out[102] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2444210 -1200 ) N ;
+ - la_data_out[103] + NET la_data_out[103] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2461690 -1200 ) N ;
+ - la_data_out[104] + NET la_data_out[104] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2479630 -1200 ) N ;
+ - la_data_out[105] + NET la_data_out[105] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2497110 -1200 ) N ;
+ - la_data_out[106] + NET la_data_out[106] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2515050 -1200 ) N ;
+ - la_data_out[107] + NET la_data_out[107] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2532530 -1200 ) N ;
+ - la_data_out[108] + NET la_data_out[108] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2550470 -1200 ) N ;
+ - la_data_out[109] + NET la_data_out[109] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2567950 -1200 ) N ;
+ - la_data_out[10] + NET la_data_out[10] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 812590 -1200 ) N ;
+ - la_data_out[110] + NET la_data_out[110] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2585890 -1200 ) N ;
+ - la_data_out[111] + NET la_data_out[111] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2603830 -1200 ) N ;
+ - la_data_out[112] + NET la_data_out[112] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2621310 -1200 ) N ;
+ - la_data_out[113] + NET la_data_out[113] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2639250 -1200 ) N ;
+ - la_data_out[114] + NET la_data_out[114] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2656730 -1200 ) N ;
+ - la_data_out[115] + NET la_data_out[115] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2674670 -1200 ) N ;
+ - la_data_out[116] + NET la_data_out[116] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2692150 -1200 ) N ;
+ - la_data_out[117] + NET la_data_out[117] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2710090 -1200 ) N ;
+ - la_data_out[118] + NET la_data_out[118] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2727570 -1200 ) N ;
+ - la_data_out[119] + NET la_data_out[119] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2745510 -1200 ) N ;
+ - la_data_out[11] + NET la_data_out[11] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 830530 -1200 ) N ;
+ - la_data_out[120] + NET la_data_out[120] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2763450 -1200 ) N ;
+ - la_data_out[121] + NET la_data_out[121] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2780930 -1200 ) N ;
+ - la_data_out[122] + NET la_data_out[122] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2798870 -1200 ) N ;
+ - la_data_out[123] + NET la_data_out[123] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2816350 -1200 ) N ;
+ - la_data_out[124] + NET la_data_out[124] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2834290 -1200 ) N ;
+ - la_data_out[125] + NET la_data_out[125] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2851770 -1200 ) N ;
+ - la_data_out[126] + NET la_data_out[126] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2869710 -1200 ) N ;
+ - la_data_out[127] + NET la_data_out[127] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2887190 -1200 ) N ;
+ - la_data_out[12] + NET la_data_out[12] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 848010 -1200 ) N ;
+ - la_data_out[13] + NET la_data_out[13] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 865950 -1200 ) N ;
+ - la_data_out[14] + NET la_data_out[14] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 883430 -1200 ) N ;
+ - la_data_out[15] + NET la_data_out[15] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 901370 -1200 ) N ;
+ - la_data_out[16] + NET la_data_out[16] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 918850 -1200 ) N ;
+ - la_data_out[17] + NET la_data_out[17] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 936790 -1200 ) N ;
+ - la_data_out[18] + NET la_data_out[18] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 954270 -1200 ) N ;
+ - la_data_out[19] + NET la_data_out[19] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 972210 -1200 ) N ;
+ - la_data_out[1] + NET la_data_out[1] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 652970 -1200 ) N ;
+ - la_data_out[20] + NET la_data_out[20] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 989690 -1200 ) N ;
+ - la_data_out[21] + NET la_data_out[21] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1007630 -1200 ) N ;
+ - la_data_out[22] + NET la_data_out[22] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1025570 -1200 ) N ;
+ - la_data_out[23] + NET la_data_out[23] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1043050 -1200 ) N ;
+ - la_data_out[24] + NET la_data_out[24] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1060990 -1200 ) N ;
+ - la_data_out[25] + NET la_data_out[25] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1078470 -1200 ) N ;
+ - la_data_out[26] + NET la_data_out[26] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1096410 -1200 ) N ;
+ - la_data_out[27] + NET la_data_out[27] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1113890 -1200 ) N ;
+ - la_data_out[28] + NET la_data_out[28] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1131830 -1200 ) N ;
+ - la_data_out[29] + NET la_data_out[29] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1149310 -1200 ) N ;
+ - la_data_out[2] + NET la_data_out[2] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 670910 -1200 ) N ;
+ - la_data_out[30] + NET la_data_out[30] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1167250 -1200 ) N ;
+ - la_data_out[31] + NET la_data_out[31] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1185190 -1200 ) N ;
+ - la_data_out[32] + NET la_data_out[32] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1202670 -1200 ) N ;
+ - la_data_out[33] + NET la_data_out[33] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1220610 -1200 ) N ;
+ - la_data_out[34] + NET la_data_out[34] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1238090 -1200 ) N ;
+ - la_data_out[35] + NET la_data_out[35] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1256030 -1200 ) N ;
+ - la_data_out[36] + NET la_data_out[36] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1273510 -1200 ) N ;
+ - la_data_out[37] + NET la_data_out[37] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1291450 -1200 ) N ;
+ - la_data_out[38] + NET la_data_out[38] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1308930 -1200 ) N ;
+ - la_data_out[39] + NET la_data_out[39] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1326870 -1200 ) N ;
+ - la_data_out[3] + NET la_data_out[3] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 688390 -1200 ) N ;
+ - la_data_out[40] + NET la_data_out[40] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1344350 -1200 ) N ;
+ - la_data_out[41] + NET la_data_out[41] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1362290 -1200 ) N ;
+ - la_data_out[42] + NET la_data_out[42] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1380230 -1200 ) N ;
+ - la_data_out[43] + NET la_data_out[43] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1397710 -1200 ) N ;
+ - la_data_out[44] + NET la_data_out[44] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1415650 -1200 ) N ;
+ - la_data_out[45] + NET la_data_out[45] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1433130 -1200 ) N ;
+ - la_data_out[46] + NET la_data_out[46] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1451070 -1200 ) N ;
+ - la_data_out[47] + NET la_data_out[47] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1468550 -1200 ) N ;
+ - la_data_out[48] + NET la_data_out[48] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1486490 -1200 ) N ;
+ - la_data_out[49] + NET la_data_out[49] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1503970 -1200 ) N ;
+ - la_data_out[4] + NET la_data_out[4] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 706330 -1200 ) N ;
+ - la_data_out[50] + NET la_data_out[50] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1521910 -1200 ) N ;
+ - la_data_out[51] + NET la_data_out[51] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1539850 -1200 ) N ;
+ - la_data_out[52] + NET la_data_out[52] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1557330 -1200 ) N ;
+ - la_data_out[53] + NET la_data_out[53] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1575270 -1200 ) N ;
+ - la_data_out[54] + NET la_data_out[54] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1592750 -1200 ) N ;
+ - la_data_out[55] + NET la_data_out[55] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1610690 -1200 ) N ;
+ - la_data_out[56] + NET la_data_out[56] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1628170 -1200 ) N ;
+ - la_data_out[57] + NET la_data_out[57] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1646110 -1200 ) N ;
+ - la_data_out[58] + NET la_data_out[58] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1663590 -1200 ) N ;
+ - la_data_out[59] + NET la_data_out[59] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1681530 -1200 ) N ;
+ - la_data_out[5] + NET la_data_out[5] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 723810 -1200 ) N ;
+ - la_data_out[60] + NET la_data_out[60] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1699470 -1200 ) N ;
+ - la_data_out[61] + NET la_data_out[61] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1716950 -1200 ) N ;
+ - la_data_out[62] + NET la_data_out[62] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1734890 -1200 ) N ;
+ - la_data_out[63] + NET la_data_out[63] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1752370 -1200 ) N ;
+ - la_data_out[64] + NET la_data_out[64] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1770310 -1200 ) N ;
+ - la_data_out[65] + NET la_data_out[65] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1787790 -1200 ) N ;
+ - la_data_out[66] + NET la_data_out[66] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1805730 -1200 ) N ;
+ - la_data_out[67] + NET la_data_out[67] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1823210 -1200 ) N ;
+ - la_data_out[68] + NET la_data_out[68] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1841150 -1200 ) N ;
+ - la_data_out[69] + NET la_data_out[69] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1858630 -1200 ) N ;
+ - la_data_out[6] + NET la_data_out[6] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 741750 -1200 ) N ;
+ - la_data_out[70] + NET la_data_out[70] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1876570 -1200 ) N ;
+ - la_data_out[71] + NET la_data_out[71] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1894510 -1200 ) N ;
+ - la_data_out[72] + NET la_data_out[72] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1911990 -1200 ) N ;
+ - la_data_out[73] + NET la_data_out[73] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1929930 -1200 ) N ;
+ - la_data_out[74] + NET la_data_out[74] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1947410 -1200 ) N ;
+ - la_data_out[75] + NET la_data_out[75] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1965350 -1200 ) N ;
+ - la_data_out[76] + NET la_data_out[76] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1982830 -1200 ) N ;
+ - la_data_out[77] + NET la_data_out[77] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2000770 -1200 ) N ;
+ - la_data_out[78] + NET la_data_out[78] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2018250 -1200 ) N ;
+ - la_data_out[79] + NET la_data_out[79] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2036190 -1200 ) N ;
+ - la_data_out[7] + NET la_data_out[7] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 759230 -1200 ) N ;
+ - la_data_out[80] + NET la_data_out[80] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2054130 -1200 ) N ;
+ - la_data_out[81] + NET la_data_out[81] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2071610 -1200 ) N ;
+ - la_data_out[82] + NET la_data_out[82] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2089550 -1200 ) N ;
+ - la_data_out[83] + NET la_data_out[83] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2107030 -1200 ) N ;
+ - la_data_out[84] + NET la_data_out[84] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2124970 -1200 ) N ;
+ - la_data_out[85] + NET la_data_out[85] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2142450 -1200 ) N ;
+ - la_data_out[86] + NET la_data_out[86] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2160390 -1200 ) N ;
+ - la_data_out[87] + NET la_data_out[87] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2177870 -1200 ) N ;
+ - la_data_out[88] + NET la_data_out[88] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2195810 -1200 ) N ;
+ - la_data_out[89] + NET la_data_out[89] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2213290 -1200 ) N ;
+ - la_data_out[8] + NET la_data_out[8] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 777170 -1200 ) N ;
+ - la_data_out[90] + NET la_data_out[90] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2231230 -1200 ) N ;
+ - la_data_out[91] + NET la_data_out[91] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2249170 -1200 ) N ;
+ - la_data_out[92] + NET la_data_out[92] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2266650 -1200 ) N ;
+ - la_data_out[93] + NET la_data_out[93] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2284590 -1200 ) N ;
+ - la_data_out[94] + NET la_data_out[94] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2302070 -1200 ) N ;
+ - la_data_out[95] + NET la_data_out[95] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2320010 -1200 ) N ;
+ - la_data_out[96] + NET la_data_out[96] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2337490 -1200 ) N ;
+ - la_data_out[97] + NET la_data_out[97] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2355430 -1200 ) N ;
+ - la_data_out[98] + NET la_data_out[98] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2372910 -1200 ) N ;
+ - la_data_out[99] + NET la_data_out[99] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2390850 -1200 ) N ;
+ - la_data_out[9] + NET la_data_out[9] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 794650 -1200 ) N ;
+ - la_oenb[0] + NET la_oenb[0] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 641010 -1200 ) N ;
+ - la_oenb[100] + NET la_oenb[100] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2414310 -1200 ) N ;
+ - la_oenb[101] + NET la_oenb[101] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2432250 -1200 ) N ;
+ - la_oenb[102] + NET la_oenb[102] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2449730 -1200 ) N ;
+ - la_oenb[103] + NET la_oenb[103] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2467670 -1200 ) N ;
+ - la_oenb[104] + NET la_oenb[104] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2485610 -1200 ) N ;
+ - la_oenb[105] + NET la_oenb[105] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2503090 -1200 ) N ;
+ - la_oenb[106] + NET la_oenb[106] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2521030 -1200 ) N ;
+ - la_oenb[107] + NET la_oenb[107] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2538510 -1200 ) N ;
+ - la_oenb[108] + NET la_oenb[108] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2556450 -1200 ) N ;
+ - la_oenb[109] + NET la_oenb[109] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2573930 -1200 ) N ;
+ - la_oenb[10] + NET la_oenb[10] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 818570 -1200 ) N ;
+ - la_oenb[110] + NET la_oenb[110] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2591870 -1200 ) N ;
+ - la_oenb[111] + NET la_oenb[111] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2609350 -1200 ) N ;
+ - la_oenb[112] + NET la_oenb[112] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2627290 -1200 ) N ;
+ - la_oenb[113] + NET la_oenb[113] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2645230 -1200 ) N ;
+ - la_oenb[114] + NET la_oenb[114] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2662710 -1200 ) N ;
+ - la_oenb[115] + NET la_oenb[115] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2680650 -1200 ) N ;
+ - la_oenb[116] + NET la_oenb[116] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2698130 -1200 ) N ;
+ - la_oenb[117] + NET la_oenb[117] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2716070 -1200 ) N ;
+ - la_oenb[118] + NET la_oenb[118] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2733550 -1200 ) N ;
+ - la_oenb[119] + NET la_oenb[119] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2751490 -1200 ) N ;
+ - la_oenb[11] + NET la_oenb[11] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 836050 -1200 ) N ;
+ - la_oenb[120] + NET la_oenb[120] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2768970 -1200 ) N ;
+ - la_oenb[121] + NET la_oenb[121] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2786910 -1200 ) N ;
+ - la_oenb[122] + NET la_oenb[122] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2804390 -1200 ) N ;
+ - la_oenb[123] + NET la_oenb[123] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2822330 -1200 ) N ;
+ - la_oenb[124] + NET la_oenb[124] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2840270 -1200 ) N ;
+ - la_oenb[125] + NET la_oenb[125] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2857750 -1200 ) N ;
+ - la_oenb[126] + NET la_oenb[126] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2875690 -1200 ) N ;
+ - la_oenb[127] + NET la_oenb[127] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2893170 -1200 ) N ;
+ - la_oenb[12] + NET la_oenb[12] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 853990 -1200 ) N ;
+ - la_oenb[13] + NET la_oenb[13] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 871470 -1200 ) N ;
+ - la_oenb[14] + NET la_oenb[14] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 889410 -1200 ) N ;
+ - la_oenb[15] + NET la_oenb[15] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 907350 -1200 ) N ;
+ - la_oenb[16] + NET la_oenb[16] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 924830 -1200 ) N ;
+ - la_oenb[17] + NET la_oenb[17] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 942770 -1200 ) N ;
+ - la_oenb[18] + NET la_oenb[18] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 960250 -1200 ) N ;
+ - la_oenb[19] + NET la_oenb[19] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 978190 -1200 ) N ;
+ - la_oenb[1] + NET la_oenb[1] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 658950 -1200 ) N ;
+ - la_oenb[20] + NET la_oenb[20] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 995670 -1200 ) N ;
+ - la_oenb[21] + NET la_oenb[21] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1013610 -1200 ) N ;
+ - la_oenb[22] + NET la_oenb[22] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1031090 -1200 ) N ;
+ - la_oenb[23] + NET la_oenb[23] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1049030 -1200 ) N ;
+ - la_oenb[24] + NET la_oenb[24] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1066970 -1200 ) N ;
+ - la_oenb[25] + NET la_oenb[25] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1084450 -1200 ) N ;
+ - la_oenb[26] + NET la_oenb[26] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1102390 -1200 ) N ;
+ - la_oenb[27] + NET la_oenb[27] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1119870 -1200 ) N ;
+ - la_oenb[28] + NET la_oenb[28] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1137810 -1200 ) N ;
+ - la_oenb[29] + NET la_oenb[29] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1155290 -1200 ) N ;
+ - la_oenb[2] + NET la_oenb[2] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 676430 -1200 ) N ;
+ - la_oenb[30] + NET la_oenb[30] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1173230 -1200 ) N ;
+ - la_oenb[31] + NET la_oenb[31] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1190710 -1200 ) N ;
+ - la_oenb[32] + NET la_oenb[32] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1208650 -1200 ) N ;
+ - la_oenb[33] + NET la_oenb[33] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1226130 -1200 ) N ;
+ - la_oenb[34] + NET la_oenb[34] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1244070 -1200 ) N ;
+ - la_oenb[35] + NET la_oenb[35] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1262010 -1200 ) N ;
+ - la_oenb[36] + NET la_oenb[36] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1279490 -1200 ) N ;
+ - la_oenb[37] + NET la_oenb[37] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1297430 -1200 ) N ;
+ - la_oenb[38] + NET la_oenb[38] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1314910 -1200 ) N ;
+ - la_oenb[39] + NET la_oenb[39] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1332850 -1200 ) N ;
+ - la_oenb[3] + NET la_oenb[3] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 694370 -1200 ) N ;
+ - la_oenb[40] + NET la_oenb[40] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1350330 -1200 ) N ;
+ - la_oenb[41] + NET la_oenb[41] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1368270 -1200 ) N ;
+ - la_oenb[42] + NET la_oenb[42] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1385750 -1200 ) N ;
+ - la_oenb[43] + NET la_oenb[43] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1403690 -1200 ) N ;
+ - la_oenb[44] + NET la_oenb[44] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1421630 -1200 ) N ;
+ - la_oenb[45] + NET la_oenb[45] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1439110 -1200 ) N ;
+ - la_oenb[46] + NET la_oenb[46] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1457050 -1200 ) N ;
+ - la_oenb[47] + NET la_oenb[47] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1474530 -1200 ) N ;
+ - la_oenb[48] + NET la_oenb[48] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1492470 -1200 ) N ;
+ - la_oenb[49] + NET la_oenb[49] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1509950 -1200 ) N ;
+ - la_oenb[4] + NET la_oenb[4] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 712310 -1200 ) N ;
+ - la_oenb[50] + NET la_oenb[50] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1527890 -1200 ) N ;
+ - la_oenb[51] + NET la_oenb[51] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1545370 -1200 ) N ;
+ - la_oenb[52] + NET la_oenb[52] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1563310 -1200 ) N ;
+ - la_oenb[53] + NET la_oenb[53] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1581250 -1200 ) N ;
+ - la_oenb[54] + NET la_oenb[54] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1598730 -1200 ) N ;
+ - la_oenb[55] + NET la_oenb[55] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1616670 -1200 ) N ;
+ - la_oenb[56] + NET la_oenb[56] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1634150 -1200 ) N ;
+ - la_oenb[57] + NET la_oenb[57] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1652090 -1200 ) N ;
+ - la_oenb[58] + NET la_oenb[58] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1669570 -1200 ) N ;
+ - la_oenb[59] + NET la_oenb[59] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1687510 -1200 ) N ;
+ - la_oenb[5] + NET la_oenb[5] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 729790 -1200 ) N ;
+ - la_oenb[60] + NET la_oenb[60] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1704990 -1200 ) N ;
+ - la_oenb[61] + NET la_oenb[61] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1722930 -1200 ) N ;
+ - la_oenb[62] + NET la_oenb[62] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1740410 -1200 ) N ;
+ - la_oenb[63] + NET la_oenb[63] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1758350 -1200 ) N ;
+ - la_oenb[64] + NET la_oenb[64] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1776290 -1200 ) N ;
+ - la_oenb[65] + NET la_oenb[65] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1793770 -1200 ) N ;
+ - la_oenb[66] + NET la_oenb[66] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1811710 -1200 ) N ;
+ - la_oenb[67] + NET la_oenb[67] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1829190 -1200 ) N ;
+ - la_oenb[68] + NET la_oenb[68] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1847130 -1200 ) N ;
+ - la_oenb[69] + NET la_oenb[69] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1864610 -1200 ) N ;
+ - la_oenb[6] + NET la_oenb[6] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 747730 -1200 ) N ;
+ - la_oenb[70] + NET la_oenb[70] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1882550 -1200 ) N ;
+ - la_oenb[71] + NET la_oenb[71] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1900030 -1200 ) N ;
+ - la_oenb[72] + NET la_oenb[72] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1917970 -1200 ) N ;
+ - la_oenb[73] + NET la_oenb[73] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1935910 -1200 ) N ;
+ - la_oenb[74] + NET la_oenb[74] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1953390 -1200 ) N ;
+ - la_oenb[75] + NET la_oenb[75] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1971330 -1200 ) N ;
+ - la_oenb[76] + NET la_oenb[76] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 1988810 -1200 ) N ;
+ - la_oenb[77] + NET la_oenb[77] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2006750 -1200 ) N ;
+ - la_oenb[78] + NET la_oenb[78] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2024230 -1200 ) N ;
+ - la_oenb[79] + NET la_oenb[79] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2042170 -1200 ) N ;
+ - la_oenb[7] + NET la_oenb[7] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 765210 -1200 ) N ;
+ - la_oenb[80] + NET la_oenb[80] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2059650 -1200 ) N ;
+ - la_oenb[81] + NET la_oenb[81] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2077590 -1200 ) N ;
+ - la_oenb[82] + NET la_oenb[82] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2095070 -1200 ) N ;
+ - la_oenb[83] + NET la_oenb[83] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2113010 -1200 ) N ;
+ - la_oenb[84] + NET la_oenb[84] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2130950 -1200 ) N ;
+ - la_oenb[85] + NET la_oenb[85] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2148430 -1200 ) N ;
+ - la_oenb[86] + NET la_oenb[86] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2166370 -1200 ) N ;
+ - la_oenb[87] + NET la_oenb[87] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2183850 -1200 ) N ;
+ - la_oenb[88] + NET la_oenb[88] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2201790 -1200 ) N ;
+ - la_oenb[89] + NET la_oenb[89] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2219270 -1200 ) N ;
+ - la_oenb[8] + NET la_oenb[8] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 783150 -1200 ) N ;
+ - la_oenb[90] + NET la_oenb[90] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2237210 -1200 ) N ;
+ - la_oenb[91] + NET la_oenb[91] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2254690 -1200 ) N ;
+ - la_oenb[92] + NET la_oenb[92] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2272630 -1200 ) N ;
+ - la_oenb[93] + NET la_oenb[93] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2290570 -1200 ) N ;
+ - la_oenb[94] + NET la_oenb[94] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2308050 -1200 ) N ;
+ - la_oenb[95] + NET la_oenb[95] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2325990 -1200 ) N ;
+ - la_oenb[96] + NET la_oenb[96] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2343470 -1200 ) N ;
+ - la_oenb[97] + NET la_oenb[97] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2361410 -1200 ) N ;
+ - la_oenb[98] + NET la_oenb[98] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2378890 -1200 ) N ;
+ - la_oenb[99] + NET la_oenb[99] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2396830 -1200 ) N ;
+ - la_oenb[9] + NET la_oenb[9] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 800630 -1200 ) N ;
+ - user_clock2 + NET user_clock2 + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2899150 -1200 ) N ;
+ - user_irq[0] + NET user_irq[0] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2905130 -1200 ) N ;
+ - user_irq[1] + NET user_irq[1] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2911110 -1200 ) N ;
+ - user_irq[2] + NET user_irq[2] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2917090 -1200 ) N ;
+ - vccd1 + NET vccd1 + SPECIAL + DIRECTION INPUT + USE POWER
+ + PORT
+ + LAYER met4 ( -1550 -1769310 ) ( 1550 1769310 )
+ + LAYER met4 ( -181550 -1769310 ) ( -178450 1769310 )
+ + LAYER met4 ( -361550 -1769310 ) ( -358450 1769310 )
+ + LAYER met4 ( -541550 -1769310 ) ( -538450 1769310 )
+ + LAYER met4 ( -721550 -1769310 ) ( -718450 1769310 )
+ + LAYER met4 ( -901550 540160 ) ( -898450 1769310 )
+ + LAYER met4 ( -1081550 540160 ) ( -1078450 1769310 )
+ + LAYER met4 ( -1261550 540160 ) ( -1258450 1769310 )
+ + LAYER met4 ( -1441550 540160 ) ( -1438450 1769310 )
+ + LAYER met4 ( -1621550 540160 ) ( -1618450 1769310 )
+ + LAYER met4 ( -1801550 -1769310 ) ( -1798450 1769310 )
+ + LAYER met4 ( -1981550 -1769310 ) ( -1978450 1769310 )
+ + LAYER met4 ( -2161550 -1769310 ) ( -2158450 1769310 )
+ + LAYER met4 ( -2341550 -1769310 ) ( -2338450 1769310 )
+ + LAYER met4 ( -2521550 -1769310 ) ( -2518450 1769310 )
+ + LAYER met4 ( -2701550 -1769310 ) ( -2698450 1769310 )
+ + LAYER met4 ( -2881550 -1769310 ) ( -2878450 1769310 )
+ + LAYER met4 ( 36030 -1764510 ) ( 39130 1764510 )
+ + LAYER met4 ( -2900550 -1764510 ) ( -2897450 1764510 )
+ + LAYER met4 ( -901550 -1769310 ) ( -898450 -79840 )
+ + LAYER met4 ( -1081550 -1769310 ) ( -1078450 -79840 )
+ + LAYER met4 ( -1261550 -1769310 ) ( -1258450 -79840 )
+ + LAYER met4 ( -1441550 -1769310 ) ( -1438450 -79840 )
+ + LAYER met4 ( -1621550 -1769310 ) ( -1618450 -79840 )
+ + LAYER met5 ( -2900550 1761410 ) ( 39130 1764510 )
+ + LAYER met5 ( -2905350 1674490 ) ( 43930 1677590 )
+ + LAYER met5 ( -2905350 1494490 ) ( 43930 1497590 )
+ + LAYER met5 ( -2905350 1314490 ) ( 43930 1317590 )
+ + LAYER met5 ( -2905350 1134490 ) ( 43930 1137590 )
+ + LAYER met5 ( -2905350 954490 ) ( 43930 957590 )
+ + LAYER met5 ( -2905350 774490 ) ( 43930 777590 )
+ + LAYER met5 ( -2905350 594490 ) ( 43930 597590 )
+ + LAYER met5 ( -2905350 414490 ) ( 43930 417590 )
+ + LAYER met5 ( -2905350 234490 ) ( 43930 237590 )
+ + LAYER met5 ( -2905350 54490 ) ( 43930 57590 )
+ + LAYER met5 ( -2905350 -125510 ) ( 43930 -122410 )
+ + LAYER met5 ( -2905350 -305510 ) ( 43930 -302410 )
+ + LAYER met5 ( -2905350 -485510 ) ( 43930 -482410 )
+ + LAYER met5 ( -2905350 -665510 ) ( 43930 -662410 )
+ + LAYER met5 ( -2905350 -845510 ) ( 43930 -842410 )
+ + LAYER met5 ( -2905350 -1025510 ) ( 43930 -1022410 )
+ + LAYER met5 ( -2905350 -1205510 ) ( 43930 -1202410 )
+ + LAYER met5 ( -2905350 -1385510 ) ( 43930 -1382410 )
+ + LAYER met5 ( -2905350 -1565510 ) ( 43930 -1562410 )
+ + LAYER met5 ( -2905350 -1745510 ) ( 43930 -1742410 )
+ + LAYER met5 ( -2900550 -1764510 ) ( 39130 -1761410 )
+ + FIXED ( 2890520 1759840 ) N ;
+ - vccd2 + NET vccd2 + SPECIAL + DIRECTION INPUT + USE POWER
+ + PORT
+ + LAYER met4 ( -1550 -1778910 ) ( 1550 1778910 )
+ + LAYER met4 ( -181550 -1778910 ) ( -178450 1778910 )
+ + LAYER met4 ( -361550 -1778910 ) ( -358450 1778910 )
+ + LAYER met4 ( -541550 -1778910 ) ( -538450 1778910 )
+ + LAYER met4 ( -721550 -1778910 ) ( -718450 1778910 )
+ + LAYER met4 ( -901550 540160 ) ( -898450 1778910 )
+ + LAYER met4 ( -1081550 540160 ) ( -1078450 1778910 )
+ + LAYER met4 ( -1261550 540160 ) ( -1258450 1778910 )
+ + LAYER met4 ( -1441550 540160 ) ( -1438450 1778910 )
+ + LAYER met4 ( -1621550 540160 ) ( -1618450 1778910 )
+ + LAYER met4 ( -1801550 -1778910 ) ( -1798450 1778910 )
+ + LAYER met4 ( -1981550 -1778910 ) ( -1978450 1778910 )
+ + LAYER met4 ( -2161550 -1778910 ) ( -2158450 1778910 )
+ + LAYER met4 ( -2341550 -1778910 ) ( -2338450 1778910 )
+ + LAYER met4 ( -2521550 -1778910 ) ( -2518450 1778910 )
+ + LAYER met4 ( -2701550 -1778910 ) ( -2698450 1778910 )
+ + LAYER met4 ( -2881550 -1778910 ) ( -2878450 1778910 )
+ + LAYER met4 ( 27030 -1774110 ) ( 30130 1774110 )
+ + LAYER met4 ( -2928750 -1774110 ) ( -2925650 1774110 )
+ + LAYER met4 ( -901550 -1778910 ) ( -898450 -79840 )
+ + LAYER met4 ( -1081550 -1778910 ) ( -1078450 -79840 )
+ + LAYER met4 ( -1261550 -1778910 ) ( -1258450 -79840 )
+ + LAYER met4 ( -1441550 -1778910 ) ( -1438450 -79840 )
+ + LAYER met4 ( -1621550 -1778910 ) ( -1618450 -79840 )
+ + LAYER met5 ( -2928750 1771010 ) ( 30130 1774110 )
+ + LAYER met5 ( -2933550 1693090 ) ( 34930 1696190 )
+ + LAYER met5 ( -2933550 1513090 ) ( 34930 1516190 )
+ + LAYER met5 ( -2933550 1333090 ) ( 34930 1336190 )
+ + LAYER met5 ( -2933550 1153090 ) ( 34930 1156190 )
+ + LAYER met5 ( -2933550 973090 ) ( 34930 976190 )
+ + LAYER met5 ( -2933550 793090 ) ( 34930 796190 )
+ + LAYER met5 ( -2933550 613090 ) ( 34930 616190 )
+ + LAYER met5 ( -2933550 433090 ) ( 34930 436190 )
+ + LAYER met5 ( -2933550 253090 ) ( 34930 256190 )
+ + LAYER met5 ( -2933550 73090 ) ( 34930 76190 )
+ + LAYER met5 ( -2933550 -106910 ) ( 34930 -103810 )
+ + LAYER met5 ( -2933550 -286910 ) ( 34930 -283810 )
+ + LAYER met5 ( -2933550 -466910 ) ( 34930 -463810 )
+ + LAYER met5 ( -2933550 -646910 ) ( 34930 -643810 )
+ + LAYER met5 ( -2933550 -826910 ) ( 34930 -823810 )
+ + LAYER met5 ( -2933550 -1006910 ) ( 34930 -1003810 )
+ + LAYER met5 ( -2933550 -1186910 ) ( 34930 -1183810 )
+ + LAYER met5 ( -2933550 -1366910 ) ( 34930 -1363810 )
+ + LAYER met5 ( -2933550 -1546910 ) ( 34930 -1543810 )
+ + LAYER met5 ( -2933550 -1726910 ) ( 34930 -1723810 )
+ + LAYER met5 ( -2928750 -1774110 ) ( 30130 -1771010 )
+ + FIXED ( 2909120 1759840 ) N ;
+ - vdda1 + NET vdda1 + SPECIAL + DIRECTION INPUT + USE POWER
+ + PORT
+ + LAYER met4 ( -1550 -1788510 ) ( 1550 1788510 )
+ + LAYER met4 ( -181550 -1788510 ) ( -178450 1788510 )
+ + LAYER met4 ( -361550 -1788510 ) ( -358450 1788510 )
+ + LAYER met4 ( -541550 -1788510 ) ( -538450 1788510 )
+ + LAYER met4 ( -721550 540160 ) ( -718450 1788510 )
+ + LAYER met4 ( -901550 540160 ) ( -898450 1788510 )
+ + LAYER met4 ( -1081550 540160 ) ( -1078450 1788510 )
+ + LAYER met4 ( -1261550 540160 ) ( -1258450 1788510 )
+ + LAYER met4 ( -1441550 540160 ) ( -1438450 1788510 )
+ + LAYER met4 ( -1621550 -1788510 ) ( -1618450 1788510 )
+ + LAYER met4 ( -1801550 -1788510 ) ( -1798450 1788510 )
+ + LAYER met4 ( -1981550 -1788510 ) ( -1978450 1788510 )
+ + LAYER met4 ( -2161550 -1788510 ) ( -2158450 1788510 )
+ + LAYER met4 ( -2341550 -1788510 ) ( -2338450 1788510 )
+ + LAYER met4 ( -2521550 -1788510 ) ( -2518450 1788510 )
+ + LAYER met4 ( -2701550 -1788510 ) ( -2698450 1788510 )
+ + LAYER met4 ( 198030 -1783710 ) ( 201130 1783710 )
+ + LAYER met4 ( -2776950 -1783710 ) ( -2773850 1783710 )
+ + LAYER met4 ( -721550 -1788510 ) ( -718450 -79840 )
+ + LAYER met4 ( -901550 -1788510 ) ( -898450 -79840 )
+ + LAYER met4 ( -1081550 -1788510 ) ( -1078450 -79840 )
+ + LAYER met4 ( -1261550 -1788510 ) ( -1258450 -79840 )
+ + LAYER met4 ( -1441550 -1788510 ) ( -1438450 -79840 )
+ + LAYER met5 ( -2776950 1780610 ) ( 201130 1783710 )
+ + LAYER met5 ( -2781750 1711690 ) ( 205930 1714790 )
+ + LAYER met5 ( -2781750 1531690 ) ( 205930 1534790 )
+ + LAYER met5 ( -2781750 1351690 ) ( 205930 1354790 )
+ + LAYER met5 ( -2781750 1171690 ) ( 205930 1174790 )
+ + LAYER met5 ( -2781750 991690 ) ( 205930 994790 )
+ + LAYER met5 ( -2781750 811690 ) ( 205930 814790 )
+ + LAYER met5 ( -2781750 631690 ) ( 205930 634790 )
+ + LAYER met5 ( -2781750 451690 ) ( 205930 454790 )
+ + LAYER met5 ( -2781750 271690 ) ( 205930 274790 )
+ + LAYER met5 ( -2781750 91690 ) ( 205930 94790 )
+ + LAYER met5 ( -2781750 -88310 ) ( 205930 -85210 )
+ + LAYER met5 ( -2781750 -268310 ) ( 205930 -265210 )
+ + LAYER met5 ( -2781750 -448310 ) ( 205930 -445210 )
+ + LAYER met5 ( -2781750 -628310 ) ( 205930 -625210 )
+ + LAYER met5 ( -2781750 -808310 ) ( 205930 -805210 )
+ + LAYER met5 ( -2781750 -988310 ) ( 205930 -985210 )
+ + LAYER met5 ( -2781750 -1168310 ) ( 205930 -1165210 )
+ + LAYER met5 ( -2781750 -1348310 ) ( 205930 -1345210 )
+ + LAYER met5 ( -2781750 -1528310 ) ( 205930 -1525210 )
+ + LAYER met5 ( -2781750 -1708310 ) ( 205930 -1705210 )
+ + LAYER met5 ( -2776950 -1783710 ) ( 201130 -1780610 )
+ + FIXED ( 2747720 1759840 ) N ;
+ - vdda2 + NET vdda2 + SPECIAL + DIRECTION INPUT + USE POWER
+ + PORT
+ + LAYER met4 ( -1550 -1798110 ) ( 1550 1798110 )
+ + LAYER met4 ( -181550 -1798110 ) ( -178450 1798110 )
+ + LAYER met4 ( -361550 -1798110 ) ( -358450 1798110 )
+ + LAYER met4 ( -541550 -1798110 ) ( -538450 1798110 )
+ + LAYER met4 ( -721550 540160 ) ( -718450 1798110 )
+ + LAYER met4 ( -901550 540160 ) ( -898450 1798110 )
+ + LAYER met4 ( -1081550 540160 ) ( -1078450 1798110 )
+ + LAYER met4 ( -1261550 540160 ) ( -1258450 1798110 )
+ + LAYER met4 ( -1441550 540160 ) ( -1438450 1798110 )
+ + LAYER met4 ( -1621550 -1798110 ) ( -1618450 1798110 )
+ + LAYER met4 ( -1801550 -1798110 ) ( -1798450 1798110 )
+ + LAYER met4 ( -1981550 -1798110 ) ( -1978450 1798110 )
+ + LAYER met4 ( -2161550 -1798110 ) ( -2158450 1798110 )
+ + LAYER met4 ( -2341550 -1798110 ) ( -2338450 1798110 )
+ + LAYER met4 ( -2521550 -1798110 ) ( -2518450 1798110 )
+ + LAYER met4 ( -2701550 -1798110 ) ( -2698450 1798110 )
+ + LAYER met4 ( 189030 -1793310 ) ( 192130 1793310 )
+ + LAYER met4 ( -2805150 -1793310 ) ( -2802050 1793310 )
+ + LAYER met4 ( -721550 -1798110 ) ( -718450 -79840 )
+ + LAYER met4 ( -901550 -1798110 ) ( -898450 -79840 )
+ + LAYER met4 ( -1081550 -1798110 ) ( -1078450 -79840 )
+ + LAYER met4 ( -1261550 -1798110 ) ( -1258450 -79840 )
+ + LAYER met4 ( -1441550 -1798110 ) ( -1438450 -79840 )
+ + LAYER met5 ( -2805150 1790210 ) ( 192130 1793310 )
+ + LAYER met5 ( -2809950 1730290 ) ( 196930 1733390 )
+ + LAYER met5 ( -2809950 1550290 ) ( 196930 1553390 )
+ + LAYER met5 ( -2809950 1370290 ) ( 196930 1373390 )
+ + LAYER met5 ( -2809950 1190290 ) ( 196930 1193390 )
+ + LAYER met5 ( -2809950 1010290 ) ( 196930 1013390 )
+ + LAYER met5 ( -2809950 830290 ) ( 196930 833390 )
+ + LAYER met5 ( -2809950 650290 ) ( 196930 653390 )
+ + LAYER met5 ( -2809950 470290 ) ( 196930 473390 )
+ + LAYER met5 ( -2809950 290290 ) ( 196930 293390 )
+ + LAYER met5 ( -2809950 110290 ) ( 196930 113390 )
+ + LAYER met5 ( -2809950 -69710 ) ( 196930 -66610 )
+ + LAYER met5 ( -2809950 -249710 ) ( 196930 -246610 )
+ + LAYER met5 ( -2809950 -429710 ) ( 196930 -426610 )
+ + LAYER met5 ( -2809950 -609710 ) ( 196930 -606610 )
+ + LAYER met5 ( -2809950 -789710 ) ( 196930 -786610 )
+ + LAYER met5 ( -2809950 -969710 ) ( 196930 -966610 )
+ + LAYER met5 ( -2809950 -1149710 ) ( 196930 -1146610 )
+ + LAYER met5 ( -2809950 -1329710 ) ( 196930 -1326610 )
+ + LAYER met5 ( -2809950 -1509710 ) ( 196930 -1506610 )
+ + LAYER met5 ( -2809950 -1689710 ) ( 196930 -1686610 )
+ + LAYER met5 ( -2805150 -1793310 ) ( 192130 -1790210 )
+ + FIXED ( 2766320 1759840 ) N ;
+ - vssa1 + NET vssa1 + SPECIAL + DIRECTION INPUT + USE GROUND
+ + PORT
+ + LAYER met4 ( -1550 -1788510 ) ( 1550 1788510 )
+ + LAYER met4 ( -115930 -1788510 ) ( -112830 1788510 )
+ + LAYER met4 ( -295930 -1788510 ) ( -292830 1788510 )
+ + LAYER met4 ( -475930 -1788510 ) ( -472830 1788510 )
+ + LAYER met4 ( -655930 -1788510 ) ( -652830 1788510 )
+ + LAYER met4 ( -835930 -1788510 ) ( -832830 1788510 )
+ + LAYER met4 ( -1015930 540160 ) ( -1012830 1788510 )
+ + LAYER met4 ( -1195930 540160 ) ( -1192830 1788510 )
+ + LAYER met4 ( -1375930 540160 ) ( -1372830 1788510 )
+ + LAYER met4 ( -1555930 540160 ) ( -1552830 1788510 )
+ + LAYER met4 ( -1735930 540160 ) ( -1732830 1788510 )
+ + LAYER met4 ( -1915930 -1788510 ) ( -1912830 1788510 )
+ + LAYER met4 ( -2095930 -1788510 ) ( -2092830 1788510 )
+ + LAYER met4 ( -2275930 -1788510 ) ( -2272830 1788510 )
+ + LAYER met4 ( -2455930 -1788510 ) ( -2452830 1788510 )
+ + LAYER met4 ( -2635930 -1788510 ) ( -2632830 1788510 )
+ + LAYER met4 ( -2815930 -1788510 ) ( -2812830 1788510 )
+ + LAYER met4 ( -2986130 -1788510 ) ( -2983030 1788510 )
+ + LAYER met4 ( -1015930 -1788510 ) ( -1012830 -79840 )
+ + LAYER met4 ( -1195930 -1788510 ) ( -1192830 -79840 )
+ + LAYER met4 ( -1375930 -1788510 ) ( -1372830 -79840 )
+ + LAYER met4 ( -1555930 -1788510 ) ( -1552830 -79840 )
+ + LAYER met4 ( -1735930 -1788510 ) ( -1732830 -79840 )
+ + LAYER met5 ( -2986130 1785410 ) ( 1550 1788510 )
+ + LAYER met5 ( -2986130 1621690 ) ( 1550 1624790 )
+ + LAYER met5 ( -2986130 1441690 ) ( 1550 1444790 )
+ + LAYER met5 ( -2986130 1261690 ) ( 1550 1264790 )
+ + LAYER met5 ( -2986130 1081690 ) ( 1550 1084790 )
+ + LAYER met5 ( -2986130 901690 ) ( 1550 904790 )
+ + LAYER met5 ( -2986130 721690 ) ( 1550 724790 )
+ + LAYER met5 ( -2986130 541690 ) ( 1550 544790 )
+ + LAYER met5 ( -2986130 361690 ) ( 1550 364790 )
+ + LAYER met5 ( -2986130 181690 ) ( 1550 184790 )
+ + LAYER met5 ( -2986130 1690 ) ( 1550 4790 )
+ + LAYER met5 ( -2986130 -178310 ) ( 1550 -175210 )
+ + LAYER met5 ( -2986130 -358310 ) ( 1550 -355210 )
+ + LAYER met5 ( -2986130 -538310 ) ( 1550 -535210 )
+ + LAYER met5 ( -2986130 -718310 ) ( 1550 -715210 )
+ + LAYER met5 ( -2986130 -898310 ) ( 1550 -895210 )
+ + LAYER met5 ( -2986130 -1078310 ) ( 1550 -1075210 )
+ + LAYER met5 ( -2986130 -1258310 ) ( 1550 -1255210 )
+ + LAYER met5 ( -2986130 -1438310 ) ( 1550 -1435210 )
+ + LAYER met5 ( -2986130 -1618310 ) ( 1550 -1615210 )
+ + LAYER met5 ( -2986130 -1788510 ) ( 1550 -1785410 )
+ + FIXED ( 2952100 1759840 ) N ;
+ - vssa2 + NET vssa2 + SPECIAL + DIRECTION INPUT + USE GROUND
+ + PORT
+ + LAYER met4 ( -1550 -1798110 ) ( 1550 1798110 )
+ + LAYER met4 ( -106930 -1798110 ) ( -103830 1798110 )
+ + LAYER met4 ( -286930 -1798110 ) ( -283830 1798110 )
+ + LAYER met4 ( -466930 -1798110 ) ( -463830 1798110 )
+ + LAYER met4 ( -646930 -1798110 ) ( -643830 1798110 )
+ + LAYER met4 ( -826930 -1798110 ) ( -823830 1798110 )
+ + LAYER met4 ( -1006930 540160 ) ( -1003830 1798110 )
+ + LAYER met4 ( -1186930 540160 ) ( -1183830 1798110 )
+ + LAYER met4 ( -1366930 540160 ) ( -1363830 1798110 )
+ + LAYER met4 ( -1546930 540160 ) ( -1543830 1798110 )
+ + LAYER met4 ( -1726930 540160 ) ( -1723830 1798110 )
+ + LAYER met4 ( -1906930 -1798110 ) ( -1903830 1798110 )
+ + LAYER met4 ( -2086930 -1798110 ) ( -2083830 1798110 )
+ + LAYER met4 ( -2266930 -1798110 ) ( -2263830 1798110 )
+ + LAYER met4 ( -2446930 -1798110 ) ( -2443830 1798110 )
+ + LAYER met4 ( -2626930 -1798110 ) ( -2623830 1798110 )
+ + LAYER met4 ( -2806930 -1798110 ) ( -2803830 1798110 )
+ + LAYER met4 ( -3005330 -1798110 ) ( -3002230 1798110 )
+ + LAYER met4 ( -1006930 -1798110 ) ( -1003830 -79840 )
+ + LAYER met4 ( -1186930 -1798110 ) ( -1183830 -79840 )
+ + LAYER met4 ( -1366930 -1798110 ) ( -1363830 -79840 )
+ + LAYER met4 ( -1546930 -1798110 ) ( -1543830 -79840 )
+ + LAYER met4 ( -1726930 -1798110 ) ( -1723830 -79840 )
+ + LAYER met5 ( -3005330 1795010 ) ( 1550 1798110 )
+ + LAYER met5 ( -3005330 1640290 ) ( 1550 1643390 )
+ + LAYER met5 ( -3005330 1460290 ) ( 1550 1463390 )
+ + LAYER met5 ( -3005330 1280290 ) ( 1550 1283390 )
+ + LAYER met5 ( -3005330 1100290 ) ( 1550 1103390 )
+ + LAYER met5 ( -3005330 920290 ) ( 1550 923390 )
+ + LAYER met5 ( -3005330 740290 ) ( 1550 743390 )
+ + LAYER met5 ( -3005330 560290 ) ( 1550 563390 )
+ + LAYER met5 ( -3005330 380290 ) ( 1550 383390 )
+ + LAYER met5 ( -3005330 200290 ) ( 1550 203390 )
+ + LAYER met5 ( -3005330 20290 ) ( 1550 23390 )
+ + LAYER met5 ( -3005330 -159710 ) ( 1550 -156610 )
+ + LAYER met5 ( -3005330 -339710 ) ( 1550 -336610 )
+ + LAYER met5 ( -3005330 -519710 ) ( 1550 -516610 )
+ + LAYER met5 ( -3005330 -699710 ) ( 1550 -696610 )
+ + LAYER met5 ( -3005330 -879710 ) ( 1550 -876610 )
+ + LAYER met5 ( -3005330 -1059710 ) ( 1550 -1056610 )
+ + LAYER met5 ( -3005330 -1239710 ) ( 1550 -1236610 )
+ + LAYER met5 ( -3005330 -1419710 ) ( 1550 -1416610 )
+ + LAYER met5 ( -3005330 -1599710 ) ( 1550 -1596610 )
+ + LAYER met5 ( -3005330 -1798110 ) ( 1550 -1795010 )
+ + FIXED ( 2961700 1759840 ) N ;
+ - vssd1 + NET vssd1 + SPECIAL + DIRECTION INPUT + USE GROUND
+ + PORT
+ + LAYER met4 ( -1550 -1769310 ) ( 1550 1769310 )
+ + LAYER met4 ( -133930 -1769310 ) ( -130830 1769310 )
+ + LAYER met4 ( -313930 -1769310 ) ( -310830 1769310 )
+ + LAYER met4 ( -493930 -1769310 ) ( -490830 1769310 )
+ + LAYER met4 ( -673930 -1769310 ) ( -670830 1769310 )
+ + LAYER met4 ( -853930 540160 ) ( -850830 1769310 )
+ + LAYER met4 ( -1033930 540160 ) ( -1030830 1769310 )
+ + LAYER met4 ( -1213930 540160 ) ( -1210830 1769310 )
+ + LAYER met4 ( -1393930 540160 ) ( -1390830 1769310 )
+ + LAYER met4 ( -1573930 540160 ) ( -1570830 1769310 )
+ + LAYER met4 ( -1753930 540160 ) ( -1750830 1769310 )
+ + LAYER met4 ( -1933930 -1769310 ) ( -1930830 1769310 )
+ + LAYER met4 ( -2113930 -1769310 ) ( -2110830 1769310 )
+ + LAYER met4 ( -2293930 -1769310 ) ( -2290830 1769310 )
+ + LAYER met4 ( -2473930 -1769310 ) ( -2470830 1769310 )
+ + LAYER met4 ( -2653930 -1769310 ) ( -2650830 1769310 )
+ + LAYER met4 ( -2833930 -1769310 ) ( -2830830 1769310 )
+ + LAYER met4 ( -2947730 -1769310 ) ( -2944630 1769310 )
+ + LAYER met4 ( -853930 -1769310 ) ( -850830 -79840 )
+ + LAYER met4 ( -1033930 -1769310 ) ( -1030830 -79840 )
+ + LAYER met4 ( -1213930 -1769310 ) ( -1210830 -79840 )
+ + LAYER met4 ( -1393930 -1769310 ) ( -1390830 -79840 )
+ + LAYER met4 ( -1573930 -1769310 ) ( -1570830 -79840 )
+ + LAYER met4 ( -1753930 -1769310 ) ( -1750830 -79840 )
+ + LAYER met5 ( -2947730 1766210 ) ( 1550 1769310 )
+ + LAYER met5 ( -2947730 1584490 ) ( 1550 1587590 )
+ + LAYER met5 ( -2947730 1404490 ) ( 1550 1407590 )
+ + LAYER met5 ( -2947730 1224490 ) ( 1550 1227590 )
+ + LAYER met5 ( -2947730 1044490 ) ( 1550 1047590 )
+ + LAYER met5 ( -2947730 864490 ) ( 1550 867590 )
+ + LAYER met5 ( -2947730 684490 ) ( 1550 687590 )
+ + LAYER met5 ( -2947730 504490 ) ( 1550 507590 )
+ + LAYER met5 ( -2947730 324490 ) ( 1550 327590 )
+ + LAYER met5 ( -2947730 144490 ) ( 1550 147590 )
+ + LAYER met5 ( -2947730 -35510 ) ( 1550 -32410 )
+ + LAYER met5 ( -2947730 -215510 ) ( 1550 -212410 )
+ + LAYER met5 ( -2947730 -395510 ) ( 1550 -392410 )
+ + LAYER met5 ( -2947730 -575510 ) ( 1550 -572410 )
+ + LAYER met5 ( -2947730 -755510 ) ( 1550 -752410 )
+ + LAYER met5 ( -2947730 -935510 ) ( 1550 -932410 )
+ + LAYER met5 ( -2947730 -1115510 ) ( 1550 -1112410 )
+ + LAYER met5 ( -2947730 -1295510 ) ( 1550 -1292410 )
+ + LAYER met5 ( -2947730 -1475510 ) ( 1550 -1472410 )
+ + LAYER met5 ( -2947730 -1655510 ) ( 1550 -1652410 )
+ + LAYER met5 ( -2947730 -1769310 ) ( 1550 -1766210 )
+ + FIXED ( 2932900 1759840 ) N ;
+ - vssd2 + NET vssd2 + SPECIAL + DIRECTION INPUT + USE GROUND
+ + PORT
+ + LAYER met4 ( -1550 -1778910 ) ( 1550 1778910 )
+ + LAYER met4 ( -124930 -1778910 ) ( -121830 1778910 )
+ + LAYER met4 ( -304930 -1778910 ) ( -301830 1778910 )
+ + LAYER met4 ( -484930 -1778910 ) ( -481830 1778910 )
+ + LAYER met4 ( -664930 -1778910 ) ( -661830 1778910 )
+ + LAYER met4 ( -844930 -1778910 ) ( -841830 1778910 )
+ + LAYER met4 ( -1024930 540160 ) ( -1021830 1778910 )
+ + LAYER met4 ( -1204930 540160 ) ( -1201830 1778910 )
+ + LAYER met4 ( -1384930 540160 ) ( -1381830 1778910 )
+ + LAYER met4 ( -1564930 540160 ) ( -1561830 1778910 )
+ + LAYER met4 ( -1744930 540160 ) ( -1741830 1778910 )
+ + LAYER met4 ( -1924930 -1778910 ) ( -1921830 1778910 )
+ + LAYER met4 ( -2104930 -1778910 ) ( -2101830 1778910 )
+ + LAYER met4 ( -2284930 -1778910 ) ( -2281830 1778910 )
+ + LAYER met4 ( -2464930 -1778910 ) ( -2461830 1778910 )
+ + LAYER met4 ( -2644930 -1778910 ) ( -2641830 1778910 )
+ + LAYER met4 ( -2824930 -1778910 ) ( -2821830 1778910 )
+ + LAYER met4 ( -2966930 -1778910 ) ( -2963830 1778910 )
+ + LAYER met4 ( -1024930 -1778910 ) ( -1021830 -79840 )
+ + LAYER met4 ( -1204930 -1778910 ) ( -1201830 -79840 )
+ + LAYER met4 ( -1384930 -1778910 ) ( -1381830 -79840 )
+ + LAYER met4 ( -1564930 -1778910 ) ( -1561830 -79840 )
+ + LAYER met4 ( -1744930 -1778910 ) ( -1741830 -79840 )
+ + LAYER met5 ( -2966930 1775810 ) ( 1550 1778910 )
+ + LAYER met5 ( -2966930 1603090 ) ( 1550 1606190 )
+ + LAYER met5 ( -2966930 1423090 ) ( 1550 1426190 )
+ + LAYER met5 ( -2966930 1243090 ) ( 1550 1246190 )
+ + LAYER met5 ( -2966930 1063090 ) ( 1550 1066190 )
+ + LAYER met5 ( -2966930 883090 ) ( 1550 886190 )
+ + LAYER met5 ( -2966930 703090 ) ( 1550 706190 )
+ + LAYER met5 ( -2966930 523090 ) ( 1550 526190 )
+ + LAYER met5 ( -2966930 343090 ) ( 1550 346190 )
+ + LAYER met5 ( -2966930 163090 ) ( 1550 166190 )
+ + LAYER met5 ( -2966930 -16910 ) ( 1550 -13810 )
+ + LAYER met5 ( -2966930 -196910 ) ( 1550 -193810 )
+ + LAYER met5 ( -2966930 -376910 ) ( 1550 -373810 )
+ + LAYER met5 ( -2966930 -556910 ) ( 1550 -553810 )
+ + LAYER met5 ( -2966930 -736910 ) ( 1550 -733810 )
+ + LAYER met5 ( -2966930 -916910 ) ( 1550 -913810 )
+ + LAYER met5 ( -2966930 -1096910 ) ( 1550 -1093810 )
+ + LAYER met5 ( -2966930 -1276910 ) ( 1550 -1273810 )
+ + LAYER met5 ( -2966930 -1456910 ) ( 1550 -1453810 )
+ + LAYER met5 ( -2966930 -1636910 ) ( 1550 -1633810 )
+ + LAYER met5 ( -2966930 -1778910 ) ( 1550 -1775810 )
+ + FIXED ( 2942500 1759840 ) N ;
+ - wb_clk_i + NET wb_clk_i + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 2990 -1200 ) N ;
+ - wb_rst_i + NET wb_rst_i + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 8510 -1200 ) N ;
+ - wbs_ack_o + NET wbs_ack_o + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 14490 -1200 ) N ;
+ - wbs_adr_i[0] + NET wbs_adr_i[0] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 38410 -1200 ) N ;
+ - wbs_adr_i[10] + NET wbs_adr_i[10] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 239430 -1200 ) N ;
+ - wbs_adr_i[11] + NET wbs_adr_i[11] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 256910 -1200 ) N ;
+ - wbs_adr_i[12] + NET wbs_adr_i[12] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 274850 -1200 ) N ;
+ - wbs_adr_i[13] + NET wbs_adr_i[13] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 292330 -1200 ) N ;
+ - wbs_adr_i[14] + NET wbs_adr_i[14] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 310270 -1200 ) N ;
+ - wbs_adr_i[15] + NET wbs_adr_i[15] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 327750 -1200 ) N ;
+ - wbs_adr_i[16] + NET wbs_adr_i[16] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 345690 -1200 ) N ;
+ - wbs_adr_i[17] + NET wbs_adr_i[17] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 363170 -1200 ) N ;
+ - wbs_adr_i[18] + NET wbs_adr_i[18] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 381110 -1200 ) N ;
+ - wbs_adr_i[19] + NET wbs_adr_i[19] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 398590 -1200 ) N ;
+ - wbs_adr_i[1] + NET wbs_adr_i[1] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 61870 -1200 ) N ;
+ - wbs_adr_i[20] + NET wbs_adr_i[20] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 416530 -1200 ) N ;
+ - wbs_adr_i[21] + NET wbs_adr_i[21] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 434470 -1200 ) N ;
+ - wbs_adr_i[22] + NET wbs_adr_i[22] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 451950 -1200 ) N ;
+ - wbs_adr_i[23] + NET wbs_adr_i[23] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 469890 -1200 ) N ;
+ - wbs_adr_i[24] + NET wbs_adr_i[24] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 487370 -1200 ) N ;
+ - wbs_adr_i[25] + NET wbs_adr_i[25] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 505310 -1200 ) N ;
+ - wbs_adr_i[26] + NET wbs_adr_i[26] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 522790 -1200 ) N ;
+ - wbs_adr_i[27] + NET wbs_adr_i[27] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 540730 -1200 ) N ;
+ - wbs_adr_i[28] + NET wbs_adr_i[28] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 558210 -1200 ) N ;
+ - wbs_adr_i[29] + NET wbs_adr_i[29] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 576150 -1200 ) N ;
+ - wbs_adr_i[2] + NET wbs_adr_i[2] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 85330 -1200 ) N ;
+ - wbs_adr_i[30] + NET wbs_adr_i[30] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 594090 -1200 ) N ;
+ - wbs_adr_i[31] + NET wbs_adr_i[31] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 611570 -1200 ) N ;
+ - wbs_adr_i[3] + NET wbs_adr_i[3] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 109250 -1200 ) N ;
+ - wbs_adr_i[4] + NET wbs_adr_i[4] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 132710 -1200 ) N ;
+ - wbs_adr_i[5] + NET wbs_adr_i[5] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 150650 -1200 ) N ;
+ - wbs_adr_i[6] + NET wbs_adr_i[6] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 168130 -1200 ) N ;
+ - wbs_adr_i[7] + NET wbs_adr_i[7] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 186070 -1200 ) N ;
+ - wbs_adr_i[8] + NET wbs_adr_i[8] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 203550 -1200 ) N ;
+ - wbs_adr_i[9] + NET wbs_adr_i[9] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 221490 -1200 ) N ;
+ - wbs_cyc_i + NET wbs_cyc_i + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 20470 -1200 ) N ;
+ - wbs_dat_i[0] + NET wbs_dat_i[0] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 43930 -1200 ) N ;
+ - wbs_dat_i[10] + NET wbs_dat_i[10] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 244950 -1200 ) N ;
+ - wbs_dat_i[11] + NET wbs_dat_i[11] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 262890 -1200 ) N ;
+ - wbs_dat_i[12] + NET wbs_dat_i[12] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 280370 -1200 ) N ;
+ - wbs_dat_i[13] + NET wbs_dat_i[13] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 298310 -1200 ) N ;
+ - wbs_dat_i[14] + NET wbs_dat_i[14] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 316250 -1200 ) N ;
+ - wbs_dat_i[15] + NET wbs_dat_i[15] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 333730 -1200 ) N ;
+ - wbs_dat_i[16] + NET wbs_dat_i[16] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 351670 -1200 ) N ;
+ - wbs_dat_i[17] + NET wbs_dat_i[17] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 369150 -1200 ) N ;
+ - wbs_dat_i[18] + NET wbs_dat_i[18] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 387090 -1200 ) N ;
+ - wbs_dat_i[19] + NET wbs_dat_i[19] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 404570 -1200 ) N ;
+ - wbs_dat_i[1] + NET wbs_dat_i[1] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 67850 -1200 ) N ;
+ - wbs_dat_i[20] + NET wbs_dat_i[20] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 422510 -1200 ) N ;
+ - wbs_dat_i[21] + NET wbs_dat_i[21] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 439990 -1200 ) N ;
+ - wbs_dat_i[22] + NET wbs_dat_i[22] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 457930 -1200 ) N ;
+ - wbs_dat_i[23] + NET wbs_dat_i[23] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 475870 -1200 ) N ;
+ - wbs_dat_i[24] + NET wbs_dat_i[24] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 493350 -1200 ) N ;
+ - wbs_dat_i[25] + NET wbs_dat_i[25] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 511290 -1200 ) N ;
+ - wbs_dat_i[26] + NET wbs_dat_i[26] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 528770 -1200 ) N ;
+ - wbs_dat_i[27] + NET wbs_dat_i[27] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 546710 -1200 ) N ;
+ - wbs_dat_i[28] + NET wbs_dat_i[28] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 564190 -1200 ) N ;
+ - wbs_dat_i[29] + NET wbs_dat_i[29] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 582130 -1200 ) N ;
+ - wbs_dat_i[2] + NET wbs_dat_i[2] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 91310 -1200 ) N ;
+ - wbs_dat_i[30] + NET wbs_dat_i[30] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 599610 -1200 ) N ;
+ - wbs_dat_i[31] + NET wbs_dat_i[31] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 617550 -1200 ) N ;
+ - wbs_dat_i[3] + NET wbs_dat_i[3] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 115230 -1200 ) N ;
+ - wbs_dat_i[4] + NET wbs_dat_i[4] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 138690 -1200 ) N ;
+ - wbs_dat_i[5] + NET wbs_dat_i[5] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 156630 -1200 ) N ;
+ - wbs_dat_i[6] + NET wbs_dat_i[6] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 174110 -1200 ) N ;
+ - wbs_dat_i[7] + NET wbs_dat_i[7] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 192050 -1200 ) N ;
+ - wbs_dat_i[8] + NET wbs_dat_i[8] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 209530 -1200 ) N ;
+ - wbs_dat_i[9] + NET wbs_dat_i[9] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 227470 -1200 ) N ;
+ - wbs_dat_o[0] + NET wbs_dat_o[0] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 49910 -1200 ) N ;
+ - wbs_dat_o[10] + NET wbs_dat_o[10] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 250930 -1200 ) N ;
+ - wbs_dat_o[11] + NET wbs_dat_o[11] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 268870 -1200 ) N ;
+ - wbs_dat_o[12] + NET wbs_dat_o[12] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 286350 -1200 ) N ;
+ - wbs_dat_o[13] + NET wbs_dat_o[13] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 304290 -1200 ) N ;
+ - wbs_dat_o[14] + NET wbs_dat_o[14] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 321770 -1200 ) N ;
+ - wbs_dat_o[15] + NET wbs_dat_o[15] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 339710 -1200 ) N ;
+ - wbs_dat_o[16] + NET wbs_dat_o[16] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 357650 -1200 ) N ;
+ - wbs_dat_o[17] + NET wbs_dat_o[17] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 375130 -1200 ) N ;
+ - wbs_dat_o[18] + NET wbs_dat_o[18] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 393070 -1200 ) N ;
+ - wbs_dat_o[19] + NET wbs_dat_o[19] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 410550 -1200 ) N ;
+ - wbs_dat_o[1] + NET wbs_dat_o[1] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 73830 -1200 ) N ;
+ - wbs_dat_o[20] + NET wbs_dat_o[20] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 428490 -1200 ) N ;
+ - wbs_dat_o[21] + NET wbs_dat_o[21] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 445970 -1200 ) N ;
+ - wbs_dat_o[22] + NET wbs_dat_o[22] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 463910 -1200 ) N ;
+ - wbs_dat_o[23] + NET wbs_dat_o[23] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 481390 -1200 ) N ;
+ - wbs_dat_o[24] + NET wbs_dat_o[24] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 499330 -1200 ) N ;
+ - wbs_dat_o[25] + NET wbs_dat_o[25] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 516810 -1200 ) N ;
+ - wbs_dat_o[26] + NET wbs_dat_o[26] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 534750 -1200 ) N ;
+ - wbs_dat_o[27] + NET wbs_dat_o[27] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 552690 -1200 ) N ;
+ - wbs_dat_o[28] + NET wbs_dat_o[28] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 570170 -1200 ) N ;
+ - wbs_dat_o[29] + NET wbs_dat_o[29] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 588110 -1200 ) N ;
+ - wbs_dat_o[2] + NET wbs_dat_o[2] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 97290 -1200 ) N ;
+ - wbs_dat_o[30] + NET wbs_dat_o[30] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 605590 -1200 ) N ;
+ - wbs_dat_o[31] + NET wbs_dat_o[31] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 623530 -1200 ) N ;
+ - wbs_dat_o[3] + NET wbs_dat_o[3] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 121210 -1200 ) N ;
+ - wbs_dat_o[4] + NET wbs_dat_o[4] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 144670 -1200 ) N ;
+ - wbs_dat_o[5] + NET wbs_dat_o[5] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 162150 -1200 ) N ;
+ - wbs_dat_o[6] + NET wbs_dat_o[6] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 180090 -1200 ) N ;
+ - wbs_dat_o[7] + NET wbs_dat_o[7] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 198030 -1200 ) N ;
+ - wbs_dat_o[8] + NET wbs_dat_o[8] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 215510 -1200 ) N ;
+ - wbs_dat_o[9] + NET wbs_dat_o[9] + DIRECTION OUTPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 233450 -1200 ) N ;
+ - wbs_sel_i[0] + NET wbs_sel_i[0] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 55890 -1200 ) N ;
+ - wbs_sel_i[1] + NET wbs_sel_i[1] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 79810 -1200 ) N ;
+ - wbs_sel_i[2] + NET wbs_sel_i[2] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 103270 -1200 ) N ;
+ - wbs_sel_i[3] + NET wbs_sel_i[3] + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 126730 -1200 ) N ;
+ - wbs_stb_i + NET wbs_stb_i + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 26450 -1200 ) N ;
+ - wbs_we_i + NET wbs_we_i + DIRECTION INPUT + USE SIGNAL
+ + PORT
+ + LAYER met2 ( -280 -3600 ) ( 280 3600 )
+ + PLACED ( 32430 -1200 ) N ;
+END PINS
+SPECIALNETS 8 ;
+ - vccd1 ( PIN vccd1 ) + USE POWER
+ + ROUTED met4 0 + SHAPE STRIPE ( 1964840 2175880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1811240 2175880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1657640 2175880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1504040 2175880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1350440 2175880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1196840 2175880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1964840 1995880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1811240 1995880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1657640 1995880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1504040 1995880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1350440 1995880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1196840 1995880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1964840 1815880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1811240 1815880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1657640 1815880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1504040 1815880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1350440 1815880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1196840 1815880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 2928100 3522800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2890520 3522800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2710520 3522800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2530520 3522800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2350520 3522800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2170520 3522800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1990520 3522800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1810520 3522800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1630520 3522800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1450520 3522800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1270520 3522800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1090520 3522800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 910520 3522800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 730520 3522800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 550520 3522800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 370520 3522800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 190520 3522800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 10520 3522800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -8480 3522800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2928100 3435880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2890520 3435880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2710520 3435880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2530520 3435880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2350520 3435880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2170520 3435880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1990520 3435880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1810520 3435880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1630520 3435880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1450520 3435880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1270520 3435880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1090520 3435880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 910520 3435880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 730520 3435880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 550520 3435880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 370520 3435880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 190520 3435880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 10520 3435880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -8480 3435880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2928100 3255880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2890520 3255880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2710520 3255880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2530520 3255880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2350520 3255880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2170520 3255880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1990520 3255880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1810520 3255880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1630520 3255880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1450520 3255880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1270520 3255880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1090520 3255880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 910520 3255880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 730520 3255880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 550520 3255880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 370520 3255880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 190520 3255880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 10520 3255880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -8480 3255880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2928100 3075880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2890520 3075880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2710520 3075880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2530520 3075880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2350520 3075880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2170520 3075880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1990520 3075880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1810520 3075880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1630520 3075880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1450520 3075880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1270520 3075880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1090520 3075880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 910520 3075880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 730520 3075880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 550520 3075880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 370520 3075880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 190520 3075880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 10520 3075880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -8480 3075880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2928100 2895880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2890520 2895880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2710520 2895880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2530520 2895880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2350520 2895880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2170520 2895880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1990520 2895880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1810520 2895880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1630520 2895880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1450520 2895880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1270520 2895880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1090520 2895880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 910520 2895880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 730520 2895880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 550520 2895880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 370520 2895880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 190520 2895880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 10520 2895880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -8480 2895880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2928100 2715880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2890520 2715880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2710520 2715880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2530520 2715880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2350520 2715880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2170520 2715880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1990520 2715880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1810520 2715880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1630520 2715880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1450520 2715880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1270520 2715880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1090520 2715880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 910520 2715880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 730520 2715880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 550520 2715880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 370520 2715880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 190520 2715880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 10520 2715880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -8480 2715880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2928100 2535880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2890520 2535880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2710520 2535880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2530520 2535880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2350520 2535880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2170520 2535880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1990520 2535880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1810520 2535880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1630520 2535880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1450520 2535880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1270520 2535880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1090520 2535880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 910520 2535880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 730520 2535880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 550520 2535880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 370520 2535880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 190520 2535880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 10520 2535880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -8480 2535880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2928100 2355880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2890520 2355880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2710520 2355880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2530520 2355880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2350520 2355880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2170520 2355880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1990520 2355880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1810520 2355880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1630520 2355880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1450520 2355880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1270520 2355880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1090520 2355880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 910520 2355880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 730520 2355880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 550520 2355880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 370520 2355880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 190520 2355880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 10520 2355880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -8480 2355880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2928100 2175880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2890520 2175880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2710520 2175880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2530520 2175880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2350520 2175880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2170520 2175880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1090520 2175880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 910520 2175880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 730520 2175880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 550520 2175880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 370520 2175880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 190520 2175880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 10520 2175880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -8480 2175880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2928100 1995880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2890520 1995880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2710520 1995880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2530520 1995880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2350520 1995880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2170520 1995880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1090520 1995880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 910520 1995880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 730520 1995880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 550520 1995880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 370520 1995880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 190520 1995880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 10520 1995880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -8480 1995880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2928100 1815880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2890520 1815880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2710520 1815880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2530520 1815880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2350520 1815880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2170520 1815880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1090520 1815880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 910520 1815880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 730520 1815880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 550520 1815880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 370520 1815880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 190520 1815880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 10520 1815880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -8480 1815880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2928100 1635880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2890520 1635880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2710520 1635880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2530520 1635880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2350520 1635880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2170520 1635880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1990520 1635880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1810520 1635880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1630520 1635880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1450520 1635880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1270520 1635880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1090520 1635880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 910520 1635880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 730520 1635880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 550520 1635880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 370520 1635880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 190520 1635880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 10520 1635880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -8480 1635880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2928100 1455880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2890520 1455880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2710520 1455880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2530520 1455880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2350520 1455880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2170520 1455880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1990520 1455880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1810520 1455880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1630520 1455880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1450520 1455880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1270520 1455880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1090520 1455880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 910520 1455880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 730520 1455880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 550520 1455880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 370520 1455880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 190520 1455880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 10520 1455880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -8480 1455880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2928100 1275880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2890520 1275880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2710520 1275880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2530520 1275880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2350520 1275880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2170520 1275880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1990520 1275880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1810520 1275880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1630520 1275880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1450520 1275880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1270520 1275880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1090520 1275880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 910520 1275880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 730520 1275880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 550520 1275880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 370520 1275880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 190520 1275880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 10520 1275880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -8480 1275880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2928100 1095880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2890520 1095880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2710520 1095880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2530520 1095880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2350520 1095880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2170520 1095880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1990520 1095880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1810520 1095880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1630520 1095880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1450520 1095880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1270520 1095880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1090520 1095880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 910520 1095880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 730520 1095880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 550520 1095880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 370520 1095880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 190520 1095880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 10520 1095880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -8480 1095880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2928100 915880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2890520 915880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2710520 915880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2530520 915880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2350520 915880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2170520 915880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1990520 915880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1810520 915880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1630520 915880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1450520 915880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1270520 915880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1090520 915880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 910520 915880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 730520 915880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 550520 915880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 370520 915880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 190520 915880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 10520 915880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -8480 915880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2928100 735880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2890520 735880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2710520 735880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2530520 735880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2350520 735880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2170520 735880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1990520 735880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1810520 735880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1630520 735880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1450520 735880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1270520 735880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1090520 735880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 910520 735880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 730520 735880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 550520 735880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 370520 735880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 190520 735880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 10520 735880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -8480 735880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2928100 555880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2890520 555880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2710520 555880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2530520 555880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2350520 555880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2170520 555880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1990520 555880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1810520 555880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1630520 555880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1450520 555880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1270520 555880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1090520 555880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 910520 555880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 730520 555880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 550520 555880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 370520 555880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 190520 555880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 10520 555880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -8480 555880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2928100 375880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2890520 375880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2710520 375880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2530520 375880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2350520 375880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2170520 375880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1990520 375880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1810520 375880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1630520 375880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1450520 375880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1270520 375880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1090520 375880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 910520 375880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 730520 375880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 550520 375880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 370520 375880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 190520 375880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 10520 375880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -8480 375880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2928100 195880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2890520 195880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2710520 195880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2530520 195880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2350520 195880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2170520 195880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1990520 195880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1810520 195880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1630520 195880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1450520 195880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1270520 195880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1090520 195880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 910520 195880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 730520 195880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 550520 195880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 370520 195880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 190520 195880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 10520 195880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -8480 195880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2928100 15880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2890520 15880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2710520 15880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2530520 15880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2350520 15880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2170520 15880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1990520 15880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1810520 15880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1630520 15880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1450520 15880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1270520 15880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1090520 15880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 910520 15880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 730520 15880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 550520 15880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 370520 15880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 190520 15880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 10520 15880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -8480 15880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2928100 -3120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2890520 -3120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2710520 -3120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2530520 -3120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2350520 -3120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2170520 -3120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1990520 -3120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1810520 -3120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1630520 -3120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1450520 -3120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1270520 -3120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1090520 -3120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 910520 -3120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 730520 -3120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 550520 -3120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 370520 -3120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 190520 -3120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 10520 -3120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -8480 -3120 ) via4_3100x3100
+ NEW met5 3100 + SHAPE STRIPE ( -10030 3522800 ) ( 2929650 3522800 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 3435880 ) ( 2934450 3435880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 3255880 ) ( 2934450 3255880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 3075880 ) ( 2934450 3075880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 2895880 ) ( 2934450 2895880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 2715880 ) ( 2934450 2715880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 2535880 ) ( 2934450 2535880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 2355880 ) ( 2934450 2355880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 2175880 ) ( 2934450 2175880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 1995880 ) ( 2934450 1995880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 1815880 ) ( 2934450 1815880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 1635880 ) ( 2934450 1635880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 1455880 ) ( 2934450 1455880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 1275880 ) ( 2934450 1275880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 1095880 ) ( 2934450 1095880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 915880 ) ( 2934450 915880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 735880 ) ( 2934450 735880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 555880 ) ( 2934450 555880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 375880 ) ( 2934450 375880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 195880 ) ( 2934450 195880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 15880 ) ( 2934450 15880 )
+ NEW met5 3100 + SHAPE STRIPE ( -10030 -3120 ) ( 2929650 -3120 )
+ NEW met4 3100 + SHAPE STRIPE ( 2890520 -9470 ) ( 2890520 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( 2710520 -9470 ) ( 2710520 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( 2530520 -9470 ) ( 2530520 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( 2350520 -9470 ) ( 2350520 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( 2170520 -9470 ) ( 2170520 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( 1990520 2300000 ) ( 1990520 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( 1810520 2300000 ) ( 1810520 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( 1630520 2300000 ) ( 1630520 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( 1450520 2300000 ) ( 1450520 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( 1270520 2300000 ) ( 1270520 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( 1090520 -9470 ) ( 1090520 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( 910520 -9470 ) ( 910520 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( 730520 -9470 ) ( 730520 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( 550520 -9470 ) ( 550520 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( 370520 -9470 ) ( 370520 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( 190520 -9470 ) ( 190520 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( 10520 -9470 ) ( 10520 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( 2928100 -4670 ) ( 2928100 3524350 )
+ NEW met4 3100 + SHAPE STRIPE ( -8480 -4670 ) ( -8480 3524350 )
+ NEW met4 3100 + SHAPE STRIPE ( 1990520 -9470 ) ( 1990520 1680000 )
+ NEW met4 3100 + SHAPE STRIPE ( 1810520 -9470 ) ( 1810520 1680000 )
+ NEW met4 3100 + SHAPE STRIPE ( 1630520 -9470 ) ( 1630520 1680000 )
+ NEW met4 3100 + SHAPE STRIPE ( 1450520 -9470 ) ( 1450520 1680000 )
+ NEW met4 3100 + SHAPE STRIPE ( 1270520 -9470 ) ( 1270520 1680000 ) ;
+ - vccd2 ( PIN vccd2 ) + USE POWER
+ + ROUTED met4 0 + SHAPE STRIPE ( 2937700 3532400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2909120 3532400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2729120 3532400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2549120 3532400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2369120 3532400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2189120 3532400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2009120 3532400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1829120 3532400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1649120 3532400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1469120 3532400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1289120 3532400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1109120 3532400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 929120 3532400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 749120 3532400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 569120 3532400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 389120 3532400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 209120 3532400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 29120 3532400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -18080 3532400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2937700 3454480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2909120 3454480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2729120 3454480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2549120 3454480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2369120 3454480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2189120 3454480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2009120 3454480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1829120 3454480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1649120 3454480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1469120 3454480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1289120 3454480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1109120 3454480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 929120 3454480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 749120 3454480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 569120 3454480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 389120 3454480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 209120 3454480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 29120 3454480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -18080 3454480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2937700 3274480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2909120 3274480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2729120 3274480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2549120 3274480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2369120 3274480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2189120 3274480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2009120 3274480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1829120 3274480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1649120 3274480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1469120 3274480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1289120 3274480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1109120 3274480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 929120 3274480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 749120 3274480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 569120 3274480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 389120 3274480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 209120 3274480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 29120 3274480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -18080 3274480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2937700 3094480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2909120 3094480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2729120 3094480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2549120 3094480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2369120 3094480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2189120 3094480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2009120 3094480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1829120 3094480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1649120 3094480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1469120 3094480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1289120 3094480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1109120 3094480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 929120 3094480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 749120 3094480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 569120 3094480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 389120 3094480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 209120 3094480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 29120 3094480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -18080 3094480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2937700 2914480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2909120 2914480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2729120 2914480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2549120 2914480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2369120 2914480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2189120 2914480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2009120 2914480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1829120 2914480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1649120 2914480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1469120 2914480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1289120 2914480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1109120 2914480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 929120 2914480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 749120 2914480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 569120 2914480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 389120 2914480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 209120 2914480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 29120 2914480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -18080 2914480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2937700 2734480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2909120 2734480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2729120 2734480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2549120 2734480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2369120 2734480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2189120 2734480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2009120 2734480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1829120 2734480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1649120 2734480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1469120 2734480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1289120 2734480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1109120 2734480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 929120 2734480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 749120 2734480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 569120 2734480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 389120 2734480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 209120 2734480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 29120 2734480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -18080 2734480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2937700 2554480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2909120 2554480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2729120 2554480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2549120 2554480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2369120 2554480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2189120 2554480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2009120 2554480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1829120 2554480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1649120 2554480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1469120 2554480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1289120 2554480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1109120 2554480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 929120 2554480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 749120 2554480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 569120 2554480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 389120 2554480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 209120 2554480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 29120 2554480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -18080 2554480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2937700 2374480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2909120 2374480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2729120 2374480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2549120 2374480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2369120 2374480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2189120 2374480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2009120 2374480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1829120 2374480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1649120 2374480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1469120 2374480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1289120 2374480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1109120 2374480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 929120 2374480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 749120 2374480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 569120 2374480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 389120 2374480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 209120 2374480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 29120 2374480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -18080 2374480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2937700 2194480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2909120 2194480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2729120 2194480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2549120 2194480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2369120 2194480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2189120 2194480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1109120 2194480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 929120 2194480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 749120 2194480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 569120 2194480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 389120 2194480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 209120 2194480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 29120 2194480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -18080 2194480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2937700 2014480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2909120 2014480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2729120 2014480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2549120 2014480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2369120 2014480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2189120 2014480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1109120 2014480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 929120 2014480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 749120 2014480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 569120 2014480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 389120 2014480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 209120 2014480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 29120 2014480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -18080 2014480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2937700 1834480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2909120 1834480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2729120 1834480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2549120 1834480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2369120 1834480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2189120 1834480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1109120 1834480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 929120 1834480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 749120 1834480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 569120 1834480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 389120 1834480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 209120 1834480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 29120 1834480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -18080 1834480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2937700 1654480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2909120 1654480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2729120 1654480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2549120 1654480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2369120 1654480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2189120 1654480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2009120 1654480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1829120 1654480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1649120 1654480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1469120 1654480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1289120 1654480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1109120 1654480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 929120 1654480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 749120 1654480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 569120 1654480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 389120 1654480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 209120 1654480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 29120 1654480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -18080 1654480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2937700 1474480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2909120 1474480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2729120 1474480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2549120 1474480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2369120 1474480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2189120 1474480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2009120 1474480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1829120 1474480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1649120 1474480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1469120 1474480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1289120 1474480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1109120 1474480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 929120 1474480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 749120 1474480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 569120 1474480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 389120 1474480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 209120 1474480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 29120 1474480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -18080 1474480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2937700 1294480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2909120 1294480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2729120 1294480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2549120 1294480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2369120 1294480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2189120 1294480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2009120 1294480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1829120 1294480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1649120 1294480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1469120 1294480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1289120 1294480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1109120 1294480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 929120 1294480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 749120 1294480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 569120 1294480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 389120 1294480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 209120 1294480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 29120 1294480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -18080 1294480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2937700 1114480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2909120 1114480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2729120 1114480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2549120 1114480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2369120 1114480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2189120 1114480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2009120 1114480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1829120 1114480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1649120 1114480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1469120 1114480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1289120 1114480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1109120 1114480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 929120 1114480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 749120 1114480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 569120 1114480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 389120 1114480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 209120 1114480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 29120 1114480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -18080 1114480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2937700 934480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2909120 934480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2729120 934480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2549120 934480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2369120 934480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2189120 934480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2009120 934480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1829120 934480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1649120 934480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1469120 934480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1289120 934480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1109120 934480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 929120 934480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 749120 934480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 569120 934480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 389120 934480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 209120 934480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 29120 934480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -18080 934480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2937700 754480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2909120 754480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2729120 754480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2549120 754480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2369120 754480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2189120 754480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2009120 754480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1829120 754480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1649120 754480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1469120 754480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1289120 754480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1109120 754480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 929120 754480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 749120 754480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 569120 754480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 389120 754480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 209120 754480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 29120 754480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -18080 754480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2937700 574480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2909120 574480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2729120 574480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2549120 574480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2369120 574480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2189120 574480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2009120 574480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1829120 574480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1649120 574480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1469120 574480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1289120 574480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1109120 574480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 929120 574480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 749120 574480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 569120 574480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 389120 574480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 209120 574480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 29120 574480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -18080 574480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2937700 394480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2909120 394480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2729120 394480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2549120 394480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2369120 394480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2189120 394480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2009120 394480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1829120 394480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1649120 394480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1469120 394480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1289120 394480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1109120 394480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 929120 394480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 749120 394480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 569120 394480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 389120 394480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 209120 394480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 29120 394480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -18080 394480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2937700 214480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2909120 214480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2729120 214480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2549120 214480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2369120 214480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2189120 214480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2009120 214480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1829120 214480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1649120 214480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1469120 214480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1289120 214480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1109120 214480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 929120 214480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 749120 214480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 569120 214480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 389120 214480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 209120 214480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 29120 214480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -18080 214480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2937700 34480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2909120 34480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2729120 34480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2549120 34480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2369120 34480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2189120 34480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2009120 34480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1829120 34480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1649120 34480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1469120 34480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1289120 34480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1109120 34480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 929120 34480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 749120 34480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 569120 34480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 389120 34480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 209120 34480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 29120 34480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -18080 34480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2937700 -12720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2909120 -12720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2729120 -12720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2549120 -12720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2369120 -12720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2189120 -12720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2009120 -12720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1829120 -12720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1649120 -12720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1469120 -12720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1289120 -12720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1109120 -12720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 929120 -12720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 749120 -12720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 569120 -12720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 389120 -12720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 209120 -12720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 29120 -12720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -18080 -12720 ) via4_3100x3100
+ NEW met5 3100 + SHAPE STRIPE ( -19630 3532400 ) ( 2939250 3532400 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 3454480 ) ( 2944050 3454480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 3274480 ) ( 2944050 3274480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 3094480 ) ( 2944050 3094480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 2914480 ) ( 2944050 2914480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 2734480 ) ( 2944050 2734480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 2554480 ) ( 2944050 2554480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 2374480 ) ( 2944050 2374480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 2194480 ) ( 2944050 2194480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 2014480 ) ( 2944050 2014480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 1834480 ) ( 2944050 1834480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 1654480 ) ( 2944050 1654480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 1474480 ) ( 2944050 1474480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 1294480 ) ( 2944050 1294480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 1114480 ) ( 2944050 1114480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 934480 ) ( 2944050 934480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 754480 ) ( 2944050 754480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 574480 ) ( 2944050 574480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 394480 ) ( 2944050 394480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 214480 ) ( 2944050 214480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 34480 ) ( 2944050 34480 )
+ NEW met5 3100 + SHAPE STRIPE ( -19630 -12720 ) ( 2939250 -12720 )
+ NEW met4 3100 + SHAPE STRIPE ( 2909120 -19070 ) ( 2909120 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( 2729120 -19070 ) ( 2729120 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( 2549120 -19070 ) ( 2549120 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( 2369120 -19070 ) ( 2369120 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( 2189120 -19070 ) ( 2189120 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( 2009120 2300000 ) ( 2009120 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( 1829120 2300000 ) ( 1829120 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( 1649120 2300000 ) ( 1649120 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( 1469120 2300000 ) ( 1469120 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( 1289120 2300000 ) ( 1289120 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( 1109120 -19070 ) ( 1109120 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( 929120 -19070 ) ( 929120 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( 749120 -19070 ) ( 749120 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( 569120 -19070 ) ( 569120 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( 389120 -19070 ) ( 389120 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( 209120 -19070 ) ( 209120 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( 29120 -19070 ) ( 29120 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( 2937700 -14270 ) ( 2937700 3533950 )
+ NEW met4 3100 + SHAPE STRIPE ( -18080 -14270 ) ( -18080 3533950 )
+ NEW met4 3100 + SHAPE STRIPE ( 2009120 -19070 ) ( 2009120 1680000 )
+ NEW met4 3100 + SHAPE STRIPE ( 1829120 -19070 ) ( 1829120 1680000 )
+ NEW met4 3100 + SHAPE STRIPE ( 1649120 -19070 ) ( 1649120 1680000 )
+ NEW met4 3100 + SHAPE STRIPE ( 1469120 -19070 ) ( 1469120 1680000 )
+ NEW met4 3100 + SHAPE STRIPE ( 1289120 -19070 ) ( 1289120 1680000 ) ;
+ - vdda1 ( PIN vdda1 ) + USE POWER
+ + ROUTED met4 0 + SHAPE STRIPE ( 2947300 3542000 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2747720 3542000 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2567720 3542000 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2387720 3542000 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2207720 3542000 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2027720 3542000 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1847720 3542000 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1667720 3542000 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1487720 3542000 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1307720 3542000 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1127720 3542000 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 947720 3542000 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 767720 3542000 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 587720 3542000 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 407720 3542000 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 227720 3542000 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 47720 3542000 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -27680 3542000 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2947300 3473080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2747720 3473080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2567720 3473080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2387720 3473080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2207720 3473080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2027720 3473080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1847720 3473080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1667720 3473080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1487720 3473080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1307720 3473080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1127720 3473080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 947720 3473080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 767720 3473080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 587720 3473080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 407720 3473080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 227720 3473080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 47720 3473080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -27680 3473080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2947300 3293080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2747720 3293080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2567720 3293080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2387720 3293080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2207720 3293080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2027720 3293080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1847720 3293080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1667720 3293080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1487720 3293080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1307720 3293080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1127720 3293080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 947720 3293080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 767720 3293080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 587720 3293080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 407720 3293080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 227720 3293080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 47720 3293080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -27680 3293080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2947300 3113080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2747720 3113080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2567720 3113080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2387720 3113080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2207720 3113080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2027720 3113080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1847720 3113080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1667720 3113080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1487720 3113080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1307720 3113080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1127720 3113080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 947720 3113080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 767720 3113080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 587720 3113080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 407720 3113080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 227720 3113080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 47720 3113080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -27680 3113080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2947300 2933080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2747720 2933080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2567720 2933080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2387720 2933080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2207720 2933080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2027720 2933080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1847720 2933080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1667720 2933080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1487720 2933080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1307720 2933080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1127720 2933080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 947720 2933080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 767720 2933080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 587720 2933080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 407720 2933080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 227720 2933080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 47720 2933080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -27680 2933080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2947300 2753080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2747720 2753080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2567720 2753080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2387720 2753080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2207720 2753080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2027720 2753080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1847720 2753080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1667720 2753080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1487720 2753080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1307720 2753080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1127720 2753080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 947720 2753080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 767720 2753080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 587720 2753080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 407720 2753080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 227720 2753080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 47720 2753080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -27680 2753080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2947300 2573080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2747720 2573080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2567720 2573080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2387720 2573080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2207720 2573080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2027720 2573080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1847720 2573080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1667720 2573080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1487720 2573080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1307720 2573080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1127720 2573080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 947720 2573080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 767720 2573080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 587720 2573080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 407720 2573080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 227720 2573080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 47720 2573080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -27680 2573080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2947300 2393080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2747720 2393080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2567720 2393080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2387720 2393080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2207720 2393080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2027720 2393080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1847720 2393080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1667720 2393080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1487720 2393080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1307720 2393080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1127720 2393080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 947720 2393080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 767720 2393080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 587720 2393080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 407720 2393080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 227720 2393080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 47720 2393080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -27680 2393080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2947300 2213080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2747720 2213080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2567720 2213080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2387720 2213080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2207720 2213080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1127720 2213080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 947720 2213080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 767720 2213080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 587720 2213080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 407720 2213080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 227720 2213080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 47720 2213080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -27680 2213080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2947300 2033080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2747720 2033080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2567720 2033080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2387720 2033080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2207720 2033080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1127720 2033080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 947720 2033080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 767720 2033080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 587720 2033080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 407720 2033080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 227720 2033080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 47720 2033080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -27680 2033080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2947300 1853080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2747720 1853080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2567720 1853080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2387720 1853080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2207720 1853080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1127720 1853080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 947720 1853080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 767720 1853080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 587720 1853080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 407720 1853080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 227720 1853080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 47720 1853080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -27680 1853080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2947300 1673080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2747720 1673080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2567720 1673080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2387720 1673080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2207720 1673080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2027720 1673080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1847720 1673080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1667720 1673080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1487720 1673080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1307720 1673080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1127720 1673080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 947720 1673080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 767720 1673080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 587720 1673080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 407720 1673080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 227720 1673080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 47720 1673080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -27680 1673080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2947300 1493080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2747720 1493080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2567720 1493080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2387720 1493080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2207720 1493080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2027720 1493080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1847720 1493080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1667720 1493080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1487720 1493080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1307720 1493080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1127720 1493080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 947720 1493080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 767720 1493080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 587720 1493080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 407720 1493080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 227720 1493080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 47720 1493080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -27680 1493080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2947300 1313080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2747720 1313080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2567720 1313080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2387720 1313080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2207720 1313080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2027720 1313080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1847720 1313080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1667720 1313080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1487720 1313080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1307720 1313080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1127720 1313080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 947720 1313080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 767720 1313080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 587720 1313080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 407720 1313080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 227720 1313080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 47720 1313080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -27680 1313080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2947300 1133080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2747720 1133080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2567720 1133080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2387720 1133080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2207720 1133080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2027720 1133080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1847720 1133080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1667720 1133080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1487720 1133080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1307720 1133080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1127720 1133080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 947720 1133080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 767720 1133080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 587720 1133080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 407720 1133080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 227720 1133080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 47720 1133080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -27680 1133080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2947300 953080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2747720 953080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2567720 953080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2387720 953080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2207720 953080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2027720 953080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1847720 953080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1667720 953080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1487720 953080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1307720 953080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1127720 953080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 947720 953080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 767720 953080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 587720 953080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 407720 953080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 227720 953080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 47720 953080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -27680 953080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2947300 773080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2747720 773080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2567720 773080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2387720 773080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2207720 773080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2027720 773080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1847720 773080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1667720 773080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1487720 773080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1307720 773080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1127720 773080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 947720 773080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 767720 773080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 587720 773080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 407720 773080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 227720 773080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 47720 773080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -27680 773080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2947300 593080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2747720 593080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2567720 593080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2387720 593080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2207720 593080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2027720 593080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1847720 593080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1667720 593080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1487720 593080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1307720 593080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1127720 593080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 947720 593080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 767720 593080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 587720 593080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 407720 593080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 227720 593080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 47720 593080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -27680 593080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2947300 413080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2747720 413080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2567720 413080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2387720 413080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2207720 413080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2027720 413080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1847720 413080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1667720 413080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1487720 413080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1307720 413080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1127720 413080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 947720 413080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 767720 413080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 587720 413080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 407720 413080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 227720 413080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 47720 413080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -27680 413080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2947300 233080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2747720 233080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2567720 233080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2387720 233080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2207720 233080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2027720 233080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1847720 233080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1667720 233080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1487720 233080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1307720 233080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1127720 233080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 947720 233080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 767720 233080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 587720 233080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 407720 233080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 227720 233080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 47720 233080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -27680 233080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2947300 53080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2747720 53080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2567720 53080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2387720 53080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2207720 53080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2027720 53080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1847720 53080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1667720 53080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1487720 53080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1307720 53080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1127720 53080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 947720 53080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 767720 53080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 587720 53080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 407720 53080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 227720 53080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 47720 53080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -27680 53080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2947300 -22320 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2747720 -22320 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2567720 -22320 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2387720 -22320 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2207720 -22320 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2027720 -22320 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1847720 -22320 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1667720 -22320 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1487720 -22320 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1307720 -22320 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1127720 -22320 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 947720 -22320 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 767720 -22320 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 587720 -22320 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 407720 -22320 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 227720 -22320 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 47720 -22320 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -27680 -22320 ) via4_3100x3100
+ NEW met5 3100 + SHAPE STRIPE ( -29230 3542000 ) ( 2948850 3542000 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 3473080 ) ( 2953650 3473080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 3293080 ) ( 2953650 3293080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 3113080 ) ( 2953650 3113080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 2933080 ) ( 2953650 2933080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 2753080 ) ( 2953650 2753080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 2573080 ) ( 2953650 2573080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 2393080 ) ( 2953650 2393080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 2213080 ) ( 2953650 2213080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 2033080 ) ( 2953650 2033080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 1853080 ) ( 2953650 1853080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 1673080 ) ( 2953650 1673080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 1493080 ) ( 2953650 1493080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 1313080 ) ( 2953650 1313080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 1133080 ) ( 2953650 1133080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 953080 ) ( 2953650 953080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 773080 ) ( 2953650 773080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 593080 ) ( 2953650 593080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 413080 ) ( 2953650 413080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 233080 ) ( 2953650 233080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 53080 ) ( 2953650 53080 )
+ NEW met5 3100 + SHAPE STRIPE ( -29230 -22320 ) ( 2948850 -22320 )
+ NEW met4 3100 + SHAPE STRIPE ( 2747720 -28670 ) ( 2747720 3548350 )
+ NEW met4 3100 + SHAPE STRIPE ( 2567720 -28670 ) ( 2567720 3548350 )
+ NEW met4 3100 + SHAPE STRIPE ( 2387720 -28670 ) ( 2387720 3548350 )
+ NEW met4 3100 + SHAPE STRIPE ( 2207720 -28670 ) ( 2207720 3548350 )
+ NEW met4 3100 + SHAPE STRIPE ( 2027720 2300000 ) ( 2027720 3548350 )
+ NEW met4 3100 + SHAPE STRIPE ( 1847720 2300000 ) ( 1847720 3548350 )
+ NEW met4 3100 + SHAPE STRIPE ( 1667720 2300000 ) ( 1667720 3548350 )
+ NEW met4 3100 + SHAPE STRIPE ( 1487720 2300000 ) ( 1487720 3548350 )
+ NEW met4 3100 + SHAPE STRIPE ( 1307720 2300000 ) ( 1307720 3548350 )
+ NEW met4 3100 + SHAPE STRIPE ( 1127720 -28670 ) ( 1127720 3548350 )
+ NEW met4 3100 + SHAPE STRIPE ( 947720 -28670 ) ( 947720 3548350 )
+ NEW met4 3100 + SHAPE STRIPE ( 767720 -28670 ) ( 767720 3548350 )
+ NEW met4 3100 + SHAPE STRIPE ( 587720 -28670 ) ( 587720 3548350 )
+ NEW met4 3100 + SHAPE STRIPE ( 407720 -28670 ) ( 407720 3548350 )
+ NEW met4 3100 + SHAPE STRIPE ( 227720 -28670 ) ( 227720 3548350 )
+ NEW met4 3100 + SHAPE STRIPE ( 47720 -28670 ) ( 47720 3548350 )
+ NEW met4 3100 + SHAPE STRIPE ( 2947300 -23870 ) ( 2947300 3543550 )
+ NEW met4 3100 + SHAPE STRIPE ( -27680 -23870 ) ( -27680 3543550 )
+ NEW met4 3100 + SHAPE STRIPE ( 2027720 -28670 ) ( 2027720 1680000 )
+ NEW met4 3100 + SHAPE STRIPE ( 1847720 -28670 ) ( 1847720 1680000 )
+ NEW met4 3100 + SHAPE STRIPE ( 1667720 -28670 ) ( 1667720 1680000 )
+ NEW met4 3100 + SHAPE STRIPE ( 1487720 -28670 ) ( 1487720 1680000 )
+ NEW met4 3100 + SHAPE STRIPE ( 1307720 -28670 ) ( 1307720 1680000 ) ;
+ - vdda2 ( PIN vdda2 ) + USE POWER
+ + ROUTED met4 0 + SHAPE STRIPE ( 2956900 3551600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2766320 3551600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2586320 3551600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2406320 3551600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2226320 3551600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2046320 3551600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1866320 3551600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1686320 3551600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1506320 3551600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1326320 3551600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1146320 3551600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 966320 3551600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 786320 3551600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 606320 3551600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 426320 3551600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 246320 3551600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 66320 3551600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -37280 3551600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2956900 3491680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2766320 3491680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2586320 3491680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2406320 3491680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2226320 3491680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2046320 3491680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1866320 3491680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1686320 3491680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1506320 3491680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1326320 3491680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1146320 3491680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 966320 3491680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 786320 3491680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 606320 3491680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 426320 3491680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 246320 3491680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 66320 3491680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -37280 3491680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2956900 3311680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2766320 3311680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2586320 3311680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2406320 3311680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2226320 3311680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2046320 3311680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1866320 3311680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1686320 3311680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1506320 3311680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1326320 3311680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1146320 3311680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 966320 3311680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 786320 3311680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 606320 3311680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 426320 3311680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 246320 3311680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 66320 3311680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -37280 3311680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2956900 3131680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2766320 3131680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2586320 3131680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2406320 3131680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2226320 3131680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2046320 3131680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1866320 3131680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1686320 3131680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1506320 3131680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1326320 3131680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1146320 3131680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 966320 3131680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 786320 3131680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 606320 3131680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 426320 3131680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 246320 3131680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 66320 3131680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -37280 3131680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2956900 2951680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2766320 2951680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2586320 2951680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2406320 2951680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2226320 2951680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2046320 2951680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1866320 2951680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1686320 2951680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1506320 2951680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1326320 2951680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1146320 2951680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 966320 2951680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 786320 2951680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 606320 2951680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 426320 2951680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 246320 2951680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 66320 2951680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -37280 2951680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2956900 2771680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2766320 2771680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2586320 2771680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2406320 2771680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2226320 2771680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2046320 2771680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1866320 2771680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1686320 2771680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1506320 2771680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1326320 2771680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1146320 2771680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 966320 2771680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 786320 2771680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 606320 2771680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 426320 2771680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 246320 2771680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 66320 2771680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -37280 2771680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2956900 2591680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2766320 2591680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2586320 2591680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2406320 2591680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2226320 2591680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2046320 2591680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1866320 2591680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1686320 2591680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1506320 2591680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1326320 2591680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1146320 2591680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 966320 2591680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 786320 2591680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 606320 2591680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 426320 2591680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 246320 2591680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 66320 2591680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -37280 2591680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2956900 2411680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2766320 2411680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2586320 2411680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2406320 2411680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2226320 2411680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2046320 2411680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1866320 2411680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1686320 2411680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1506320 2411680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1326320 2411680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1146320 2411680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 966320 2411680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 786320 2411680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 606320 2411680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 426320 2411680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 246320 2411680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 66320 2411680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -37280 2411680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2956900 2231680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2766320 2231680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2586320 2231680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2406320 2231680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2226320 2231680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1146320 2231680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 966320 2231680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 786320 2231680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 606320 2231680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 426320 2231680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 246320 2231680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 66320 2231680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -37280 2231680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2956900 2051680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2766320 2051680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2586320 2051680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2406320 2051680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2226320 2051680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1146320 2051680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 966320 2051680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 786320 2051680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 606320 2051680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 426320 2051680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 246320 2051680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 66320 2051680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -37280 2051680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2956900 1871680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2766320 1871680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2586320 1871680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2406320 1871680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2226320 1871680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1146320 1871680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 966320 1871680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 786320 1871680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 606320 1871680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 426320 1871680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 246320 1871680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 66320 1871680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -37280 1871680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2956900 1691680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2766320 1691680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2586320 1691680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2406320 1691680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2226320 1691680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1146320 1691680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 966320 1691680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 786320 1691680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 606320 1691680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 426320 1691680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 246320 1691680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 66320 1691680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -37280 1691680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2956900 1511680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2766320 1511680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2586320 1511680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2406320 1511680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2226320 1511680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2046320 1511680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1866320 1511680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1686320 1511680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1506320 1511680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1326320 1511680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1146320 1511680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 966320 1511680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 786320 1511680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 606320 1511680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 426320 1511680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 246320 1511680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 66320 1511680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -37280 1511680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2956900 1331680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2766320 1331680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2586320 1331680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2406320 1331680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2226320 1331680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2046320 1331680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1866320 1331680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1686320 1331680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1506320 1331680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1326320 1331680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1146320 1331680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 966320 1331680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 786320 1331680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 606320 1331680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 426320 1331680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 246320 1331680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 66320 1331680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -37280 1331680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2956900 1151680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2766320 1151680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2586320 1151680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2406320 1151680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2226320 1151680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2046320 1151680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1866320 1151680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1686320 1151680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1506320 1151680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1326320 1151680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1146320 1151680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 966320 1151680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 786320 1151680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 606320 1151680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 426320 1151680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 246320 1151680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 66320 1151680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -37280 1151680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2956900 971680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2766320 971680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2586320 971680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2406320 971680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2226320 971680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2046320 971680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1866320 971680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1686320 971680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1506320 971680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1326320 971680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1146320 971680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 966320 971680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 786320 971680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 606320 971680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 426320 971680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 246320 971680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 66320 971680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -37280 971680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2956900 791680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2766320 791680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2586320 791680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2406320 791680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2226320 791680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2046320 791680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1866320 791680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1686320 791680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1506320 791680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1326320 791680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1146320 791680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 966320 791680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 786320 791680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 606320 791680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 426320 791680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 246320 791680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 66320 791680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -37280 791680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2956900 611680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2766320 611680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2586320 611680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2406320 611680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2226320 611680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2046320 611680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1866320 611680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1686320 611680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1506320 611680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1326320 611680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1146320 611680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 966320 611680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 786320 611680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 606320 611680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 426320 611680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 246320 611680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 66320 611680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -37280 611680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2956900 431680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2766320 431680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2586320 431680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2406320 431680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2226320 431680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2046320 431680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1866320 431680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1686320 431680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1506320 431680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1326320 431680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1146320 431680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 966320 431680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 786320 431680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 606320 431680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 426320 431680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 246320 431680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 66320 431680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -37280 431680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2956900 251680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2766320 251680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2586320 251680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2406320 251680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2226320 251680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2046320 251680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1866320 251680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1686320 251680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1506320 251680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1326320 251680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1146320 251680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 966320 251680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 786320 251680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 606320 251680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 426320 251680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 246320 251680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 66320 251680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -37280 251680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2956900 71680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2766320 71680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2586320 71680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2406320 71680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2226320 71680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2046320 71680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1866320 71680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1686320 71680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1506320 71680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1326320 71680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1146320 71680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 966320 71680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 786320 71680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 606320 71680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 426320 71680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 246320 71680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 66320 71680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -37280 71680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2956900 -31920 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2766320 -31920 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2586320 -31920 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2406320 -31920 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2226320 -31920 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2046320 -31920 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1866320 -31920 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1686320 -31920 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1506320 -31920 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1326320 -31920 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1146320 -31920 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 966320 -31920 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 786320 -31920 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 606320 -31920 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 426320 -31920 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 246320 -31920 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 66320 -31920 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -37280 -31920 ) via4_3100x3100
+ NEW met5 3100 + SHAPE STRIPE ( -38830 3551600 ) ( 2958450 3551600 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 3491680 ) ( 2963250 3491680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 3311680 ) ( 2963250 3311680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 3131680 ) ( 2963250 3131680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 2951680 ) ( 2963250 2951680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 2771680 ) ( 2963250 2771680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 2591680 ) ( 2963250 2591680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 2411680 ) ( 2963250 2411680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 2231680 ) ( 2963250 2231680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 2051680 ) ( 2963250 2051680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 1871680 ) ( 2963250 1871680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 1691680 ) ( 2963250 1691680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 1511680 ) ( 2963250 1511680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 1331680 ) ( 2963250 1331680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 1151680 ) ( 2963250 1151680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 971680 ) ( 2963250 971680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 791680 ) ( 2963250 791680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 611680 ) ( 2963250 611680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 431680 ) ( 2963250 431680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 251680 ) ( 2963250 251680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 71680 ) ( 2963250 71680 )
+ NEW met5 3100 + SHAPE STRIPE ( -38830 -31920 ) ( 2958450 -31920 )
+ NEW met4 3100 + SHAPE STRIPE ( 2766320 -38270 ) ( 2766320 3557950 )
+ NEW met4 3100 + SHAPE STRIPE ( 2586320 -38270 ) ( 2586320 3557950 )
+ NEW met4 3100 + SHAPE STRIPE ( 2406320 -38270 ) ( 2406320 3557950 )
+ NEW met4 3100 + SHAPE STRIPE ( 2226320 -38270 ) ( 2226320 3557950 )
+ NEW met4 3100 + SHAPE STRIPE ( 2046320 2300000 ) ( 2046320 3557950 )
+ NEW met4 3100 + SHAPE STRIPE ( 1866320 2300000 ) ( 1866320 3557950 )
+ NEW met4 3100 + SHAPE STRIPE ( 1686320 2300000 ) ( 1686320 3557950 )
+ NEW met4 3100 + SHAPE STRIPE ( 1506320 2300000 ) ( 1506320 3557950 )
+ NEW met4 3100 + SHAPE STRIPE ( 1326320 2300000 ) ( 1326320 3557950 )
+ NEW met4 3100 + SHAPE STRIPE ( 1146320 -38270 ) ( 1146320 3557950 )
+ NEW met4 3100 + SHAPE STRIPE ( 966320 -38270 ) ( 966320 3557950 )
+ NEW met4 3100 + SHAPE STRIPE ( 786320 -38270 ) ( 786320 3557950 )
+ NEW met4 3100 + SHAPE STRIPE ( 606320 -38270 ) ( 606320 3557950 )
+ NEW met4 3100 + SHAPE STRIPE ( 426320 -38270 ) ( 426320 3557950 )
+ NEW met4 3100 + SHAPE STRIPE ( 246320 -38270 ) ( 246320 3557950 )
+ NEW met4 3100 + SHAPE STRIPE ( 66320 -38270 ) ( 66320 3557950 )
+ NEW met4 3100 + SHAPE STRIPE ( 2956900 -33470 ) ( 2956900 3553150 )
+ NEW met4 3100 + SHAPE STRIPE ( -37280 -33470 ) ( -37280 3553150 )
+ NEW met4 3100 + SHAPE STRIPE ( 2046320 -38270 ) ( 2046320 1680000 )
+ NEW met4 3100 + SHAPE STRIPE ( 1866320 -38270 ) ( 1866320 1680000 )
+ NEW met4 3100 + SHAPE STRIPE ( 1686320 -38270 ) ( 1686320 1680000 )
+ NEW met4 3100 + SHAPE STRIPE ( 1506320 -38270 ) ( 1506320 1680000 )
+ NEW met4 3100 + SHAPE STRIPE ( 1326320 -38270 ) ( 1326320 1680000 ) ;
+ - vssa1 ( PIN vssa1 ) + USE GROUND
+ + ROUTED met4 0 + SHAPE STRIPE ( 2952100 3546800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2837720 3546800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2657720 3546800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2477720 3546800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2297720 3546800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2117720 3546800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1937720 3546800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1757720 3546800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1577720 3546800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1397720 3546800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1217720 3546800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1037720 3546800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 857720 3546800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 677720 3546800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 497720 3546800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 317720 3546800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 137720 3546800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -32480 3546800 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2952100 3383080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2837720 3383080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2657720 3383080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2477720 3383080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2297720 3383080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2117720 3383080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1937720 3383080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1757720 3383080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1577720 3383080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1397720 3383080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1217720 3383080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1037720 3383080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 857720 3383080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 677720 3383080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 497720 3383080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 317720 3383080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 137720 3383080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -32480 3383080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2952100 3203080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2837720 3203080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2657720 3203080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2477720 3203080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2297720 3203080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2117720 3203080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1937720 3203080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1757720 3203080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1577720 3203080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1397720 3203080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1217720 3203080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1037720 3203080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 857720 3203080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 677720 3203080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 497720 3203080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 317720 3203080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 137720 3203080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -32480 3203080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2952100 3023080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2837720 3023080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2657720 3023080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2477720 3023080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2297720 3023080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2117720 3023080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1937720 3023080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1757720 3023080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1577720 3023080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1397720 3023080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1217720 3023080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1037720 3023080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 857720 3023080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 677720 3023080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 497720 3023080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 317720 3023080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 137720 3023080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -32480 3023080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2952100 2843080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2837720 2843080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2657720 2843080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2477720 2843080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2297720 2843080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2117720 2843080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1937720 2843080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1757720 2843080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1577720 2843080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1397720 2843080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1217720 2843080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1037720 2843080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 857720 2843080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 677720 2843080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 497720 2843080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 317720 2843080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 137720 2843080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -32480 2843080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2952100 2663080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2837720 2663080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2657720 2663080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2477720 2663080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2297720 2663080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2117720 2663080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1937720 2663080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1757720 2663080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1577720 2663080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1397720 2663080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1217720 2663080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1037720 2663080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 857720 2663080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 677720 2663080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 497720 2663080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 317720 2663080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 137720 2663080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -32480 2663080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2952100 2483080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2837720 2483080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2657720 2483080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2477720 2483080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2297720 2483080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2117720 2483080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1937720 2483080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1757720 2483080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1577720 2483080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1397720 2483080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1217720 2483080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1037720 2483080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 857720 2483080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 677720 2483080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 497720 2483080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 317720 2483080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 137720 2483080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -32480 2483080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2952100 2303080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2837720 2303080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2657720 2303080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2477720 2303080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2297720 2303080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2117720 2303080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1937720 2303080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1757720 2303080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1577720 2303080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1397720 2303080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1217720 2303080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1037720 2303080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 857720 2303080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 677720 2303080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 497720 2303080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 317720 2303080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 137720 2303080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -32480 2303080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2952100 2123080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2837720 2123080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2657720 2123080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2477720 2123080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2297720 2123080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2117720 2123080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1037720 2123080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 857720 2123080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 677720 2123080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 497720 2123080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 317720 2123080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 137720 2123080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -32480 2123080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2952100 1943080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2837720 1943080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2657720 1943080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2477720 1943080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2297720 1943080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2117720 1943080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1037720 1943080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 857720 1943080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 677720 1943080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 497720 1943080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 317720 1943080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 137720 1943080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -32480 1943080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2952100 1763080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2837720 1763080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2657720 1763080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2477720 1763080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2297720 1763080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2117720 1763080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1037720 1763080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 857720 1763080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 677720 1763080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 497720 1763080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 317720 1763080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 137720 1763080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -32480 1763080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2952100 1583080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2837720 1583080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2657720 1583080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2477720 1583080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2297720 1583080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2117720 1583080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1937720 1583080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1757720 1583080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1577720 1583080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1397720 1583080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1217720 1583080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1037720 1583080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 857720 1583080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 677720 1583080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 497720 1583080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 317720 1583080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 137720 1583080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -32480 1583080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2952100 1403080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2837720 1403080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2657720 1403080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2477720 1403080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2297720 1403080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2117720 1403080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1937720 1403080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1757720 1403080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1577720 1403080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1397720 1403080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1217720 1403080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1037720 1403080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 857720 1403080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 677720 1403080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 497720 1403080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 317720 1403080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 137720 1403080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -32480 1403080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2952100 1223080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2837720 1223080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2657720 1223080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2477720 1223080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2297720 1223080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2117720 1223080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1937720 1223080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1757720 1223080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1577720 1223080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1397720 1223080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1217720 1223080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1037720 1223080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 857720 1223080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 677720 1223080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 497720 1223080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 317720 1223080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 137720 1223080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -32480 1223080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2952100 1043080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2837720 1043080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2657720 1043080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2477720 1043080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2297720 1043080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2117720 1043080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1937720 1043080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1757720 1043080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1577720 1043080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1397720 1043080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1217720 1043080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1037720 1043080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 857720 1043080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 677720 1043080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 497720 1043080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 317720 1043080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 137720 1043080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -32480 1043080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2952100 863080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2837720 863080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2657720 863080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2477720 863080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2297720 863080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2117720 863080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1937720 863080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1757720 863080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1577720 863080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1397720 863080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1217720 863080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1037720 863080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 857720 863080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 677720 863080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 497720 863080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 317720 863080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 137720 863080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -32480 863080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2952100 683080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2837720 683080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2657720 683080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2477720 683080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2297720 683080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2117720 683080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1937720 683080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1757720 683080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1577720 683080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1397720 683080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1217720 683080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1037720 683080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 857720 683080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 677720 683080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 497720 683080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 317720 683080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 137720 683080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -32480 683080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2952100 503080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2837720 503080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2657720 503080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2477720 503080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2297720 503080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2117720 503080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1937720 503080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1757720 503080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1577720 503080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1397720 503080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1217720 503080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1037720 503080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 857720 503080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 677720 503080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 497720 503080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 317720 503080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 137720 503080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -32480 503080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2952100 323080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2837720 323080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2657720 323080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2477720 323080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2297720 323080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2117720 323080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1937720 323080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1757720 323080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1577720 323080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1397720 323080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1217720 323080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1037720 323080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 857720 323080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 677720 323080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 497720 323080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 317720 323080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 137720 323080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -32480 323080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2952100 143080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2837720 143080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2657720 143080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2477720 143080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2297720 143080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2117720 143080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1937720 143080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1757720 143080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1577720 143080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1397720 143080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1217720 143080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1037720 143080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 857720 143080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 677720 143080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 497720 143080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 317720 143080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 137720 143080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -32480 143080 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2952100 -27120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2837720 -27120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2657720 -27120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2477720 -27120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2297720 -27120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2117720 -27120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1937720 -27120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1757720 -27120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1577720 -27120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1397720 -27120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1217720 -27120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1037720 -27120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 857720 -27120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 677720 -27120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 497720 -27120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 317720 -27120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 137720 -27120 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -32480 -27120 ) via4_3100x3100
+ NEW met5 3100 + SHAPE STRIPE ( -34030 3546800 ) ( 2953650 3546800 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 3383080 ) ( 2953650 3383080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 3203080 ) ( 2953650 3203080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 3023080 ) ( 2953650 3023080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 2843080 ) ( 2953650 2843080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 2663080 ) ( 2953650 2663080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 2483080 ) ( 2953650 2483080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 2303080 ) ( 2953650 2303080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 2123080 ) ( 2953650 2123080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 1943080 ) ( 2953650 1943080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 1763080 ) ( 2953650 1763080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 1583080 ) ( 2953650 1583080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 1403080 ) ( 2953650 1403080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 1223080 ) ( 2953650 1223080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 1043080 ) ( 2953650 1043080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 863080 ) ( 2953650 863080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 683080 ) ( 2953650 683080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 503080 ) ( 2953650 503080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 323080 ) ( 2953650 323080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 143080 ) ( 2953650 143080 )
+ NEW met5 3100 + SHAPE STRIPE ( -34030 -27120 ) ( 2953650 -27120 )
+ NEW met4 3100 + SHAPE STRIPE ( 2952100 -28670 ) ( 2952100 3548350 )
+ NEW met4 3100 + SHAPE STRIPE ( 2837720 -28670 ) ( 2837720 3548350 )
+ NEW met4 3100 + SHAPE STRIPE ( 2657720 -28670 ) ( 2657720 3548350 )
+ NEW met4 3100 + SHAPE STRIPE ( 2477720 -28670 ) ( 2477720 3548350 )
+ NEW met4 3100 + SHAPE STRIPE ( 2297720 -28670 ) ( 2297720 3548350 )
+ NEW met4 3100 + SHAPE STRIPE ( 2117720 -28670 ) ( 2117720 3548350 )
+ NEW met4 3100 + SHAPE STRIPE ( 1937720 2300000 ) ( 1937720 3548350 )
+ NEW met4 3100 + SHAPE STRIPE ( 1757720 2300000 ) ( 1757720 3548350 )
+ NEW met4 3100 + SHAPE STRIPE ( 1577720 2300000 ) ( 1577720 3548350 )
+ NEW met4 3100 + SHAPE STRIPE ( 1397720 2300000 ) ( 1397720 3548350 )
+ NEW met4 3100 + SHAPE STRIPE ( 1217720 2300000 ) ( 1217720 3548350 )
+ NEW met4 3100 + SHAPE STRIPE ( 1037720 -28670 ) ( 1037720 3548350 )
+ NEW met4 3100 + SHAPE STRIPE ( 857720 -28670 ) ( 857720 3548350 )
+ NEW met4 3100 + SHAPE STRIPE ( 677720 -28670 ) ( 677720 3548350 )
+ NEW met4 3100 + SHAPE STRIPE ( 497720 -28670 ) ( 497720 3548350 )
+ NEW met4 3100 + SHAPE STRIPE ( 317720 -28670 ) ( 317720 3548350 )
+ NEW met4 3100 + SHAPE STRIPE ( 137720 -28670 ) ( 137720 3548350 )
+ NEW met4 3100 + SHAPE STRIPE ( -32480 -28670 ) ( -32480 3548350 )
+ NEW met4 3100 + SHAPE STRIPE ( 1937720 -28670 ) ( 1937720 1680000 )
+ NEW met4 3100 + SHAPE STRIPE ( 1757720 -28670 ) ( 1757720 1680000 )
+ NEW met4 3100 + SHAPE STRIPE ( 1577720 -28670 ) ( 1577720 1680000 )
+ NEW met4 3100 + SHAPE STRIPE ( 1397720 -28670 ) ( 1397720 1680000 )
+ NEW met4 3100 + SHAPE STRIPE ( 1217720 -28670 ) ( 1217720 1680000 ) ;
+ - vssa2 ( PIN vssa2 ) + USE GROUND
+ + ROUTED met4 0 + SHAPE STRIPE ( 2961700 3556400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2856320 3556400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2676320 3556400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2496320 3556400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2316320 3556400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2136320 3556400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1956320 3556400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1776320 3556400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1596320 3556400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1416320 3556400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1236320 3556400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1056320 3556400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 876320 3556400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 696320 3556400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 516320 3556400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 336320 3556400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 156320 3556400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -42080 3556400 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2961700 3401680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2856320 3401680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2676320 3401680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2496320 3401680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2316320 3401680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2136320 3401680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1956320 3401680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1776320 3401680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1596320 3401680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1416320 3401680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1236320 3401680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1056320 3401680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 876320 3401680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 696320 3401680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 516320 3401680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 336320 3401680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 156320 3401680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -42080 3401680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2961700 3221680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2856320 3221680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2676320 3221680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2496320 3221680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2316320 3221680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2136320 3221680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1956320 3221680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1776320 3221680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1596320 3221680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1416320 3221680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1236320 3221680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1056320 3221680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 876320 3221680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 696320 3221680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 516320 3221680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 336320 3221680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 156320 3221680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -42080 3221680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2961700 3041680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2856320 3041680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2676320 3041680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2496320 3041680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2316320 3041680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2136320 3041680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1956320 3041680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1776320 3041680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1596320 3041680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1416320 3041680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1236320 3041680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1056320 3041680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 876320 3041680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 696320 3041680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 516320 3041680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 336320 3041680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 156320 3041680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -42080 3041680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2961700 2861680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2856320 2861680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2676320 2861680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2496320 2861680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2316320 2861680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2136320 2861680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1956320 2861680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1776320 2861680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1596320 2861680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1416320 2861680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1236320 2861680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1056320 2861680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 876320 2861680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 696320 2861680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 516320 2861680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 336320 2861680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 156320 2861680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -42080 2861680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2961700 2681680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2856320 2681680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2676320 2681680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2496320 2681680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2316320 2681680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2136320 2681680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1956320 2681680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1776320 2681680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1596320 2681680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1416320 2681680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1236320 2681680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1056320 2681680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 876320 2681680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 696320 2681680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 516320 2681680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 336320 2681680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 156320 2681680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -42080 2681680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2961700 2501680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2856320 2501680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2676320 2501680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2496320 2501680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2316320 2501680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2136320 2501680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1956320 2501680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1776320 2501680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1596320 2501680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1416320 2501680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1236320 2501680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1056320 2501680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 876320 2501680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 696320 2501680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 516320 2501680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 336320 2501680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 156320 2501680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -42080 2501680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2961700 2321680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2856320 2321680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2676320 2321680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2496320 2321680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2316320 2321680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2136320 2321680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1956320 2321680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1776320 2321680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1596320 2321680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1416320 2321680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1236320 2321680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1056320 2321680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 876320 2321680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 696320 2321680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 516320 2321680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 336320 2321680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 156320 2321680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -42080 2321680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2961700 2141680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2856320 2141680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2676320 2141680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2496320 2141680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2316320 2141680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2136320 2141680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1056320 2141680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 876320 2141680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 696320 2141680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 516320 2141680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 336320 2141680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 156320 2141680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -42080 2141680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2961700 1961680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2856320 1961680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2676320 1961680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2496320 1961680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2316320 1961680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2136320 1961680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1056320 1961680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 876320 1961680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 696320 1961680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 516320 1961680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 336320 1961680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 156320 1961680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -42080 1961680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2961700 1781680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2856320 1781680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2676320 1781680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2496320 1781680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2316320 1781680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2136320 1781680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1056320 1781680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 876320 1781680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 696320 1781680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 516320 1781680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 336320 1781680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 156320 1781680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -42080 1781680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2961700 1601680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2856320 1601680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2676320 1601680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2496320 1601680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2316320 1601680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2136320 1601680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1956320 1601680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1776320 1601680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1596320 1601680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1416320 1601680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1236320 1601680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1056320 1601680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 876320 1601680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 696320 1601680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 516320 1601680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 336320 1601680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 156320 1601680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -42080 1601680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2961700 1421680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2856320 1421680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2676320 1421680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2496320 1421680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2316320 1421680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2136320 1421680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1956320 1421680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1776320 1421680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1596320 1421680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1416320 1421680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1236320 1421680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1056320 1421680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 876320 1421680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 696320 1421680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 516320 1421680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 336320 1421680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 156320 1421680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -42080 1421680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2961700 1241680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2856320 1241680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2676320 1241680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2496320 1241680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2316320 1241680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2136320 1241680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1956320 1241680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1776320 1241680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1596320 1241680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1416320 1241680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1236320 1241680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1056320 1241680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 876320 1241680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 696320 1241680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 516320 1241680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 336320 1241680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 156320 1241680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -42080 1241680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2961700 1061680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2856320 1061680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2676320 1061680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2496320 1061680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2316320 1061680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2136320 1061680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1956320 1061680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1776320 1061680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1596320 1061680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1416320 1061680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1236320 1061680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1056320 1061680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 876320 1061680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 696320 1061680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 516320 1061680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 336320 1061680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 156320 1061680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -42080 1061680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2961700 881680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2856320 881680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2676320 881680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2496320 881680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2316320 881680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2136320 881680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1956320 881680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1776320 881680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1596320 881680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1416320 881680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1236320 881680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1056320 881680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 876320 881680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 696320 881680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 516320 881680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 336320 881680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 156320 881680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -42080 881680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2961700 701680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2856320 701680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2676320 701680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2496320 701680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2316320 701680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2136320 701680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1956320 701680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1776320 701680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1596320 701680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1416320 701680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1236320 701680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1056320 701680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 876320 701680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 696320 701680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 516320 701680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 336320 701680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 156320 701680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -42080 701680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2961700 521680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2856320 521680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2676320 521680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2496320 521680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2316320 521680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2136320 521680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1956320 521680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1776320 521680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1596320 521680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1416320 521680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1236320 521680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1056320 521680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 876320 521680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 696320 521680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 516320 521680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 336320 521680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 156320 521680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -42080 521680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2961700 341680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2856320 341680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2676320 341680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2496320 341680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2316320 341680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2136320 341680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1956320 341680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1776320 341680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1596320 341680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1416320 341680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1236320 341680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1056320 341680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 876320 341680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 696320 341680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 516320 341680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 336320 341680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 156320 341680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -42080 341680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2961700 161680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2856320 161680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2676320 161680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2496320 161680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2316320 161680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2136320 161680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1956320 161680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1776320 161680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1596320 161680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1416320 161680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1236320 161680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1056320 161680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 876320 161680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 696320 161680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 516320 161680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 336320 161680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 156320 161680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -42080 161680 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2961700 -36720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2856320 -36720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2676320 -36720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2496320 -36720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2316320 -36720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2136320 -36720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1956320 -36720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1776320 -36720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1596320 -36720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1416320 -36720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1236320 -36720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1056320 -36720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 876320 -36720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 696320 -36720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 516320 -36720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 336320 -36720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 156320 -36720 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -42080 -36720 ) via4_3100x3100
+ NEW met5 3100 + SHAPE STRIPE ( -43630 3556400 ) ( 2963250 3556400 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 3401680 ) ( 2963250 3401680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 3221680 ) ( 2963250 3221680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 3041680 ) ( 2963250 3041680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 2861680 ) ( 2963250 2861680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 2681680 ) ( 2963250 2681680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 2501680 ) ( 2963250 2501680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 2321680 ) ( 2963250 2321680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 2141680 ) ( 2963250 2141680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 1961680 ) ( 2963250 1961680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 1781680 ) ( 2963250 1781680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 1601680 ) ( 2963250 1601680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 1421680 ) ( 2963250 1421680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 1241680 ) ( 2963250 1241680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 1061680 ) ( 2963250 1061680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 881680 ) ( 2963250 881680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 701680 ) ( 2963250 701680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 521680 ) ( 2963250 521680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 341680 ) ( 2963250 341680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 161680 ) ( 2963250 161680 )
+ NEW met5 3100 + SHAPE STRIPE ( -43630 -36720 ) ( 2963250 -36720 )
+ NEW met4 3100 + SHAPE STRIPE ( 2961700 -38270 ) ( 2961700 3557950 )
+ NEW met4 3100 + SHAPE STRIPE ( 2856320 -38270 ) ( 2856320 3557950 )
+ NEW met4 3100 + SHAPE STRIPE ( 2676320 -38270 ) ( 2676320 3557950 )
+ NEW met4 3100 + SHAPE STRIPE ( 2496320 -38270 ) ( 2496320 3557950 )
+ NEW met4 3100 + SHAPE STRIPE ( 2316320 -38270 ) ( 2316320 3557950 )
+ NEW met4 3100 + SHAPE STRIPE ( 2136320 -38270 ) ( 2136320 3557950 )
+ NEW met4 3100 + SHAPE STRIPE ( 1956320 2300000 ) ( 1956320 3557950 )
+ NEW met4 3100 + SHAPE STRIPE ( 1776320 2300000 ) ( 1776320 3557950 )
+ NEW met4 3100 + SHAPE STRIPE ( 1596320 2300000 ) ( 1596320 3557950 )
+ NEW met4 3100 + SHAPE STRIPE ( 1416320 2300000 ) ( 1416320 3557950 )
+ NEW met4 3100 + SHAPE STRIPE ( 1236320 2300000 ) ( 1236320 3557950 )
+ NEW met4 3100 + SHAPE STRIPE ( 1056320 -38270 ) ( 1056320 3557950 )
+ NEW met4 3100 + SHAPE STRIPE ( 876320 -38270 ) ( 876320 3557950 )
+ NEW met4 3100 + SHAPE STRIPE ( 696320 -38270 ) ( 696320 3557950 )
+ NEW met4 3100 + SHAPE STRIPE ( 516320 -38270 ) ( 516320 3557950 )
+ NEW met4 3100 + SHAPE STRIPE ( 336320 -38270 ) ( 336320 3557950 )
+ NEW met4 3100 + SHAPE STRIPE ( 156320 -38270 ) ( 156320 3557950 )
+ NEW met4 3100 + SHAPE STRIPE ( -42080 -38270 ) ( -42080 3557950 )
+ NEW met4 3100 + SHAPE STRIPE ( 1956320 -38270 ) ( 1956320 1680000 )
+ NEW met4 3100 + SHAPE STRIPE ( 1776320 -38270 ) ( 1776320 1680000 )
+ NEW met4 3100 + SHAPE STRIPE ( 1596320 -38270 ) ( 1596320 1680000 )
+ NEW met4 3100 + SHAPE STRIPE ( 1416320 -38270 ) ( 1416320 1680000 )
+ NEW met4 3100 + SHAPE STRIPE ( 1236320 -38270 ) ( 1236320 1680000 ) ;
+ - vssd1 ( PIN vssd1 ) + USE GROUND
+ + ROUTED met4 0 + SHAPE STRIPE ( 2041640 2265880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1888040 2265880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1734440 2265880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1580840 2265880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1427240 2265880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1273640 2265880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 2041640 2085880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1888040 2085880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1734440 2085880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1580840 2085880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1427240 2085880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1273640 2085880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 2041640 1905880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1888040 1905880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1734440 1905880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1580840 1905880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1427240 1905880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1273640 1905880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 2041640 1725880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1888040 1725880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1734440 1725880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1580840 1725880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1427240 1725880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 1273640 1725880 ) via4_1600x3100
+ NEW met4 0 + SHAPE STRIPE ( 2932900 3527600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2800520 3527600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2620520 3527600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2440520 3527600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2260520 3527600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2080520 3527600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1900520 3527600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1720520 3527600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1540520 3527600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1360520 3527600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1180520 3527600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1000520 3527600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 820520 3527600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 640520 3527600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 460520 3527600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 280520 3527600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 100520 3527600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -13280 3527600 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2932900 3345880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2800520 3345880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2620520 3345880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2440520 3345880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2260520 3345880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2080520 3345880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1900520 3345880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1720520 3345880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1540520 3345880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1360520 3345880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1180520 3345880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1000520 3345880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 820520 3345880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 640520 3345880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 460520 3345880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 280520 3345880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 100520 3345880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -13280 3345880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2932900 3165880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2800520 3165880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2620520 3165880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2440520 3165880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2260520 3165880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2080520 3165880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1900520 3165880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1720520 3165880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1540520 3165880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1360520 3165880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1180520 3165880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1000520 3165880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 820520 3165880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 640520 3165880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 460520 3165880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 280520 3165880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 100520 3165880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -13280 3165880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2932900 2985880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2800520 2985880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2620520 2985880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2440520 2985880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2260520 2985880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2080520 2985880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1900520 2985880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1720520 2985880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1540520 2985880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1360520 2985880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1180520 2985880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1000520 2985880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 820520 2985880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 640520 2985880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 460520 2985880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 280520 2985880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 100520 2985880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -13280 2985880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2932900 2805880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2800520 2805880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2620520 2805880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2440520 2805880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2260520 2805880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2080520 2805880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1900520 2805880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1720520 2805880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1540520 2805880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1360520 2805880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1180520 2805880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1000520 2805880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 820520 2805880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 640520 2805880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 460520 2805880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 280520 2805880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 100520 2805880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -13280 2805880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2932900 2625880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2800520 2625880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2620520 2625880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2440520 2625880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2260520 2625880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2080520 2625880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1900520 2625880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1720520 2625880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1540520 2625880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1360520 2625880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1180520 2625880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1000520 2625880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 820520 2625880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 640520 2625880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 460520 2625880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 280520 2625880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 100520 2625880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -13280 2625880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2932900 2445880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2800520 2445880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2620520 2445880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2440520 2445880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2260520 2445880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2080520 2445880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1900520 2445880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1720520 2445880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1540520 2445880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1360520 2445880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1180520 2445880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1000520 2445880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 820520 2445880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 640520 2445880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 460520 2445880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 280520 2445880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 100520 2445880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -13280 2445880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2932900 2265880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2800520 2265880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2620520 2265880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2440520 2265880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2260520 2265880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1000520 2265880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 820520 2265880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 640520 2265880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 460520 2265880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 280520 2265880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 100520 2265880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -13280 2265880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2932900 2085880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2800520 2085880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2620520 2085880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2440520 2085880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2260520 2085880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1000520 2085880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 820520 2085880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 640520 2085880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 460520 2085880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 280520 2085880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 100520 2085880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -13280 2085880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2932900 1905880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2800520 1905880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2620520 1905880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2440520 1905880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2260520 1905880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1000520 1905880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 820520 1905880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 640520 1905880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 460520 1905880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 280520 1905880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 100520 1905880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -13280 1905880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2932900 1725880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2800520 1725880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2620520 1725880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2440520 1725880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2260520 1725880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1000520 1725880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 820520 1725880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 640520 1725880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 460520 1725880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 280520 1725880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 100520 1725880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -13280 1725880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2932900 1545880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2800520 1545880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2620520 1545880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2440520 1545880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2260520 1545880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2080520 1545880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1900520 1545880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1720520 1545880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1540520 1545880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1360520 1545880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1180520 1545880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1000520 1545880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 820520 1545880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 640520 1545880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 460520 1545880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 280520 1545880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 100520 1545880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -13280 1545880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2932900 1365880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2800520 1365880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2620520 1365880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2440520 1365880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2260520 1365880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2080520 1365880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1900520 1365880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1720520 1365880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1540520 1365880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1360520 1365880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1180520 1365880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1000520 1365880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 820520 1365880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 640520 1365880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 460520 1365880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 280520 1365880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 100520 1365880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -13280 1365880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2932900 1185880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2800520 1185880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2620520 1185880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2440520 1185880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2260520 1185880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2080520 1185880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1900520 1185880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1720520 1185880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1540520 1185880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1360520 1185880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1180520 1185880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1000520 1185880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 820520 1185880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 640520 1185880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 460520 1185880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 280520 1185880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 100520 1185880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -13280 1185880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2932900 1005880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2800520 1005880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2620520 1005880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2440520 1005880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2260520 1005880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2080520 1005880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1900520 1005880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1720520 1005880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1540520 1005880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1360520 1005880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1180520 1005880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1000520 1005880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 820520 1005880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 640520 1005880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 460520 1005880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 280520 1005880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 100520 1005880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -13280 1005880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2932900 825880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2800520 825880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2620520 825880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2440520 825880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2260520 825880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2080520 825880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1900520 825880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1720520 825880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1540520 825880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1360520 825880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1180520 825880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1000520 825880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 820520 825880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 640520 825880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 460520 825880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 280520 825880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 100520 825880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -13280 825880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2932900 645880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2800520 645880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2620520 645880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2440520 645880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2260520 645880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2080520 645880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1900520 645880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1720520 645880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1540520 645880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1360520 645880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1180520 645880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1000520 645880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 820520 645880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 640520 645880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 460520 645880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 280520 645880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 100520 645880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -13280 645880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2932900 465880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2800520 465880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2620520 465880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2440520 465880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2260520 465880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2080520 465880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1900520 465880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1720520 465880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1540520 465880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1360520 465880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1180520 465880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1000520 465880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 820520 465880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 640520 465880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 460520 465880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 280520 465880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 100520 465880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -13280 465880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2932900 285880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2800520 285880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2620520 285880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2440520 285880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2260520 285880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2080520 285880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1900520 285880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1720520 285880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1540520 285880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1360520 285880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1180520 285880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1000520 285880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 820520 285880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 640520 285880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 460520 285880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 280520 285880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 100520 285880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -13280 285880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2932900 105880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2800520 105880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2620520 105880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2440520 105880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2260520 105880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2080520 105880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1900520 105880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1720520 105880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1540520 105880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1360520 105880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1180520 105880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1000520 105880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 820520 105880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 640520 105880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 460520 105880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 280520 105880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 100520 105880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -13280 105880 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2932900 -7920 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2800520 -7920 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2620520 -7920 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2440520 -7920 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2260520 -7920 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2080520 -7920 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1900520 -7920 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1720520 -7920 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1540520 -7920 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1360520 -7920 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1180520 -7920 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1000520 -7920 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 820520 -7920 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 640520 -7920 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 460520 -7920 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 280520 -7920 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 100520 -7920 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -13280 -7920 ) via4_3100x3100
+ NEW met5 3100 + SHAPE STRIPE ( -14830 3527600 ) ( 2934450 3527600 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 3345880 ) ( 2934450 3345880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 3165880 ) ( 2934450 3165880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 2985880 ) ( 2934450 2985880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 2805880 ) ( 2934450 2805880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 2625880 ) ( 2934450 2625880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 2445880 ) ( 2934450 2445880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 2265880 ) ( 2934450 2265880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 2085880 ) ( 2934450 2085880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 1905880 ) ( 2934450 1905880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 1725880 ) ( 2934450 1725880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 1545880 ) ( 2934450 1545880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 1365880 ) ( 2934450 1365880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 1185880 ) ( 2934450 1185880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 1005880 ) ( 2934450 1005880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 825880 ) ( 2934450 825880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 645880 ) ( 2934450 645880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 465880 ) ( 2934450 465880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 285880 ) ( 2934450 285880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 105880 ) ( 2934450 105880 )
+ NEW met5 3100 + SHAPE STRIPE ( -14830 -7920 ) ( 2934450 -7920 )
+ NEW met4 3100 + SHAPE STRIPE ( 2932900 -9470 ) ( 2932900 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( 2800520 -9470 ) ( 2800520 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( 2620520 -9470 ) ( 2620520 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( 2440520 -9470 ) ( 2440520 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( 2260520 -9470 ) ( 2260520 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( 2080520 2300000 ) ( 2080520 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( 1900520 2300000 ) ( 1900520 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( 1720520 2300000 ) ( 1720520 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( 1540520 2300000 ) ( 1540520 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( 1360520 2300000 ) ( 1360520 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( 1180520 2300000 ) ( 1180520 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( 1000520 -9470 ) ( 1000520 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( 820520 -9470 ) ( 820520 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( 640520 -9470 ) ( 640520 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( 460520 -9470 ) ( 460520 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( 280520 -9470 ) ( 280520 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( 100520 -9470 ) ( 100520 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( -13280 -9470 ) ( -13280 3529150 )
+ NEW met4 3100 + SHAPE STRIPE ( 2080520 -9470 ) ( 2080520 1680000 )
+ NEW met4 3100 + SHAPE STRIPE ( 1900520 -9470 ) ( 1900520 1680000 )
+ NEW met4 3100 + SHAPE STRIPE ( 1720520 -9470 ) ( 1720520 1680000 )
+ NEW met4 3100 + SHAPE STRIPE ( 1540520 -9470 ) ( 1540520 1680000 )
+ NEW met4 3100 + SHAPE STRIPE ( 1360520 -9470 ) ( 1360520 1680000 )
+ NEW met4 3100 + SHAPE STRIPE ( 1180520 -9470 ) ( 1180520 1680000 ) ;
+ - vssd2 ( PIN vssd2 ) + USE GROUND
+ + ROUTED met4 0 + SHAPE STRIPE ( 2942500 3537200 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2819120 3537200 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2639120 3537200 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2459120 3537200 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2279120 3537200 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2099120 3537200 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1919120 3537200 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1739120 3537200 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1559120 3537200 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1379120 3537200 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1199120 3537200 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1019120 3537200 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 839120 3537200 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 659120 3537200 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 479120 3537200 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 299120 3537200 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 119120 3537200 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -22880 3537200 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2942500 3364480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2819120 3364480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2639120 3364480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2459120 3364480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2279120 3364480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2099120 3364480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1919120 3364480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1739120 3364480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1559120 3364480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1379120 3364480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1199120 3364480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1019120 3364480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 839120 3364480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 659120 3364480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 479120 3364480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 299120 3364480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 119120 3364480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -22880 3364480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2942500 3184480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2819120 3184480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2639120 3184480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2459120 3184480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2279120 3184480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2099120 3184480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1919120 3184480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1739120 3184480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1559120 3184480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1379120 3184480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1199120 3184480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1019120 3184480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 839120 3184480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 659120 3184480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 479120 3184480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 299120 3184480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 119120 3184480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -22880 3184480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2942500 3004480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2819120 3004480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2639120 3004480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2459120 3004480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2279120 3004480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2099120 3004480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1919120 3004480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1739120 3004480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1559120 3004480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1379120 3004480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1199120 3004480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1019120 3004480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 839120 3004480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 659120 3004480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 479120 3004480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 299120 3004480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 119120 3004480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -22880 3004480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2942500 2824480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2819120 2824480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2639120 2824480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2459120 2824480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2279120 2824480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2099120 2824480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1919120 2824480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1739120 2824480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1559120 2824480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1379120 2824480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1199120 2824480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1019120 2824480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 839120 2824480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 659120 2824480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 479120 2824480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 299120 2824480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 119120 2824480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -22880 2824480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2942500 2644480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2819120 2644480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2639120 2644480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2459120 2644480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2279120 2644480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2099120 2644480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1919120 2644480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1739120 2644480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1559120 2644480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1379120 2644480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1199120 2644480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1019120 2644480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 839120 2644480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 659120 2644480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 479120 2644480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 299120 2644480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 119120 2644480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -22880 2644480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2942500 2464480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2819120 2464480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2639120 2464480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2459120 2464480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2279120 2464480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2099120 2464480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1919120 2464480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1739120 2464480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1559120 2464480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1379120 2464480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1199120 2464480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1019120 2464480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 839120 2464480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 659120 2464480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 479120 2464480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 299120 2464480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 119120 2464480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -22880 2464480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2942500 2284480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2819120 2284480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2639120 2284480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2459120 2284480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2279120 2284480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2099120 2284480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1019120 2284480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 839120 2284480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 659120 2284480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 479120 2284480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 299120 2284480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 119120 2284480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -22880 2284480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2942500 2104480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2819120 2104480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2639120 2104480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2459120 2104480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2279120 2104480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2099120 2104480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1019120 2104480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 839120 2104480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 659120 2104480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 479120 2104480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 299120 2104480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 119120 2104480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -22880 2104480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2942500 1924480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2819120 1924480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2639120 1924480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2459120 1924480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2279120 1924480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2099120 1924480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1019120 1924480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 839120 1924480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 659120 1924480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 479120 1924480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 299120 1924480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 119120 1924480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -22880 1924480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2942500 1744480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2819120 1744480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2639120 1744480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2459120 1744480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2279120 1744480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2099120 1744480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1019120 1744480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 839120 1744480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 659120 1744480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 479120 1744480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 299120 1744480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 119120 1744480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -22880 1744480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2942500 1564480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2819120 1564480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2639120 1564480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2459120 1564480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2279120 1564480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2099120 1564480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1919120 1564480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1739120 1564480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1559120 1564480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1379120 1564480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1199120 1564480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1019120 1564480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 839120 1564480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 659120 1564480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 479120 1564480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 299120 1564480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 119120 1564480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -22880 1564480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2942500 1384480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2819120 1384480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2639120 1384480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2459120 1384480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2279120 1384480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2099120 1384480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1919120 1384480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1739120 1384480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1559120 1384480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1379120 1384480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1199120 1384480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1019120 1384480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 839120 1384480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 659120 1384480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 479120 1384480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 299120 1384480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 119120 1384480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -22880 1384480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2942500 1204480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2819120 1204480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2639120 1204480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2459120 1204480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2279120 1204480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2099120 1204480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1919120 1204480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1739120 1204480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1559120 1204480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1379120 1204480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1199120 1204480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1019120 1204480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 839120 1204480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 659120 1204480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 479120 1204480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 299120 1204480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 119120 1204480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -22880 1204480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2942500 1024480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2819120 1024480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2639120 1024480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2459120 1024480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2279120 1024480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2099120 1024480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1919120 1024480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1739120 1024480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1559120 1024480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1379120 1024480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1199120 1024480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1019120 1024480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 839120 1024480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 659120 1024480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 479120 1024480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 299120 1024480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 119120 1024480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -22880 1024480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2942500 844480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2819120 844480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2639120 844480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2459120 844480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2279120 844480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2099120 844480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1919120 844480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1739120 844480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1559120 844480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1379120 844480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1199120 844480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1019120 844480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 839120 844480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 659120 844480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 479120 844480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 299120 844480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 119120 844480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -22880 844480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2942500 664480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2819120 664480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2639120 664480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2459120 664480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2279120 664480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2099120 664480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1919120 664480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1739120 664480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1559120 664480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1379120 664480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1199120 664480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1019120 664480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 839120 664480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 659120 664480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 479120 664480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 299120 664480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 119120 664480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -22880 664480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2942500 484480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2819120 484480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2639120 484480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2459120 484480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2279120 484480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2099120 484480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1919120 484480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1739120 484480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1559120 484480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1379120 484480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1199120 484480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1019120 484480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 839120 484480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 659120 484480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 479120 484480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 299120 484480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 119120 484480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -22880 484480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2942500 304480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2819120 304480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2639120 304480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2459120 304480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2279120 304480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2099120 304480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1919120 304480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1739120 304480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1559120 304480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1379120 304480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1199120 304480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1019120 304480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 839120 304480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 659120 304480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 479120 304480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 299120 304480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 119120 304480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -22880 304480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2942500 124480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2819120 124480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2639120 124480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2459120 124480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2279120 124480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2099120 124480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1919120 124480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1739120 124480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1559120 124480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1379120 124480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1199120 124480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1019120 124480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 839120 124480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 659120 124480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 479120 124480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 299120 124480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 119120 124480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -22880 124480 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2942500 -17520 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2819120 -17520 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2639120 -17520 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2459120 -17520 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2279120 -17520 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 2099120 -17520 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1919120 -17520 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1739120 -17520 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1559120 -17520 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1379120 -17520 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1199120 -17520 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 1019120 -17520 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 839120 -17520 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 659120 -17520 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 479120 -17520 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 299120 -17520 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( 119120 -17520 ) via4_3100x3100
+ NEW met4 0 + SHAPE STRIPE ( -22880 -17520 ) via4_3100x3100
+ NEW met5 3100 + SHAPE STRIPE ( -24430 3537200 ) ( 2944050 3537200 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 3364480 ) ( 2944050 3364480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 3184480 ) ( 2944050 3184480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 3004480 ) ( 2944050 3004480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 2824480 ) ( 2944050 2824480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 2644480 ) ( 2944050 2644480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 2464480 ) ( 2944050 2464480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 2284480 ) ( 2944050 2284480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 2104480 ) ( 2944050 2104480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 1924480 ) ( 2944050 1924480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 1744480 ) ( 2944050 1744480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 1564480 ) ( 2944050 1564480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 1384480 ) ( 2944050 1384480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 1204480 ) ( 2944050 1204480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 1024480 ) ( 2944050 1024480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 844480 ) ( 2944050 844480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 664480 ) ( 2944050 664480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 484480 ) ( 2944050 484480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 304480 ) ( 2944050 304480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 124480 ) ( 2944050 124480 )
+ NEW met5 3100 + SHAPE STRIPE ( -24430 -17520 ) ( 2944050 -17520 )
+ NEW met4 3100 + SHAPE STRIPE ( 2942500 -19070 ) ( 2942500 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( 2819120 -19070 ) ( 2819120 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( 2639120 -19070 ) ( 2639120 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( 2459120 -19070 ) ( 2459120 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( 2279120 -19070 ) ( 2279120 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( 2099120 -19070 ) ( 2099120 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( 1919120 2300000 ) ( 1919120 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( 1739120 2300000 ) ( 1739120 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( 1559120 2300000 ) ( 1559120 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( 1379120 2300000 ) ( 1379120 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( 1199120 2300000 ) ( 1199120 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( 1019120 -19070 ) ( 1019120 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( 839120 -19070 ) ( 839120 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( 659120 -19070 ) ( 659120 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( 479120 -19070 ) ( 479120 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( 299120 -19070 ) ( 299120 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( 119120 -19070 ) ( 119120 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( -22880 -19070 ) ( -22880 3538750 )
+ NEW met4 3100 + SHAPE STRIPE ( 1919120 -19070 ) ( 1919120 1680000 )
+ NEW met4 3100 + SHAPE STRIPE ( 1739120 -19070 ) ( 1739120 1680000 )
+ NEW met4 3100 + SHAPE STRIPE ( 1559120 -19070 ) ( 1559120 1680000 )
+ NEW met4 3100 + SHAPE STRIPE ( 1379120 -19070 ) ( 1379120 1680000 )
+ NEW met4 3100 + SHAPE STRIPE ( 1199120 -19070 ) ( 1199120 1680000 ) ;
+END SPECIALNETS
+END DESIGN
diff --git a/openlane/user_project_wrapper/fixed_dont_change/wb_port.txt b/openlane/user_project_wrapper/fixed_dont_change/wb_port.txt
new file mode 100644
index 0000000..b801c10
--- /dev/null
+++ b/openlane/user_project_wrapper/fixed_dont_change/wb_port.txt
@@ -0,0 +1,106 @@
+2990 wb_clk_i
+8510 wb_rst_i
+14490 wbs_ack_o
+38410 wbs_adr_i[0]
+61870 wbs_adr_i[1]
+85330 wbs_adr_i[2]
+239430 wbs_adr_i[10]
+256910 wbs_adr_i[11]
+274850 wbs_adr_i[12]
+292330 wbs_adr_i[13]
+310270 wbs_adr_i[14]
+327750 wbs_adr_i[15]
+345690 wbs_adr_i[16]
+363170 wbs_adr_i[17]
+381110 wbs_adr_i[18]
+398590 wbs_adr_i[19]
+416530 wbs_adr_i[20]
+434470 wbs_adr_i[21]
+451950 wbs_adr_i[22]
+469890 wbs_adr_i[23]
+487370 wbs_adr_i[24]
+505310 wbs_adr_i[25]
+522790 wbs_adr_i[26]
+540730 wbs_adr_i[27]
+558210 wbs_adr_i[28]
+576150 wbs_adr_i[29]
+594090 wbs_adr_i[30]
+611570 wbs_adr_i[31]
+109250 wbs_adr_i[3]
+132710 wbs_adr_i[4]
+150650 wbs_adr_i[5]
+168130 wbs_adr_i[6]
+186070 wbs_adr_i[7]
+203550 wbs_adr_i[8]
+221490 wbs_adr_i[9]
+20470 wbs_cyc_i
+43930 wbs_dat_i[0]
+244950 wbs_dat_i[10]
+262890 wbs_dat_i[11]
+280370 wbs_dat_i[12]
+298310 wbs_dat_i[13]
+316250 wbs_dat_i[14]
+333730 wbs_dat_i[15]
+351670 wbs_dat_i[16]
+369150 wbs_dat_i[17]
+387090 wbs_dat_i[18]
+404570 wbs_dat_i[19]
+67850 wbs_dat_i[1]
+422510 wbs_dat_i[20]
+439990 wbs_dat_i[21]
+457930 wbs_dat_i[22]
+475870 wbs_dat_i[23]
+493350 wbs_dat_i[24]
+511290 wbs_dat_i[25]
+528770 wbs_dat_i[26]
+546710 wbs_dat_i[27]
+564190 wbs_dat_i[28]
+582130 wbs_dat_i[29]
+91310 wbs_dat_i[2]
+599610 wbs_dat_i[30]
+617550 wbs_dat_i[31]
+115230 wbs_dat_i[3]
+138690 wbs_dat_i[4]
+156630 wbs_dat_i[5]
+174110 wbs_dat_i[6]
+192050 wbs_dat_i[7]
+209530 wbs_dat_i[8]
+227470 wbs_dat_i[9]
+49910 wbs_dat_o[0]
+250930 wbs_dat_o[10]
+268870 wbs_dat_o[11]
+286350 wbs_dat_o[12]
+304290 wbs_dat_o[13]
+321770 wbs_dat_o[14]
+339710 wbs_dat_o[15]
+357650 wbs_dat_o[16]
+375130 wbs_dat_o[17]
+393070 wbs_dat_o[18]
+410550 wbs_dat_o[19]
+73830 wbs_dat_o[1]
+428490 wbs_dat_o[20]
+445970 wbs_dat_o[21]
+463910 wbs_dat_o[22]
+481390 wbs_dat_o[23]
+499330 wbs_dat_o[24]
+516810 wbs_dat_o[25]
+534750 wbs_dat_o[26]
+552690 wbs_dat_o[27]
+570170 wbs_dat_o[28]
+588110 wbs_dat_o[29]
+97290 wbs_dat_o[2]
+605590 wbs_dat_o[30]
+623530 wbs_dat_o[31]
+121210 wbs_dat_o[3]
+144670 wbs_dat_o[4]
+162150 wbs_dat_o[5]
+180090 wbs_dat_o[6]
+198030 wbs_dat_o[7]
+215510 wbs_dat_o[8]
+233450 wbs_dat_o[9]
+55890 wbs_sel_i[0]
+79810 wbs_sel_i[1]
+103270 wbs_sel_i[2]
+126730 wbs_sel_i[3]
+26450 wbs_stb_i
+32430 wbs_we_i
diff --git a/openlane/user_project_wrapper/fixed_dont_change/wb_port_uniq.txt b/openlane/user_project_wrapper/fixed_dont_change/wb_port_uniq.txt
new file mode 100644
index 0000000..9d55edd
--- /dev/null
+++ b/openlane/user_project_wrapper/fixed_dont_change/wb_port_uniq.txt
@@ -0,0 +1,106 @@
+2990 wb_clk_i
+8510 wb_rst_i
+14490 wbs_ack_o
+20470 wbs_cyc_i
+26450 wbs_stb_i
+32430 wbs_we_i
+38410 wbs_adr_i[0]
+43930 wbs_dat_i[0]
+49910 wbs_dat_o[0]
+55890 wbs_sel_i[0]
+61870 wbs_adr_i[1]
+67850 wbs_dat_i[1]
+73830 wbs_dat_o[1]
+79810 wbs_sel_i[1]
+85330 wbs_adr_i[2]
+91310 wbs_dat_i[2]
+97290 wbs_dat_o[2]
+103270 wbs_sel_i[2]
+109250 wbs_adr_i[3]
+115230 wbs_dat_i[3]
+121210 wbs_dat_o[3]
+126730 wbs_sel_i[3]
+132710 wbs_adr_i[4]
+138690 wbs_dat_i[4]
+144670 wbs_dat_o[4]
+150650 wbs_adr_i[5]
+156630 wbs_dat_i[5]
+162150 wbs_dat_o[5]
+168130 wbs_adr_i[6]
+174110 wbs_dat_i[6]
+180090 wbs_dat_o[6]
+186070 wbs_adr_i[7]
+192050 wbs_dat_i[7]
+198030 wbs_dat_o[7]
+203550 wbs_adr_i[8]
+209530 wbs_dat_i[8]
+215510 wbs_dat_o[8]
+221490 wbs_adr_i[9]
+227470 wbs_dat_i[9]
+233450 wbs_dat_o[9]
+239430 wbs_adr_i[10]
+244950 wbs_dat_i[10]
+250930 wbs_dat_o[10]
+256910 wbs_adr_i[11]
+262890 wbs_dat_i[11]
+268870 wbs_dat_o[11]
+274850 wbs_adr_i[12]
+280370 wbs_dat_i[12]
+286350 wbs_dat_o[12]
+292330 wbs_adr_i[13]
+298310 wbs_dat_i[13]
+304290 wbs_dat_o[13]
+310270 wbs_adr_i[14]
+316250 wbs_dat_i[14]
+321770 wbs_dat_o[14]
+327750 wbs_adr_i[15]
+333730 wbs_dat_i[15]
+339710 wbs_dat_o[15]
+345690 wbs_adr_i[16]
+351670 wbs_dat_i[16]
+357650 wbs_dat_o[16]
+363170 wbs_adr_i[17]
+369150 wbs_dat_i[17]
+375130 wbs_dat_o[17]
+381110 wbs_adr_i[18]
+387090 wbs_dat_i[18]
+393070 wbs_dat_o[18]
+398590 wbs_adr_i[19]
+404570 wbs_dat_i[19]
+410550 wbs_dat_o[19]
+416530 wbs_adr_i[20]
+422510 wbs_dat_i[20]
+428490 wbs_dat_o[20]
+434470 wbs_adr_i[21]
+439990 wbs_dat_i[21]
+445970 wbs_dat_o[21]
+451950 wbs_adr_i[22]
+457930 wbs_dat_i[22]
+463910 wbs_dat_o[22]
+469890 wbs_adr_i[23]
+475870 wbs_dat_i[23]
+481390 wbs_dat_o[23]
+487370 wbs_adr_i[24]
+493350 wbs_dat_i[24]
+499330 wbs_dat_o[24]
+505310 wbs_adr_i[25]
+511290 wbs_dat_i[25]
+516810 wbs_dat_o[25]
+522790 wbs_adr_i[26]
+528770 wbs_dat_i[26]
+534750 wbs_dat_o[26]
+540730 wbs_adr_i[27]
+546710 wbs_dat_i[27]
+552690 wbs_dat_o[27]
+558210 wbs_adr_i[28]
+564190 wbs_dat_i[28]
+570170 wbs_dat_o[28]
+576150 wbs_adr_i[29]
+582130 wbs_dat_i[29]
+588110 wbs_dat_o[29]
+594090 wbs_adr_i[30]
+599610 wbs_dat_i[30]
+605590 wbs_dat_o[30]
+611570 wbs_adr_i[31]
+617550 wbs_dat_i[31]
+623530 wbs_dat_o[31]
diff --git a/openlane/user_project_wrapper/interactive.tcl b/openlane/user_project_wrapper/interactive.tcl
new file mode 100644
index 0000000..1f6639d
--- /dev/null
+++ b/openlane/user_project_wrapper/interactive.tcl
@@ -0,0 +1,346 @@
+#!/usr/bin/env tclsh
+# Copyright 2020-2022 Efabless Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+package require openlane; # provides the utils as well
+
+proc run_placement_step {args} {
+ if { ! [ info exists ::env(PLACEMENT_CURRENT_DEF) ] } {
+ set ::env(PLACEMENT_CURRENT_DEF) $::env(CURRENT_DEF)
+ } else {
+ set ::env(CURRENT_DEF) $::env(PLACEMENT_CURRENT_DEF)
+ }
+
+ run_placement
+}
+
+proc run_cts_step {args} {
+ if { ! [ info exists ::env(CTS_CURRENT_DEF) ] } {
+ set ::env(CTS_CURRENT_DEF) $::env(CURRENT_DEF)
+ } else {
+ set ::env(CURRENT_DEF) $::env(CTS_CURRENT_DEF)
+ }
+
+ run_cts
+ run_resizer_timing
+}
+
+proc run_routing_step {args} {
+ if { ! [ info exists ::env(ROUTING_CURRENT_DEF) ] } {
+ set ::env(ROUTING_CURRENT_DEF) $::env(CURRENT_DEF)
+ } else {
+ set ::env(CURRENT_DEF) $::env(ROUTING_CURRENT_DEF)
+ }
+ if { $::env(ECO_ENABLE) == 0 } {
+ run_routing
+ }
+}
+
+proc run_parasitics_sta_step {args} {
+ if { ! [ info exists ::env(PARSITICS_CURRENT_DEF) ] } {
+ set ::env(PARSITICS_CURRENT_DEF) $::env(CURRENT_DEF)
+ } else {
+ set ::env(CURRENT_DEF) $::env(PARSITICS_CURRENT_DEF)
+ }
+
+ if { $::env(RUN_SPEF_EXTRACTION) && ($::env(ECO_ENABLE) == 0)} {
+ run_parasitics_sta
+ }
+}
+
+proc run_diode_insertion_2_5_step {args} {
+ if { ! [ info exists ::env(DIODE_INSERTION_CURRENT_DEF) ] } {
+ set ::env(DIODE_INSERTION_CURRENT_DEF) $::env(CURRENT_DEF)
+ } else {
+ set ::env(CURRENT_DEF) $::env(DIODE_INSERTION_CURRENT_DEF)
+ }
+ if { ($::env(DIODE_INSERTION_STRATEGY) == 2) || ($::env(DIODE_INSERTION_STRATEGY) == 5) } {
+ run_antenna_check
+ heal_antenna_violators; # modifies the routed DEF
+ }
+
+}
+
+proc run_irdrop_report_step {args} {
+ if { $::env(RUN_IRDROP_REPORT) } {
+ run_irdrop_report
+ }
+}
+
+proc run_lvs_step {{ lvs_enabled 1 }} {
+ if { ! [ info exists ::env(LVS_CURRENT_DEF) ] } {
+ set ::env(LVS_CURRENT_DEF) $::env(CURRENT_DEF)
+ } else {
+ set ::env(CURRENT_DEF) $::env(LVS_CURRENT_DEF)
+ }
+
+ if { $lvs_enabled && $::env(RUN_LVS) } {
+ run_magic_spice_export;
+ run_lvs; # requires run_magic_spice_export
+ }
+
+}
+
+proc run_drc_step {{ drc_enabled 1 }} {
+ if { ! [ info exists ::env(DRC_CURRENT_DEF) ] } {
+ set ::env(DRC_CURRENT_DEF) $::env(CURRENT_DEF)
+ } else {
+ set ::env(CURRENT_DEF) $::env(DRC_CURRENT_DEF)
+ }
+ if { $drc_enabled } {
+ if { $::env(RUN_MAGIC_DRC) } {
+ run_magic_drc
+ }
+ if {$::env(RUN_KLAYOUT_DRC)} {
+ run_klayout_drc
+ }
+ }
+}
+
+proc run_antenna_check_step {{ antenna_check_enabled 1 }} {
+ if { ! [ info exists ::env(ANTENNA_CHECK_CURRENT_DEF) ] } {
+ set ::env(ANTENNA_CHECK_CURRENT_DEF) $::env(CURRENT_DEF)
+ } else {
+ set ::env(CURRENT_DEF) $::env(ANTENNA_CHECK_CURRENT_DEF)
+ }
+ if { $antenna_check_enabled } {
+ run_antenna_check
+ }
+}
+
+proc run_eco_step {args} {
+ if { $::env(ECO_ENABLE) == 1 } {
+ run_eco_flow
+ }
+}
+
+proc run_magic_step {args} {
+ if {$::env(RUN_MAGIC)} {
+ run_magic
+ }
+}
+
+proc run_klayout_step {args} {
+ if {$::env(RUN_KLAYOUT)} {
+ run_klayout
+ }
+ if {$::env(RUN_KLAYOUT_XOR)} {
+ run_klayout_gds_xor
+ }
+}
+
+proc run_post_run_hooks {} {
+ if { [file exists $::env(DESIGN_DIR)/hooks/post_run.py]} {
+ puts_info "Running post run hook"
+ set result [exec $::env(OPENROAD_BIN) -python $::env(DESIGN_DIR)/hooks/post_run.py]
+ puts_info "$result"
+ } else {
+ puts_info "hooks/post_run.py not found, skipping"
+ }
+}
+
+proc run_magic_drc_batch {args} {
+ set options {
+ {-magicrc optional}
+ {-tech optional}
+ {-report required}
+ {-design required}
+ {-gds required}
+ }
+ set flags {}
+ parse_key_args "run_magic_drc_batch" args arg_values $options flags_mag $flags
+ if { [info exists arg_values(-magicrc)] } {
+ set magicrc [file normalize $arg_values(-magicrc)]
+ }
+ if { [info exists arg_values(-tech)] } {
+ set ::env(TECH) [file normalize $arg_values(-tech)]
+ }
+ set ::env(GDS_INPUT) [file normalize $arg_values(-gds)]
+ set ::env(REPORT_OUTPUT) [file normalize $arg_values(-report)]
+ set ::env(DESIGN_NAME) $arg_values(-design)
+
+ if { [info exists magicrc] } {
+ exec magic \
+ -noconsole \
+ -dnull \
+ -rcfile $magicrc \
+ $::env(OPENLANE_ROOT)/scripts/magic/drc_batch.tcl \
+ </dev/null |& tee /dev/tty
+ } else {
+ exec magic \
+ -noconsole \
+ -dnull \
+ $::env(OPENLANE_ROOT)/scripts/magic/drc_batch.tcl \
+ </dev/null |& tee /dev/tty
+ }
+}
+
+proc run_lvs_batch {args} {
+ # runs device level lvs on -gds/CURRENT_GDS and -net/CURRENT_NETLIST
+ # extracts gds only if EXT_NETLIST does not exist
+ set options {
+ {-design required}
+ {-gds optional}
+ {-net optional}
+ }
+ set flags {}
+ parse_key_args "run_lvs_batch" args arg_values $options flags_lvs $flags -no_consume
+
+ prep {*}$args
+
+ if { [info exists arg_values(-gds)] } {
+ set ::env(CURRENT_GDS) [file normalize $arg_values(-gds)]
+ } else {
+ set ::env(CURRENT_GDS) $::env(signoff_results)/$::env(DESIGN_NAME).gds
+ }
+ if { [info exists arg_values(-net)] } {
+ set ::env(CURRENT_NETLIST) [file normalize $arg_values(-net)]
+ }
+
+ assert_files_exist "$::env(CURRENT_GDS) $::env(CURRENT_NETLIST)"
+
+ set ::env(MAGIC_EXT_USE_GDS) 1
+ set ::env(EXT_NETLIST) $::env(signoff_results)/$::env(DESIGN_NAME).gds.spice
+ if { [file exists $::env(EXT_NETLIST)] } {
+ puts_warn "The file $::env(EXT_NETLIST) will be used. If you would like the file re-exported, please delete it."
+ } else {
+ run_magic_spice_export
+ }
+
+ run_lvs
+}
+
+
+proc run_file {args} {
+ set ::env(TCLLIBPATH) $::auto_path
+ exec tclsh {*}$args >&@stdout
+}
+
+
+
+proc run_flow {args} {
+ set options {
+ {-design optional}
+ {-from optional}
+ {-to optional}
+ {-save_path optional}
+ {-override_env optional}
+ }
+ set flags {-save -run_hooks -no_lvs -no_drc -no_antennacheck -gui}
+ parse_key_args "run_non_interactive_mode" args arg_values $options flags_map $flags -no_consume
+
+ prep {*}$args
+ # signal trap SIGINT save_state;
+
+ if { [info exists flags_map(-gui)] } {
+ or_gui
+ return
+ }
+ if { [info exists arg_values(-override_env)] } {
+ load_overrides $arg_values(-override_env)
+ }
+
+ set LVS_ENABLED 1
+ set DRC_ENABLED 0
+
+ set ANTENNACHECK_ENABLED [expr ![info exists flags_map(-no_antennacheck)] ]
+
+ set steps [dict create \
+ "synthesis" "run_synthesis" \
+ "floorplan" "run_floorplan" \
+ "placement" "run_placement_step" \
+ "cts" "run_cts_step" \
+ "routing" "run_routing_step" \
+ "parasitics_sta" "run_parasitics_sta_step" \
+ "eco" "run_eco_step" \
+ "diode_insertion" "run_diode_insertion_2_5_step" \
+ "irdrop" "run_irdrop_report_step" \
+ "gds_magic" "run_magic_step" \
+ "gds_klayout" "run_klayout_step" \
+ "lvs" "run_lvs_step $LVS_ENABLED " \
+ "drc" "run_drc_step $DRC_ENABLED " \
+ "antenna_check" "run_antenna_check_step $ANTENNACHECK_ENABLED " \
+ "cvc" "run_lef_cvc"
+ ]
+
+ if { [info exists arg_values(-from) ]} {
+ puts_info "Starting flow at $arg_values(-from)..."
+ set ::env(CURRENT_STEP) $arg_values(-from)
+ } elseif { [info exists ::env(CURRENT_STEP) ] } {
+ puts_info "Resuming flow from $::env(CURRENT_STEP)..."
+ } else {
+ set ::env(CURRENT_STEP) "synthesis"
+ }
+
+ set_if_unset arg_values(-from) $::env(CURRENT_STEP)
+ set_if_unset arg_values(-to) "cvc"
+
+ set exe 0;
+ dict for {step_name step_exe} $steps {
+ if { [ string equal $arg_values(-from) $step_name ] } {
+ set exe 1;
+ }
+
+ if { $exe } {
+ # For when it fails
+ set ::env(CURRENT_STEP) $step_name
+ [lindex $step_exe 0] [lindex $step_exe 1] ;
+ }
+
+ if { [ string equal $arg_values(-to) $step_name ] } {
+ set exe 0:
+ break;
+ }
+
+ }
+
+ # for when it resumes
+ set steps_as_list [dict keys $steps]
+ set next_idx [expr [lsearch $steps_as_list $::env(CURRENT_STEP)] + 1]
+ set ::env(CURRENT_STEP) [lindex $steps_as_list $next_idx]
+
+ # Saves to <RUN_DIR>/results/final
+ save_final_views
+
+ # Saves to design directory or custom
+ if { [info exists flags_map(-save) ] } {
+ if { ! [info exists arg_values(-save_path)] } {
+ set arg_values(-save_path) $::env(DESIGN_DIR)
+ }
+ save_final_views\
+ -save_path $arg_values(-save_path)\
+ -tag $::env(RUN_TAG)
+ }
+ calc_total_runtime
+ save_state
+ generate_final_summary_report
+
+ check_timing_violations
+
+ if { [info exists arg_values(-save_path)]\
+ && $arg_values(-save_path) != "" } {
+ set ::env(HOOK_OUTPUT_PATH) "[file normalize $arg_values(-save_path)]"
+ } else {
+ set ::env(HOOK_OUTPUT_PATH) $::env(RESULTS_DIR)/final
+ }
+
+ if {[info exists flags_map(-run_hooks)]} {
+ run_post_run_hooks
+ }
+
+ puts_success "Flow complete."
+
+ show_warnings "Note that the following warnings have been generated:"
+}
+
+run_flow {*}$argv
diff --git a/openlane/user_project_wrapper/macro.cfg b/openlane/user_project_wrapper/macro.cfg
new file mode 100644
index 0000000..a66f27d
--- /dev/null
+++ b/openlane/user_project_wrapper/macro.cfg
@@ -0,0 +1,21 @@
+u_wb_host 1200 325 N
+u_glbl 800 800 N
+u_mbist5 800 1300 N
+u_mbist6 800 1800 N
+u_mbist7 800 2400 N
+u_mbist8 800 3000 N
+u_sram5_1kb 200 1200 N
+u_sram6_1kb 200 1800 N
+u_sram7_1kb 200 2400 N
+u_sram8_1kb 200 3000 N
+
+u_intercon 1200 800 N
+u_mbist1 1600 800 N
+u_mbist2 1600 1400 N
+u_mbist3 1600 2000 N
+u_mbist4 1600 2600 N
+
+u_sram1_2kb 2000 800 N
+u_sram2_2kb 2000 1400 N
+u_sram3_2kb 2000 2000 N
+u_sram4_2kb 2000 2600 N
diff --git a/openlane/user_project_wrapper/pdn_cfg.tcl b/openlane/user_project_wrapper/pdn_cfg.tcl
new file mode 100644
index 0000000..1bf35f4
--- /dev/null
+++ b/openlane/user_project_wrapper/pdn_cfg.tcl
@@ -0,0 +1,168 @@
+# Power nets
+if { [info exists ::env(FP_PDN_ENABLE_GLOBAL_CONNECTIONS)] } {
+ if { $::env(FP_PDN_ENABLE_GLOBAL_CONNECTIONS) == 1 } {
+ foreach power_pin $::env(STD_CELL_POWER_PINS) {
+ add_global_connection \
+ -net $::env(VDD_NET) \
+ -inst_pattern .* \
+ -pin_pattern $power_pin \
+ -power
+ }
+ foreach ground_pin $::env(STD_CELL_GROUND_PINS) {
+ add_global_connection \
+ -net $::env(GND_NET) \
+ -inst_pattern .* \
+ -pin_pattern $ground_pin \
+ -ground
+ }
+ }
+}
+
+if { $::env(FP_PDN_ENABLE_MACROS_GRID) == 1 &&
+ [info exists ::env(FP_PDN_MACRO_HOOKS)]} {
+ set pdn_hooks [split $::env(FP_PDN_MACRO_HOOKS) ","]
+ foreach pdn_hook $pdn_hooks {
+ set instance_name [lindex $pdn_hook 0]
+ set power_net [lindex $pdn_hook 1]
+ set ground_net [lindex $pdn_hook 2]
+ set power_pin [lindex $pdn_hook 3]
+ set ground_pin [lindex $pdn_hook 4]
+
+ if { $power_pin == "" || $ground_pin == "" } {
+ puts "FP_PDN_MACRO_HOOKS missing power and ground pin names"
+ exit -1
+ }
+
+ add_global_connection \
+ -net $power_net \
+ -inst_pattern $instance_name \
+ -pin_pattern $power_pin \
+ -power
+
+ add_global_connection \
+ -net $ground_net \
+ -inst_pattern $instance_name \
+ -pin_pattern $ground_pin \
+ -ground
+ }
+}
+
+set secondary []
+
+foreach vdd $::env(VDD_NETS) gnd $::env(GND_NETS) {
+ if { $vdd != $::env(VDD_NET)} {
+ lappend secondary $vdd
+
+ set db_net [[ord::get_db_block] findNet $vdd]
+ if {$db_net == "NULL"} {
+ set net [odb::dbNet_create [ord::get_db_block] $vdd]
+ $net setSpecial
+ $net setSigType "POWER"
+ }
+ }
+
+ if { $gnd != $::env(GND_NET)} {
+ lappend secondary $gnd
+
+ set db_net [[ord::get_db_block] findNet $gnd]
+ if {$db_net == "NULL"} {
+ set net [odb::dbNet_create [ord::get_db_block] $gnd]
+ $net setSpecial
+ $net setSigType "GROUND"
+ }
+ }
+}
+
+set_voltage_domain -name CORE -power $::env(VDD_NET) -ground $::env(GND_NET) \
+ -secondary_power $secondary
+
+# Assesses whether the design is the core of the chip or not based on the
+# value of $::env(DESIGN_IS_CORE) and uses the appropriate stdcell section
+if { $::env(DESIGN_IS_CORE) == 1 } {
+ # Used if the design is the core of the chip
+ define_pdn_grid \
+ -name stdcell_grid \
+ -starts_with POWER \
+ -voltage_domain CORE \
+ -pins "$::env(FP_PDN_LOWER_LAYER) $::env(FP_PDN_UPPER_LAYER)"
+
+ add_pdn_stripe \
+ -grid stdcell_grid \
+ -layer $::env(FP_PDN_LOWER_LAYER) \
+ -width $::env(FP_PDN_VWIDTH) \
+ -pitch $::env(FP_PDN_VPITCH) \
+ -offset $::env(FP_PDN_VOFFSET) \
+ -spacing $::env(FP_PDN_VSPACING) \
+ -nets "$::env(PDN_STRIPE)" \
+ -starts_with POWER -extend_to_core_ring
+
+ add_pdn_stripe \
+ -grid stdcell_grid \
+ -layer $::env(FP_PDN_UPPER_LAYER) \
+ -width $::env(FP_PDN_HWIDTH) \
+ -pitch $::env(FP_PDN_HPITCH) \
+ -offset $::env(FP_PDN_HOFFSET) \
+ -spacing $::env(FP_PDN_HSPACING) \
+ -nets "$::env(PDN_STRIPE)" \
+ -starts_with POWER -extend_to_core_ring
+
+ add_pdn_connect \
+ -grid stdcell_grid \
+ -layers "$::env(FP_PDN_LOWER_LAYER) $::env(FP_PDN_UPPER_LAYER)"
+} else {
+ # Used if the design is a macro in the core
+ define_pdn_grid \
+ -name stdcell_grid \
+ -starts_with POWER \
+ -voltage_domain CORE \
+ -pins $::env(FP_PDN_LOWER_LAYER)
+
+ add_pdn_stripe \
+ -grid stdcell_grid \
+ -layer $::env(FP_PDN_LOWER_LAYER) \
+ -width $::env(FP_PDN_VWIDTH) \
+ -pitch $::env(FP_PDN_VPITCH) \
+ -offset $::env(FP_PDN_VOFFSET) \
+ -starts_with POWER
+}
+
+# Adds the standard cell rails if enabled.
+if { $::env(FP_PDN_ENABLE_RAILS) == 1 } {
+ add_pdn_stripe \
+ -grid stdcell_grid \
+ -layer $::env(FP_PDN_RAILS_LAYER) \
+ -width $::env(FP_PDN_RAIL_WIDTH) \
+ -followpins \
+ -starts_with POWER
+
+ add_pdn_connect \
+ -grid stdcell_grid \
+ -layers "$::env(FP_PDN_RAILS_LAYER) $::env(FP_PDN_LOWER_LAYER)"
+}
+
+
+# Adds the core ring if enabled.
+if { $::env(FP_PDN_CORE_RING) == 1 } {
+ add_pdn_ring \
+ -grid stdcell_grid \
+ -layers "$::env(FP_PDN_LOWER_LAYER) $::env(FP_PDN_UPPER_LAYER)" \
+ -widths "$::env(FP_PDN_CORE_RING_VWIDTH) $::env(FP_PDN_CORE_RING_HWIDTH)" \
+ -spacings "$::env(FP_PDN_CORE_RING_VSPACING) $::env(FP_PDN_CORE_RING_HSPACING)" \
+ -core_offset "$::env(FP_PDN_CORE_RING_VOFFSET) $::env(FP_PDN_CORE_RING_HOFFSET)"
+}
+##################################
+# Common Macro Power Hook Up
+# Power Connect met-4 to met-5
+##################################
+
+define_pdn_grid \
+ -macro \
+ -default \
+ -name macro \
+ -starts_with POWER \
+ -halo "$::env(FP_PDN_HORIZONTAL_HALO) $::env(FP_PDN_VERTICAL_HALO)"
+
+add_pdn_connect \
+ -grid macro \
+ -layers "$::env(FP_PDN_LOWER_LAYER) $::env(FP_PDN_UPPER_LAYER)"
+
diff --git a/openlane/user_project_wrapper/sta.tcl b/openlane/user_project_wrapper/sta.tcl
new file mode 100644
index 0000000..e002811
--- /dev/null
+++ b/openlane/user_project_wrapper/sta.tcl
@@ -0,0 +1,107 @@
+# SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# SPDX-License-Identifier: Apache-2.0
+# SPDX-FileContributor: Modified by Dinesh Annayya <dinesha@opencores.org>
+
+
+set ::env(LIB_FASTEST) "$::env(PDK_ROOT)/sky130A/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__ff_n40C_1v95.lib"
+set ::env(LIB_TYPICAL) "$::env(PDK_ROOT)/sky130A/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__tt_025C_1v80.lib"
+set ::env(LIB_SLOWEST) "$::env(PDK_ROOT)/sky130A/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__ss_100C_1v60.lib"
+set ::env(DESIGN_NAME) "user_project_wrapper"
+set ::env(BASE_SDC_FILE) "base.sdc"
+set ::env(SYNTH_DRIVING_CELL) "sky130_fd_sc_hd__inv_8"
+set ::env(SYNTH_DRIVING_CELL_PIN) "Y"
+set ::env(SYNTH_CAP_LOAD) "17.65"
+set ::env(WIRE_RC_LAYER) "met1"
+
+#To disable empty filler cell black box get created
+#set link_make_black_boxes 0
+
+
+set_cmd_units -time ns -capacitance pF -current mA -voltage V -resistance kOhm -distance um
+define_corners wc bc tt
+read_liberty -corner bc $::env(LIB_FASTEST)
+read_liberty -corner wc $::env(LIB_SLOWEST)
+read_liberty -corner tt $::env(LIB_TYPICAL)
+
+
+read_verilog netlist/wb_host.v
+read_verilog netlist/mbist1.v
+read_verilog netlist/mbist2.v
+read_verilog netlist/glbl_cfg.v
+read_verilog netlist/wb_interconnect.v
+read_verilog netlist/user_project_wrapper.v
+read_lib -corner tt ../../lib/sky130_sram_2kbyte_1rw1r_32x512_8_TT_1p8V_25C.lib
+read_lib -corner tt ../../lib/sram_1rw1r_32_256_8_sky130_TT_1p8V_25C.lib
+link_design $::env(DESIGN_NAME)
+
+
+read_spef -path u_mbist1 ../../spef/mbist_top1.spef
+read_spef -path u_mbist2 ../../spef/mbist_top1.spef
+read_spef -path u_mbist3 ../../spef/mbist_top1.spef
+read_spef -path u_mbist4 ../../spef/mbist_top1.spef
+read_spef -path u_mbist5 ../../spef/mbist_top2.spef
+read_spef -path u_mbist6 ../../spef/mbist_top2.spef
+read_spef -path u_mbist7 ../../spef/mbist_top2.spef
+read_spef -path u_mbist8 ../../spef/mbist_top2.spef
+read_spef -path u_wb_host ../../spef/wb_host.spef
+read_spef -path u_intercon ../../spef/wb_interconnect.spef
+read_spef -path u_glbl ../../spef/glbl_cfg.spef
+
+read_spef ../../spef/user_project_wrapper.spef
+
+
+read_sdc -echo $::env(BASE_SDC_FILE)
+
+# check for missing constraints
+check_setup -verbose > unconstraints.rpt
+
+set_operating_conditions -analysis_type single
+# Propgate the clock
+set_propagated_clock [all_clocks]
+
+report_tns
+report_wns
+#report_power
+echo "################ CORNER : WC (SLOW) TIMING Report ###################" > timing_ss_max.rpt
+report_checks -unique -path_delay max -slack_max -0.0 -group_count 100 -corner wc >> timing_ss_max.rpt
+report_checks -group_count 100 -path_delay max -path_group $::env(WBM_CLOCK_NAME) -corner wc >> timing_ss_max.rpt
+report_checks -group_count 100 -path_delay max -path_group $::env(WBS_CLOCK_NAME) -corner wc >> timing_ss_max.rpt
+report_checks -group_count 100 -path_delay max -path_group $::env(BIST_CLOCK_NAME) -corner wc >> timing_ss_max.rpt
+report_checks -path_delay max -corner wc >> timing_ss_max.rpt
+
+echo "################ CORNER : BC (SLOW) TIMING Report ###################" > timing_ff_min.rpt
+report_checks -unique -path_delay min -slack_min -0.0 -group_count 100 -corner bc >> timing_ff_min.rpt
+report_checks -group_count 100 -path_delay min -path_group $::env(WBM_CLOCK_NAME) -corner bc >> timing_ff_min.rpt
+report_checks -group_count 100 -path_delay min -path_group $::env(WBS_CLOCK_NAME) -corner bc >> timing_ff_min.rpt
+report_checks -group_count 100 -path_delay min -path_group $::env(BIST_CLOCK_NAME) -corner bc >> timing_ff_min.rpt
+report_checks -path_delay min -corner bc >> timing_ff_min.rpt
+
+echo "################ CORNER : TT (MAX) TIMING Report ###################" > timing_tt_max.rpt
+report_checks -unique -path_delay min -slack_min -0.0 -group_count 100 -corner tt >> timing_tt_max.rpt
+report_checks -group_count 100 -path_delay max -path_group $::env(WBM_CLOCK_NAME) -corner tt >> timing_tt_max.rpt
+report_checks -group_count 100 -path_delay max -path_group $::env(WBS_CLOCK_NAME) -corner tt >> timing_tt_max.rpt
+report_checks -group_count 100 -path_delay max -path_group $::env(BIST_CLOCK_NAME) -corner tt >> timing_tt_max.rpt
+report_checks -path_delay min -corner tt >> timing_tt_min.rpt
+
+echo "################ CORNER : TT (MIN) TIMING Report ###################" > timing_tt_min.rpt
+report_checks -unique -path_delay min -slack_min -0.0 -group_count 100 -corner tt >> timing_tt_min.rpt
+report_checks -group_count 100 -path_delay min -path_group $::env(WBM_CLOCK_NAME) -corner tt >> timing_tt_min.rpt
+report_checks -group_count 100 -path_delay min -path_group $::env(WBS_CLOCK_NAME) -corner tt >> timing_tt_min.rpt
+report_checks -group_count 100 -path_delay min -path_group $::env(BIST_CLOCK_NAME) -corner tt >> timing_tt_min.rpt
+report_checks -path_delay min -corner tt >> timing_tt_min.rpt
+
+report_checks -path_delay min
+
+#exit
diff --git a/openlane/wb_host/base.sdc b/openlane/wb_host/base.sdc
new file mode 100644
index 0000000..021f2ea
--- /dev/null
+++ b/openlane/wb_host/base.sdc
@@ -0,0 +1,129 @@
+###############################################################################
+# Created by write_sdc
+# Sun Nov 14 09:07:48 2021
+###############################################################################
+current_design wb_host
+###############################################################################
+# Timing Constraints
+###############################################################################
+create_clock -name wbm_clk_i -period 10.0000 [get_ports {wbm_clk_i}]
+create_clock -name wbs_clk_i -period 10.0000 [get_ports {wbs_clk_i}]
+create_clock -name lbist_clk -period 10.0000 [get_ports {lbist_clk_int}]
+create_clock -name uart_clk -period 100.0000 [get_pins {u_uart2wb.u_core.u_uart_clk.u_mux/X}]
+
+set_clock_transition 0.1500 [all_clocks]
+set_clock_uncertainty -setup 0.2500 [all_clocks]
+set_clock_uncertainty -hold 0.2500 [all_clocks]
+
+set ::env(SYNTH_TIMING_DERATE) 0.05
+puts "\[INFO\]: Setting timing derate to: [expr {$::env(SYNTH_TIMING_DERATE) * 10}] %"
+set_timing_derate -early [expr {1-$::env(SYNTH_TIMING_DERATE)}]
+set_timing_derate -late [expr {1+$::env(SYNTH_TIMING_DERATE)}]
+
+set_clock_groups -name async_clock -asynchronous \
+ -group [get_clocks {uart_clk}] \
+ -group [get_clocks {wbs_clk_i}]\
+ -group [get_clocks {wbm_clk_i}]\
+ -group [get_clocks {lbist_clk}]\
+ -comment {Async Clock group}
+
+## Scan Mode & Scan Enable
+set_case_analysis 0 [get_pins {u_wb_host/u_scan_buf.u_buf/X}]
+set_case_analysis 0 [get_pins {u_wb_host/scan_en}]
+
+set_case_analysis 0 [get_ports {cfg_cska_wh[0]}]
+set_case_analysis 0 [get_ports {cfg_cska_wh[1]}]
+set_case_analysis 0 [get_ports {cfg_cska_wh[2]}]
+set_case_analysis 0 [get_ports {cfg_cska_wh[3]}]
+
+set_case_analysis 0 [get_ports {cfg_cska_lbist[0]}]
+set_case_analysis 0 [get_ports {cfg_cska_lbist[1]}]
+set_case_analysis 0 [get_ports {cfg_cska_lbist[2]}]
+set_case_analysis 0 [get_ports {cfg_cska_lbist[3]}]
+
+#disable clock gating check at static clock select pins
+set_false_path -through [get_pins u_wbs_clk_sel.u_mux/S]
+
+#Static Signal Clock Skew adjustment
+
+set_max_delay 3.5 -from [get_ports {wbd_clk_int}]
+set_max_delay 2 -to [get_ports {wbd_clk_wh}]
+set_max_delay 3.5 -from wbd_clk_int -to wbd_clk_mbist
+
+set_max_delay 3.5 -to [get_ports {lbist_clk_out}]
+set_max_delay 3.5 -to [get_ports {scan_in}]
+set_max_delay 3.5 -from [get_ports {scan_out}]
+set_max_delay 3.5 -to [get_ports {scan_rst_n}]
+set_max_delay 3.5 -to [get_ports {scan_en}]
+set_max_delay 3.5 -to [get_ports {scan_mode}]
+set_max_delay 3.5 -to [get_ports {cfg_clk_ctrl1[*]}]
+set_max_delay 3.5 -to [get_ports {cfg_clk_ctrl2[*]}]
+set_max_delay 3.5 -to [get_ports {io_out[*]}]
+set_max_delay 3.5 -to [get_ports {io_oeb[*]}]
+set_max_delay 3.5 -to [get_ports {la_data_out[*]}]
+set_max_delay 3.5 -to [get_ports {wbd_int_rst_n}]
+set_max_delay 3.5 -to [get_ports {bist_rst_n}]
+
+
+#Strobe is registered inside the wb_host before generating chip select
+# So wbm_adr_i wbm_we_i wbm_sel_i wbm_dat_i are having 2 cycle setup
+set_multicycle_path -setup -from [get_ports {wbm_adr_i[*]}] 2
+set_multicycle_path -setup -from [get_ports {wbm_cyc_i}] 2
+set_multicycle_path -setup -from [get_ports {wbm_dat_i[*]}] 2
+set_multicycle_path -setup -from [get_ports {wbm_sel_i[*]}] 2
+set_multicycle_path -setup -from [get_ports {wbm_we_i}] 2
+
+set_multicycle_path -hold -from [get_ports {wbm_adr_i[*]}] 2
+set_multicycle_path -hold -from [get_ports {wbm_cyc_i}] 2
+set_multicycle_path -hold -from [get_ports {wbm_dat_i[*]}] 2
+set_multicycle_path -hold -from [get_ports {wbm_sel_i[*]}] 2
+set_multicycle_path -hold -from [get_ports {wbm_we_i}] 2
+
+#
+set_input_delay 5.0000 -clock [get_clocks {wbm_clk_i}] -max -add_delay [get_ports {wbm_rst_i}]
+set_input_delay 5.0000 -clock [get_clocks {wbm_clk_i}] -max -add_delay [get_ports {wbm_stb_i}]
+
+set_input_delay 1.0000 -clock [get_clocks {wbm_clk_i}] -min -add_delay [get_ports {wbm_rst_i}]
+set_input_delay 1.0000 -clock [get_clocks {wbm_clk_i}] -min -add_delay [get_ports {wbm_stb_i}]
+
+set_output_delay -max 5.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbm_ack_o}]
+set_output_delay -max 5.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbm_dat_o[*]}]
+set_output_delay -max 5.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbm_err_o}]
+
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbm_ack_o}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbm_dat_o[*]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbm_err_o}]
+# WBS I/F
+set_input_delay -max 4.5000 -clock [get_clocks {wbs_clk_i}] -add_delay [get_ports {wbs_ack_i}]
+set_input_delay -max 4.5000 -clock [get_clocks {wbs_clk_i}] -add_delay [get_ports {wbs_dat_i[*]}]
+
+set_input_delay -min 2.0000 -clock [get_clocks {wbs_clk_i}] -add_delay [get_ports {wbs_ack_i}]
+set_input_delay -min 2.0000 -clock [get_clocks {wbs_clk_i}] -add_delay [get_ports {wbs_dat_i[*]}]
+
+set_output_delay -max 4.5000 -clock [get_clocks {wbs_clk_i}] -add_delay [get_ports {wbs_adr_o[*]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbs_clk_i}] -add_delay [get_ports {wbs_cyc_o}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbs_clk_i}] -add_delay [get_ports {wbs_dat_o[*]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbs_clk_i}] -add_delay [get_ports {wbs_sel_o[*]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbs_clk_i}] -add_delay [get_ports {wbs_stb_o}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbs_clk_i}] -add_delay [get_ports {wbs_we_o}]
+
+set_output_delay -min 1.0000 -clock [get_clocks {wbs_clk_i}] -add_delay [get_ports {wbs_adr_o[*]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbs_clk_i}] -add_delay [get_ports {wbs_cyc_o}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbs_clk_i}] -add_delay [get_ports {wbs_dat_o[*]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbs_clk_i}] -add_delay [get_ports {wbs_sel_o[*]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbs_clk_i}] -add_delay [get_ports {wbs_stb_o}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbs_clk_i}] -add_delay [get_ports {wbs_we_o}]
+
+###############################################################################
+# Environment
+###############################################################################
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin $::env(SYNTH_DRIVING_CELL_PIN) [all_inputs]
+set cap_load [expr $::env(SYNTH_CAP_LOAD) / 1000.0]
+puts "\[INFO\]: Setting load to: $cap_load"
+set_load $cap_load [all_outputs]
+
+###############################################################################
+# Design Rules
+###############################################################################
+
+
diff --git a/openlane/wb_host/config.tcl b/openlane/wb_host/config.tcl
new file mode 100755
index 0000000..b7a860e
--- /dev/null
+++ b/openlane/wb_host/config.tcl
@@ -0,0 +1,132 @@
+# SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# SPDX-License-Identifier: Apache-2.0
+# SPDX-FileContributor: Modified by Dinesh Annayya <dinesha@opencores.org>
+
+# Global
+# ------
+
+set script_dir [file dirname [file normalize [info script]]]
+# Name
+
+set ::env(DESIGN_NAME) wb_host
+
+set ::env(DESIGN_IS_CORE) "0"
+
+# Timing configuration
+set ::env(CLOCK_PERIOD) "10"
+set ::env(CLOCK_PORT) "wbm_clk_i wbs_clk_i lbist_clk_int u_uart2wb.u_core.u_uart_clk.u_mux/X"
+
+set ::env(SYNTH_MAX_FANOUT) 4
+set ::env(SYNTH_BUFFERING) {0}
+
+## CTS BUFFER
+set ::env(CTS_CLK_BUFFER_LIST) "sky130_fd_sc_hd__clkbuf_4 sky130_fd_sc_hd__clkbuf_8"
+set ::env(CTS_SINK_CLUSTERING_SIZE) "16"
+set ::env(CLOCK_BUFFER_FANOUT) "8"
+
+# Sources
+# -------
+
+# Local sources + no2usb sources
+set ::env(VERILOG_FILES) "\
+ $::env(DESIGN_DIR)/../../verilog/rtl/clk_skew_adjust/src/clk_skew_adjust.gv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/wb_host/src/wb_host.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/lib/async_fifo.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/lib/async_wb.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/lib/clk_ctl.v \
+ $::env(DESIGN_DIR)/../../verilog/rtl/lib/ctech_cells.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/lib/registers.v \
+ $::env(DESIGN_DIR)/../../verilog/rtl/lib/async_reg_bus.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/lib/clk_gate.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/lib/crc_32.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/lib/reset_sync.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/lbist/src/lbist_top.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/lbist/src/lbist_core.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/lbist/src/lbist_reg.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/uart/src/uart_txfsm.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/uart/src/uart_rxfsm.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/lib/double_sync_low.v \
+ $::env(DESIGN_DIR)/../../verilog/rtl/lib/wb_arb.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/uart2wb/src/uart2wb.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/uart2wb/src/uart2_core.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/uart2wb/src/uart_msg_handler.v \
+ "
+
+set ::env(SYNTH_READ_BLACKBOX_LIB) 1
+set ::env(SYNTH_DEFINES) [list SYNTHESIS ]
+set ::env(SDC_FILE) "$::env(DESIGN_DIR)/base.sdc"
+set ::env(BASE_SDC_FILE) "$::env(DESIGN_DIR)/base.sdc"
+
+set ::env(LEC_ENABLE) 0
+
+set ::env(VDD_PIN) [list {vccd1}]
+set ::env(GND_PIN) [list {vssd1}]
+
+
+# Floorplanning
+# -------------
+
+set ::env(FP_PIN_ORDER_CFG) $::env(DESIGN_DIR)/pin_order.cfg
+
+set ::env(FP_SIZING) absolute
+set ::env(DIE_AREA) "0 0 700 300"
+
+
+# If you're going to use multiple power domains, then keep this disabled.
+set ::env(RUN_CVC) 0
+
+#set ::env(PDN_CFG) $script_dir/pdn.tcl
+
+
+set ::env(PL_TIME_DRIVEN) 1
+set ::env(PL_TARGET_DENSITY) "0.35"
+
+# helps in anteena fix
+set ::env(USE_ARC_ANTENNA_CHECK) "1"
+
+set ::env(FP_IO_VEXTEND) 4
+set ::env(FP_IO_HEXTEND) 4
+
+set ::env(FP_PDN_VPITCH) 100
+set ::env(FP_PDN_HPITCH) 100
+set ::env(FP_PDN_VWIDTH) 6.2
+set ::env(FP_PDN_HWIDTH) 6.2
+
+#set ::env(GLB_RT_MAXLAYER) 5
+set ::env(RT_MAX_LAYER) {met4}
+
+#Lef
+set ::env(MAGIC_GENERATE_LEF) {1}
+set ::env(MAGIC_WRITE_FULL_LEF) {0}
+
+set ::env(DIODE_INSERTION_STRATEGY) 4
+
+
+#LVS Issue - DEF Base looks to having issue
+set ::env(MAGIC_EXT_USE_GDS) {1}
+
+set ::env(GLB_RESIZER_MAX_SLEW_MARGIN) {1.5}
+set ::env(PL_RESIZER_MAX_SLEW_MARGIN) {1.5}
+
+set ::env(GLB_RESIZER_MAX_CAP_MARGIN) {0.25}
+set ::env(PL_RESIZER_MAX_CAP_MARGIN) {0.25}
+
+set ::env(GLB_RESIZER_MAX_WIRE_LENGTH) {500}
+set ::env(PL_RESIZER_MAX_WIRE_LENGTH) {500}
+
+set ::env(QUIT_ON_TIMING_VIOLATIONS) "0"
+set ::env(QUIT_ON_MAGIC_DRC) "1"
+set ::env(QUIT_ON_LVS_ERROR) "1"
+set ::env(QUIT_ON_SLEW_VIOLATIONS) "0"
diff --git a/openlane/wb_host/pin_order.cfg b/openlane/wb_host/pin_order.cfg
new file mode 100644
index 0000000..9e1f20f
--- /dev/null
+++ b/openlane/wb_host/pin_order.cfg
@@ -0,0 +1,580 @@
+#BUS_SORT
+
+#MANUAL_PLACE
+
+
+#W
+bist_rst_n 0 0 2
+cfg_clk_ctrl1\[31\]
+cfg_clk_ctrl1\[30\]
+cfg_clk_ctrl1\[29\]
+cfg_clk_ctrl1\[28\]
+cfg_clk_ctrl1\[27\]
+cfg_clk_ctrl1\[26\]
+cfg_clk_ctrl1\[25\]
+cfg_clk_ctrl1\[24\]
+cfg_clk_ctrl1\[23\]
+cfg_clk_ctrl1\[22\]
+cfg_clk_ctrl1\[21\]
+cfg_clk_ctrl1\[20\]
+cfg_clk_ctrl1\[19\]
+cfg_clk_ctrl1\[18\]
+cfg_clk_ctrl1\[17\]
+cfg_clk_ctrl1\[16\]
+cfg_clk_ctrl1\[15\]
+cfg_clk_ctrl1\[14\]
+cfg_clk_ctrl1\[13\]
+cfg_clk_ctrl1\[12\]
+cfg_clk_ctrl1\[11\]
+cfg_clk_ctrl1\[10\]
+cfg_clk_ctrl1\[9\]
+cfg_clk_ctrl1\[8\]
+cfg_clk_ctrl1\[7\]
+cfg_clk_ctrl1\[6\]
+cfg_clk_ctrl1\[5\]
+cfg_clk_ctrl1\[4\]
+cfg_clk_ctrl1\[3\]
+cfg_clk_ctrl1\[2\]
+cfg_clk_ctrl1\[1\]
+cfg_clk_ctrl1\[0\]
+
+cfg_clk_ctrl2\[31\]
+cfg_clk_ctrl2\[30\]
+cfg_clk_ctrl2\[29\]
+cfg_clk_ctrl2\[28\]
+cfg_clk_ctrl2\[27\]
+cfg_clk_ctrl2\[26\]
+cfg_clk_ctrl2\[25\]
+cfg_clk_ctrl2\[24\]
+cfg_clk_ctrl2\[23\]
+cfg_clk_ctrl2\[22\]
+cfg_clk_ctrl2\[21\]
+cfg_clk_ctrl2\[20\]
+cfg_clk_ctrl2\[19\]
+cfg_clk_ctrl2\[18\]
+cfg_clk_ctrl2\[17\]
+cfg_clk_ctrl2\[16\]
+cfg_clk_ctrl2\[15\]
+cfg_clk_ctrl2\[14\]
+cfg_clk_ctrl2\[13\]
+cfg_clk_ctrl2\[12\]
+cfg_clk_ctrl2\[11\]
+cfg_clk_ctrl2\[10\]
+cfg_clk_ctrl2\[9\]
+cfg_clk_ctrl2\[8\]
+cfg_clk_ctrl2\[7\]
+cfg_clk_ctrl2\[6\]
+cfg_clk_ctrl2\[5\]
+cfg_clk_ctrl2\[4\]
+cfg_clk_ctrl2\[3\]
+cfg_clk_ctrl2\[2\]
+cfg_clk_ctrl2\[1\]
+cfg_clk_ctrl2\[0\]
+
+cfg_cska_lbist\[3\] 0150 0 4
+cfg_cska_lbist\[2\]
+cfg_cska_lbist\[1\]
+cfg_cska_lbist\[0\]
+lbist_clk_int
+lbist_clk_out
+
+
+scan_clk 0200 0 2
+scan_rst_n
+scan_mode
+scan_en
+scan_in\[7\]
+scan_in\[6\]
+scan_in\[5\]
+scan_in\[4\]
+scan_in\[3\]
+scan_in\[2\]
+scan_in\[1\]
+scan_in\[0\]
+scan_out\[7\]
+scan_out\[6\]
+scan_out\[5\]
+scan_out\[4\]
+scan_out\[3\]
+scan_out\[2\]
+scan_out\[1\]
+scan_out\[0\]
+
+#E
+io_out\[37\] 0 0 2
+io_out\[36\]
+io_out\[35\]
+io_out\[34\]
+io_out\[33\]
+io_out\[32\]
+io_out\[31\]
+io_out\[30\]
+io_out\[29\]
+io_out\[28\]
+io_out\[27\]
+io_out\[26\]
+io_out\[25\]
+io_out\[24\]
+io_out\[23\]
+io_out\[22\]
+io_out\[21\]
+io_out\[20\]
+io_out\[19\]
+io_out\[18\]
+io_out\[17\]
+io_out\[16\]
+io_out\[15\]
+io_out\[14\]
+io_out\[13\]
+io_out\[12\]
+io_out\[11\]
+io_out\[10\]
+io_out\[9\]
+io_out\[8\]
+io_out\[7\]
+io_out\[6\]
+io_out\[5\]
+io_out\[4\]
+io_out\[3\]
+io_out\[2\]
+io_out\[1\]
+io_out\[0\]
+io_oeb\[37\]
+io_oeb\[36\]
+io_oeb\[35\]
+io_oeb\[34\]
+io_oeb\[33\]
+io_oeb\[32\]
+io_oeb\[31\]
+io_oeb\[30\]
+io_oeb\[29\]
+io_oeb\[28\]
+io_oeb\[27\]
+io_oeb\[26\]
+io_oeb\[25\]
+io_oeb\[24\]
+io_oeb\[23\]
+io_oeb\[22\]
+io_oeb\[21\]
+io_oeb\[20\]
+io_oeb\[19\]
+io_oeb\[18\]
+io_oeb\[17\]
+io_oeb\[16\]
+io_oeb\[15\]
+io_oeb\[14\]
+io_oeb\[13\]
+io_oeb\[12\]
+io_oeb\[11\]
+io_oeb\[10\]
+io_oeb\[9\]
+io_oeb\[8\]
+io_oeb\[7\]
+io_oeb\[6\]
+io_oeb\[5\]
+io_oeb\[4\]
+io_oeb\[3\]
+io_oeb\[2\]
+io_oeb\[1\]
+io_oeb\[0\]
+io_in
+
+
+#S
+user_clock2 0000 0 4
+user_irq\[2\]
+user_irq\[1\]
+user_irq\[0\]
+user_clock1
+cfg_cska_wh\[3\]
+cfg_cska_wh\[2\]
+cfg_cska_wh\[1\]
+cfg_cska_wh\[0\]
+wbm_clk_i
+wbm_rst_i
+wbm_ack_o
+wbm_cyc_i
+wbm_stb_i
+wbm_we_i
+wbm_adr_i\[0\]
+wbm_dat_i\[0\]
+wbm_dat_o\[0\]
+wbm_sel_i\[0\]
+wbm_adr_i\[1\]
+wbm_dat_i\[1\]
+wbm_dat_o\[1\]
+wbm_sel_i\[1\]
+wbm_adr_i\[2\]
+wbm_dat_i\[2\]
+wbm_dat_o\[2\]
+wbm_sel_i\[2\]
+wbm_adr_i\[3\]
+wbm_dat_i\[3\]
+wbm_dat_o\[3\]
+wbm_sel_i\[3\]
+wbm_adr_i\[4\]
+wbm_dat_i\[4\]
+wbm_dat_o\[4\]
+wbm_adr_i\[5\]
+wbm_dat_i\[5\]
+wbm_dat_o\[5\]
+wbm_adr_i\[6\]
+wbm_dat_i\[6\]
+wbm_dat_o\[6\]
+wbm_adr_i\[7\]
+wbm_dat_i\[7\]
+wbm_dat_o\[7\]
+wbm_adr_i\[8\]
+wbm_dat_i\[8\]
+wbm_dat_o\[8\]
+wbm_adr_i\[9\]
+wbm_dat_i\[9\]
+wbm_dat_o\[9\]
+wbm_adr_i\[10\]
+wbm_dat_i\[10\]
+wbm_dat_o\[10\]
+wbm_adr_i\[11\]
+wbm_dat_i\[11\]
+wbm_dat_o\[11\]
+wbm_adr_i\[12\]
+wbm_dat_i\[12\]
+wbm_dat_o\[12\]
+wbm_adr_i\[13\]
+wbm_dat_i\[13\]
+wbm_dat_o\[13\]
+wbm_adr_i\[14\]
+wbm_dat_i\[14\]
+wbm_dat_o\[14\]
+wbm_adr_i\[15\]
+wbm_dat_i\[15\]
+wbm_dat_o\[15\]
+wbm_adr_i\[16\]
+wbm_dat_i\[16\]
+wbm_dat_o\[16\]
+wbm_adr_i\[17\]
+
+wbm_dat_i\[17\]
+wbm_dat_o\[17\]
+wbm_adr_i\[18\]
+wbm_dat_i\[18\]
+wbm_dat_o\[18\]
+wbm_adr_i\[19\]
+wbm_dat_i\[19\]
+wbm_dat_o\[19\]
+wbm_adr_i\[20\]
+wbm_dat_i\[20\]
+wbm_dat_o\[20\]
+wbm_adr_i\[21\]
+wbm_dat_i\[21\]
+wbm_dat_o\[21\]
+wbm_adr_i\[22\]
+wbm_dat_i\[22\]
+wbm_dat_o\[22\]
+wbm_adr_i\[23\]
+wbm_dat_i\[23\]
+wbm_dat_o\[23\]
+wbm_adr_i\[24\]
+wbm_dat_i\[24\]
+wbm_dat_o\[24\]
+wbm_adr_i\[25\]
+wbm_dat_i\[25\]
+wbm_dat_o\[25\]
+wbm_adr_i\[26\]
+wbm_dat_i\[26\]
+wbm_dat_o\[26\]
+wbm_adr_i\[27\]
+wbm_dat_i\[27\]
+wbm_dat_o\[27\]
+wbm_adr_i\[28\]
+wbm_dat_i\[28\]
+wbm_dat_o\[28\]
+wbm_adr_i\[29\]
+wbm_dat_i\[29\]
+wbm_dat_o\[29\]
+wbm_adr_i\[30\]
+wbm_dat_i\[30\]
+wbm_dat_o\[30\]
+wbm_adr_i\[31\]
+wbm_dat_i\[31\]
+wbm_dat_o\[31\]
+wbm_err_o
+
+la_data_in\[0\] 250 0 2
+la_data_out\[0\]
+la_data_in\[1\]
+la_data_out\[1\]
+la_data_in\[2\]
+la_data_out\[2\]
+la_data_in\[3\]
+la_data_out\[3\]
+la_data_in\[4\]
+la_data_out\[4\]
+la_data_in\[5\]
+la_data_out\[5\]
+la_data_in\[6\]
+la_data_out\[6\]
+la_data_in\[7\]
+la_data_out\[7\]
+la_data_in\[8\]
+la_data_out\[8\]
+la_data_in\[9\]
+la_data_out\[9\]
+la_data_in\[10\]
+la_data_out\[10\]
+la_data_in\[11\]
+la_data_out\[11\]
+la_data_in\[12\]
+la_data_out\[12\]
+la_data_in\[13\]
+la_data_out\[13\]
+la_data_in\[14\]
+la_data_out\[14\]
+la_data_in\[15\]
+la_data_out\[15\]
+la_data_in\[16\]
+la_data_out\[16\]
+la_data_in\[17\]
+la_data_out\[17\]
+la_data_in\[18\]
+la_data_out\[18\]
+la_data_in\[19\]
+la_data_out\[19\]
+la_data_in\[20\]
+la_data_out\[20\]
+la_data_in\[21\]
+la_data_out\[21\]
+la_data_in\[22\]
+la_data_out\[22\]
+la_data_in\[23\]
+la_data_out\[23\]
+la_data_in\[24\]
+la_data_out\[24\]
+la_data_in\[25\]
+la_data_out\[25\]
+la_data_in\[26\]
+la_data_out\[26\]
+la_data_in\[27\]
+la_data_out\[27\]
+la_data_in\[28\]
+la_data_out\[28\]
+la_data_in\[29\]
+la_data_out\[29\]
+la_data_in\[30\]
+la_data_out\[30\]
+la_data_in\[31\]
+la_data_out\[31\]
+la_data_in\[32\]
+la_data_out\[32\]
+la_data_in\[33\]
+la_data_out\[33\]
+la_data_in\[34\]
+la_data_out\[34\]
+la_data_in\[35\]
+la_data_out\[35\]
+
+la_data_out\[36\]
+la_data_out\[37\]
+la_data_out\[38\]
+la_data_out\[39\]
+la_data_out\[40\]
+la_data_out\[41\]
+la_data_out\[42\]
+la_data_out\[43\]
+la_data_out\[44\]
+la_data_out\[45\]
+la_data_out\[46\]
+la_data_out\[47\]
+la_data_out\[48\]
+la_data_out\[49\]
+la_data_out\[50\]
+la_data_out\[51\]
+la_data_out\[52\]
+la_data_out\[53\]
+la_data_out\[54\]
+la_data_out\[55\]
+la_data_out\[56\]
+la_data_out\[57\]
+la_data_out\[58\]
+la_data_out\[59\]
+la_data_out\[60\]
+la_data_out\[61\]
+la_data_out\[62\]
+la_data_out\[63\]
+la_data_out\[64\]
+la_data_out\[65\]
+la_data_out\[66\]
+la_data_out\[67\]
+la_data_out\[68\]
+la_data_out\[69\]
+la_data_out\[70\]
+la_data_out\[71\]
+la_data_out\[72\]
+la_data_out\[73\]
+la_data_out\[74\]
+la_data_out\[75\]
+la_data_out\[76\]
+la_data_out\[77\]
+la_data_out\[78\]
+la_data_out\[79\]
+la_data_out\[80\]
+la_data_out\[81\]
+la_data_out\[82\]
+la_data_out\[83\]
+la_data_out\[84\]
+la_data_out\[85\]
+la_data_out\[86\]
+la_data_out\[87\]
+la_data_out\[88\]
+la_data_out\[89\]
+la_data_out\[90\]
+la_data_out\[91\]
+la_data_out\[92\]
+la_data_out\[93\]
+la_data_out\[94\]
+la_data_out\[95\]
+la_data_out\[96\]
+la_data_out\[97\]
+la_data_out\[98\]
+la_data_out\[99\]
+la_data_out\[100\]
+la_data_out\[101\]
+la_data_out\[102\]
+la_data_out\[103\]
+la_data_out\[104\]
+la_data_out\[105\]
+la_data_out\[106\]
+la_data_out\[107\]
+la_data_out\[108\]
+la_data_out\[109\]
+la_data_out\[110\]
+la_data_out\[111\]
+la_data_out\[112\]
+la_data_out\[113\]
+la_data_out\[114\]
+la_data_out\[115\]
+la_data_out\[116\]
+la_data_out\[117\]
+la_data_out\[118\]
+la_data_out\[119\]
+la_data_out\[120\]
+la_data_out\[121\]
+la_data_out\[122\]
+la_data_out\[123\]
+la_data_out\[124\]
+la_data_out\[125\]
+la_data_out\[126\]
+la_data_out\[127\]
+
+#N
+wbs_stb_o 0000 0 2
+wbs_we_o
+wbs_adr_o\[31\]
+wbs_adr_o\[30\]
+wbs_adr_o\[29\]
+wbs_adr_o\[28\]
+wbs_adr_o\[27\]
+wbs_adr_o\[26\]
+wbs_adr_o\[25\]
+wbs_adr_o\[24\]
+wbs_adr_o\[23\]
+wbs_adr_o\[22\]
+wbs_adr_o\[21\]
+wbs_adr_o\[20\]
+wbs_adr_o\[19\]
+wbs_adr_o\[18\]
+wbs_adr_o\[17\]
+wbs_adr_o\[16\]
+wbs_adr_o\[15\]
+wbs_adr_o\[14\]
+wbs_adr_o\[13\]
+wbs_adr_o\[12\]
+wbs_adr_o\[11\]
+wbs_adr_o\[10\]
+wbs_adr_o\[9\]
+wbs_adr_o\[8\]
+wbs_adr_o\[7\]
+wbs_adr_o\[6\]
+wbs_adr_o\[5\]
+wbs_adr_o\[4\]
+wbs_adr_o\[3\]
+wbs_adr_o\[2\]
+wbs_adr_o\[1\]
+wbs_adr_o\[0\]
+wbs_sel_o\[3\]
+wbs_sel_o\[2\]
+wbs_sel_o\[1\]
+wbs_sel_o\[0\]
+wbs_dat_o\[31\]
+wbs_dat_o\[30\]
+wbs_dat_o\[29\]
+wbs_dat_o\[28\]
+wbs_dat_o\[27\]
+wbs_dat_o\[26\]
+wbs_dat_o\[25\]
+wbs_dat_o\[24\]
+wbs_dat_o\[23\]
+wbs_dat_o\[22\]
+wbs_dat_o\[21\]
+wbs_dat_o\[20\]
+wbs_dat_o\[19\]
+wbs_dat_o\[18\]
+wbs_dat_o\[17\]
+wbs_dat_o\[16\]
+wbs_dat_o\[15\]
+wbs_dat_o\[14\]
+wbs_dat_o\[13\]
+wbs_dat_o\[12\]
+wbs_dat_o\[11\]
+wbs_dat_o\[10\]
+wbs_dat_o\[9\]
+wbs_dat_o\[8\]
+wbs_dat_o\[7\]
+wbs_dat_o\[6\]
+wbs_dat_o\[5\]
+wbs_dat_o\[4\]
+wbs_dat_o\[3\]
+wbs_dat_o\[2\]
+wbs_dat_o\[1\]
+wbs_dat_o\[0\]
+wbs_dat_i\[31\]
+wbs_dat_i\[30\]
+wbs_dat_i\[29\]
+wbs_dat_i\[28\]
+wbs_dat_i\[27\]
+wbs_dat_i\[26\]
+wbs_dat_i\[25\]
+wbs_dat_i\[24\]
+wbs_dat_i\[23\]
+wbs_dat_i\[22\]
+wbs_dat_i\[21\]
+wbs_dat_i\[20\]
+wbs_dat_i\[19\]
+wbs_dat_i\[18\]
+wbs_dat_i\[17\]
+wbs_dat_i\[16\]
+wbs_dat_i\[15\]
+wbs_dat_i\[14\]
+wbs_dat_i\[13\]
+wbs_dat_i\[12\]
+wbs_dat_i\[11\]
+wbs_dat_i\[10\]
+wbs_dat_i\[9\]
+wbs_dat_i\[8\]
+wbs_dat_i\[7\]
+wbs_dat_i\[6\]
+wbs_dat_i\[5\]
+wbs_dat_i\[4\]
+wbs_dat_i\[3\]
+wbs_dat_i\[2\]
+wbs_dat_i\[1\]
+wbs_dat_i\[0\]
+wbs_ack_i
+wbs_err_i
+wbs_cyc_o
+
+wbd_int_rst_n 110 0 2
+wbs_clk_out
+wbd_clk_int
+wbd_clk_wh
+wbs_clk_i
+
diff --git a/openlane/wb_host/sta/Makefile b/openlane/wb_host/sta/Makefile
new file mode 100644
index 0000000..6f3136c
--- /dev/null
+++ b/openlane/wb_host/sta/Makefile
@@ -0,0 +1,53 @@
+# SPDX-FileCopyrightText: 2020 Efabless Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+
+BLOCKS = wb_host
+DEF = $(foreach block,$(BLOCKS), ../../../def/$(block).def)
+CLEAN = $(foreach block,$(BLOCKS), clean-$(block))
+
+OPENLANE_TAG = mpw4
+OPENLANE_IMAGE_NAME = dineshannayya/openlane:$(OPENLANE_TAG)
+OPENLANE_NETLIST_COMMAND = "cd /project/sta && openroad -exit scripts/or_write_verilog.tcl | tee logs/$@.log"
+OPENLANE_STA_COMMAND = "cd /project/sta && sta scripts/sta.tcl | tee logs/sta.log"
+
+all: $(BLOCKS) sta
+
+$(DEF) :
+ @echo "Missing $@. Please create a def for that design"
+ @exit 1
+
+$(BLOCKS) : % : ../../../def/%.def create
+ docker run -it -v $(PWD)/..:/project -e DESIGN_NAME=$@ -u $(shell id -u $(USER)):$(shell id -g $(USER)) $(OPENLANE_IMAGE_NAME) sh -c $(OPENLANE_NETLIST_COMMAND)
+
+sta:
+ #sta inside the docker is crashing with segmentation fault, so are running sta outside the docker
+ #docker run -it -v $(PWD)/..:/project -e DESIGN_NAME=$@ -u $(shell id -u $(USER)):$(shell id -g $(USER)) $(OPENLANE_IMAGE_NAME) sh -c $(OPENLANE_STA_COMMAND)
+ export STA_MODE=func
+ sta scripts/sta.tcl | tee logs/sta_func.log
+
+create: clean
+ @echo "create temp directory :)"
+ mkdir -p netlist
+ mkdir -p logs
+ mkdir -p reports/func
+ mkdir -p reports/scan
+
+clean:
+ @echo "clean everything :)"
+ rm -rf netlist
+ rm -rf logs
+ rm -rf reports
+
diff --git a/openlane/wb_host/sta/func.sdc b/openlane/wb_host/sta/func.sdc
new file mode 100644
index 0000000..49e46b6
--- /dev/null
+++ b/openlane/wb_host/sta/func.sdc
@@ -0,0 +1,113 @@
+###############################################################################
+# Created by write_sdc
+# Sun Nov 14 09:07:48 2021
+###############################################################################
+current_design wb_host
+###############################################################################
+# Timing Constraints
+###############################################################################
+create_clock -name wbm_clk_i -period 10.0000 [get_ports {wbm_clk_i}]
+create_clock -name wbs_clk_i -period 10.0000 [get_ports {wbs_clk_i}]
+create_clock -name lbist_clk -period 10.0000 [get_pins {u_lbist_clk_sel.u_mux/X}]
+set_clock_uncertainty -from wbm_clk_i -to wbm_clk_i -setup 0.200
+set_clock_uncertainty -from wbm_clk_i -to wbm_clk_i -hold 0.100
+set_clock_uncertainty -from wbs_clk_i -to wbs_clk_i -setup 0.200
+set_clock_uncertainty -from wbs_clk_i -to wbs_clk_i -hold 0.100
+set_clock_uncertainty -from lbist_clk -to lbist_clk -setup 0.200
+set_clock_uncertainty -from lbist_clk -to lbist_clk -hold 0.100
+
+set_clock_groups -name async_clock -asynchronous \
+ -group [get_clocks {wbs_clk_i}]\
+ -group [get_clocks {wbm_clk_i}]\
+ -group [get_clocks {lbist_clk}]\
+ -comment {Async Clock group}
+
+## Scan Mode & Scan Enable
+set_case_analysis 0 [get_pins {u_wb_host/u_scan_buf.u_buf/X}]
+set_case_analysis 0 [get_pins {u_wb_host/scan_en}]
+
+set_case_analysis 0 [get_ports {cfg_cska_wh[0]}]
+set_case_analysis 0 [get_ports {cfg_cska_wh[1]}]
+set_case_analysis 0 [get_ports {cfg_cska_wh[2]}]
+set_case_analysis 0 [get_ports {cfg_cska_wh[3]}]
+
+set_case_analysis 0 [get_pins {cfg_cska_lbist[0]}]
+set_case_analysis 0 [get_pins {cfg_cska_lbist[1]}]
+set_case_analysis 0 [get_pins {cfg_cska_lbist[2]}]
+set_case_analysis 0 [get_pins {cfg_cska_lbist[3]}]
+
+#disable clock gating check at static clock select pins
+set_false_path -through [get_pins u_wbs_clk_sel.u_mux/S]
+
+#Static Signal Clock Skew adjustment
+set_false_path -from [get_ports {cfg_cska_wh[0]}]
+set_false_path -from [get_ports {cfg_cska_wh[1]}]
+set_false_path -from [get_ports {cfg_cska_wh[2]}]
+set_false_path -from [get_ports {cfg_cska_wh[3]}]
+
+set_max_delay 3.5 -from [get_ports {wbd_clk_int}]
+set_max_delay 2 -to [get_ports {wbd_clk_wh}]
+set_max_delay 3.5 -from wbd_clk_int -to wbd_clk_mbist
+
+#Strobe is registered inside the wb_host before generating chip select
+# So wbm_adr_i wbm_we_i wbm_sel_i wbm_dat_i are having 2 cycle setup
+set_multicycle_path -setup -from [get_ports {wbm_adr_i[*]}] 2
+set_multicycle_path -setup -from [get_ports {wbm_cyc_i}] 2
+set_multicycle_path -setup -from [get_ports {wbm_dat_i[*]}] 2
+set_multicycle_path -setup -from [get_ports {wbm_sel_i[*]}] 2
+set_multicycle_path -setup -from [get_ports {wbm_we_i}] 2
+
+set_multicycle_path -hold -from [get_ports {wbm_adr_i[*]}] 2
+set_multicycle_path -hold -from [get_ports {wbm_cyc_i}] 2
+set_multicycle_path -hold -from [get_ports {wbm_dat_i[*]}] 2
+set_multicycle_path -hold -from [get_ports {wbm_sel_i[*]}] 2
+set_multicycle_path -hold -from [get_ports {wbm_we_i}] 2
+
+#
+set_input_delay 5.0000 -clock [get_clocks {wbm_clk_i}] -max -add_delay [get_ports {wbm_rst_i}]
+set_input_delay 5.0000 -clock [get_clocks {wbm_clk_i}] -max -add_delay [get_ports {wbm_stb_i}]
+
+set_input_delay 1.0000 -clock [get_clocks {wbm_clk_i}] -min -add_delay [get_ports {wbm_rst_i}]
+set_input_delay 1.0000 -clock [get_clocks {wbm_clk_i}] -min -add_delay [get_ports {wbm_stb_i}]
+
+set_output_delay -max 5.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbm_ack_o}]
+set_output_delay -max 5.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbm_dat_o[*]}]
+set_output_delay -max 5.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbm_err_o}]
+
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbm_ack_o}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbm_dat_o[*]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbm_clk_i}] -add_delay [get_ports {wbm_err_o}]
+# WBS I/F
+set_input_delay -max 6.0000 -clock [get_clocks {wbs_clk_i}] -add_delay [get_ports {wbs_ack_i}]
+set_input_delay -max 6.0000 -clock [get_clocks {wbs_clk_i}] -add_delay [get_ports {wbs_dat_i[*]}]
+
+set_input_delay -min 2.0000 -clock [get_clocks {wbs_clk_i}] -add_delay [get_ports {wbs_ack_i}]
+set_input_delay -min 2.0000 -clock [get_clocks {wbs_clk_i}] -add_delay [get_ports {wbs_dat_i[*]}]
+
+set_output_delay -max 4.5000 -clock [get_clocks {wbs_clk_i}] -add_delay [get_ports {wbs_adr_o[*]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbs_clk_i}] -add_delay [get_ports {wbs_cyc_o}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbs_clk_i}] -add_delay [get_ports {wbs_dat_o[*]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbs_clk_i}] -add_delay [get_ports {wbs_sel_o[*]}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbs_clk_i}] -add_delay [get_ports {wbs_stb_o}]
+set_output_delay -max 4.5000 -clock [get_clocks {wbs_clk_i}] -add_delay [get_ports {wbs_we_o}]
+
+set_output_delay -min 1.0000 -clock [get_clocks {wbs_clk_i}] -add_delay [get_ports {wbs_adr_o[*]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbs_clk_i}] -add_delay [get_ports {wbs_cyc_o}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbs_clk_i}] -add_delay [get_ports {wbs_dat_o[*]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbs_clk_i}] -add_delay [get_ports {wbs_sel_o[*]}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbs_clk_i}] -add_delay [get_ports {wbs_stb_o}]
+set_output_delay -min 1.0000 -clock [get_clocks {wbs_clk_i}] -add_delay [get_ports {wbs_we_o}]
+
+###############################################################################
+# Environment
+###############################################################################
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin $::env(SYNTH_DRIVING_CELL_PIN) [all_inputs]
+set cap_load [expr $::env(SYNTH_CAP_LOAD) / 1000.0]
+puts "\[INFO\]: Setting load to: $cap_load"
+set_load $cap_load [all_outputs]
+
+###############################################################################
+# Design Rules
+###############################################################################
+
+
diff --git a/openlane/wb_host/sta/logs/sta_func.log b/openlane/wb_host/sta/logs/sta_func.log
new file mode 100644
index 0000000..d1dc5dc
--- /dev/null
+++ b/openlane/wb_host/sta/logs/sta_func.log
@@ -0,0 +1,7 @@
+OpenSTA 2.3.1 ddd7f39736 Copyright (c) 2019, Parallax Software, Inc.
+License GPLv3: GNU GPL version 3 <http://gnu.org/licenses/gpl.html>
+
+This is free software, and you are free to change and redistribute it
+under certain conditions; type `show_copying' for details.
+This program comes with ABSOLUTELY NO WARRANTY; for details type `show_warranty'.
+% Error: sta.tcl, 22 can't read "::env(STA_MODE)": no such variable
diff --git a/openlane/wb_host/sta/logs/wb_host.log b/openlane/wb_host/sta/logs/wb_host.log
new file mode 100644
index 0000000..9542be9
--- /dev/null
+++ b/openlane/wb_host/sta/logs/wb_host.log
@@ -0,0 +1,5 @@
+OpenROAD b79f266fe41540eabc064bcaddfe19ed715ac5c2
+This program is licensed under the BSD-3 license. See the LICENSE file for details.
+Components of this program may be licensed under more restrictive licenses which must be honored.
+[ERROR ORD-0001] ../../../lef/merged_unpadded.lef does not exist.
+ORD-0001
diff --git a/openlane/wb_host/sta/scripts/or_write_verilog.tcl b/openlane/wb_host/sta/scripts/or_write_verilog.tcl
new file mode 100644
index 0000000..5262726
--- /dev/null
+++ b/openlane/wb_host/sta/scripts/or_write_verilog.tcl
@@ -0,0 +1,30 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set ::env(MERGED_LEF_UNPADDED) "../../../lef/merged_unpadded.lef"
+set ::env(INPUT_DEF) "../../../def/$::env(DESIGN_NAME).def"
+set ::env(SAVE_NETLIST) "netlist/$::env(DESIGN_NAME).v"
+
+
+if {[catch {read_lef $::env(MERGED_LEF_UNPADDED)} errmsg]} {
+ puts stderr $errmsg
+ exit 1
+}
+
+if {[catch {read_def $::env(INPUT_DEF)} errmsg]} {
+ puts stderr $errmsg
+ exit 1
+}
+
+#write_verilog -include_pwr_gnd $::env(SAVE_POWER_NETLIST)
+write_verilog $::env(SAVE_NETLIST)
+
diff --git a/openlane/wb_host/sta/scripts/sta.tcl b/openlane/wb_host/sta/scripts/sta.tcl
new file mode 100644
index 0000000..663ada0
--- /dev/null
+++ b/openlane/wb_host/sta/scripts/sta.tcl
@@ -0,0 +1,107 @@
+# SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# SPDX-License-Identifier: Apache-2.0
+# SPDX-FileContributor: Modified by Dinesh Annayya <dinesha@opencores.org>
+#
+
+set ::env(LIB_FASTEST) "$::env(PDK_ROOT)/sky130A/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__ff_n40C_1v95.lib"
+set ::env(LIB_TYPICAL) "$::env(PDK_ROOT)/sky130A/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__tt_025C_1v80.lib"
+set ::env(LIB_SLOWEST) "$::env(PDK_ROOT)/sky130A/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__ss_100C_1v60.lib"
+set ::env(DESIGN_NAME) "wb_host"
+set ::env(BASE_SDC_FILE) $::env(STA_MODE).sdc
+set ::env(SYNTH_DRIVING_CELL) "sky130_fd_sc_hd__inv_8"
+set ::env(SYNTH_DRIVING_CELL_PIN) "Y"
+set ::env(SYNTH_CAP_LOAD) "17.65"
+set ::env(WIRE_RC_LAYER) "met1"
+
+#To disable empty filler cell black box get created
+#set link_make_black_boxes 0
+
+
+set_cmd_units -time ns -capacitance pF -current mA -voltage V -resistance kOhm -distance um
+define_corners wc bc tt
+read_liberty -corner bc $::env(LIB_FASTEST)
+read_liberty -corner wc $::env(LIB_SLOWEST)
+read_liberty -corner tt $::env(LIB_TYPICAL)
+
+read_lib -corner tt ../lib/sky130_sram_2kbyte_1rw1r_32x512_8_TT_1p8V_25C.lib
+read_lib -corner tt ../lib/sky130_sram_1kbyte_1rw1r_32x256_8_TT_1p8V_25C.lib
+
+read_verilog netlist/wb_host.v
+
+link_design $::env(DESIGN_NAME)
+
+read_spef ../../../spef/wb_host.spef
+
+
+read_sdc -echo $::env(BASE_SDC_FILE)
+
+# check for missing constraints
+check_setup -verbose > reports/$::env(STA_MODE)/unconstraints.rpt
+
+set_operating_conditions -analysis_type single
+# Propgate the clock
+set_propagated_clock [all_clocks]
+
+report_tns
+report_wns
+#report_power
+#
+echo "################ CORNER : WC (MAX) TIMING Report ###################" > reports/$::env(STA_MODE)/timing_ss_max.rpt
+report_checks -unique -slack_max -0.0 -path_delay max -group_count 100 -corner wc -format full_clock_expanded >> reports/$::env(STA_MODE)/timing_ss_max.rpt
+report_checks -group_count 100 -path_delay max -path_group wbm_clk_i -corner wc -format full_clock_expanded >> reports/$::env(STA_MODE)/timing_ss_max.rpt
+report_checks -group_count 100 -path_delay max -path_group wbs_clk_i -corner wc -format full_clock_expanded >> reports/$::env(STA_MODE)/timing_ss_max.rpt
+report_checks -group_count 100 -path_delay max -path_group lbist_clk -corner wc -format full_clock_expanded >> reports/$::env(STA_MODE)/timing_ss_max.rpt
+report_checks -path_delay max -corner wc >> reports/$::env(STA_MODE)/timing_ss_max.rpt
+
+echo "################ CORNER : WC (MIN) TIMING Report ###################" > reports/$::env(STA_MODE)/timing_ss_min.rpt
+report_checks -unique -slack_max -0.0 -path_delay min -group_count 100 -corner wc -format full_clock_expanded >> reports/$::env(STA_MODE)/timing_ss_min.rpt
+report_checks -group_count 100 -path_delay min -path_group wbm_clk_i -corner wc -format full_clock_expanded >> reports/$::env(STA_MODE)/timing_ss_min.rpt
+report_checks -group_count 100 -path_delay min -path_group wbs_clk_i -corner wc -format full_clock_expanded >> reports/$::env(STA_MODE)/timing_ss_min.rpt
+report_checks -group_count 100 -path_delay min -path_group lbist_clk -corner wc -format full_clock_expanded >> reports/$::env(STA_MODE)/timing_ss_min.rpt
+report_checks -path_delay min -corner wc >> reports/$::env(STA_MODE)/timing_ss_min.rpt
+
+echo "################ CORNER : BC (MAX) TIMING Report ###################" > reports/$::env(STA_MODE)/timing_ff_max.rpt
+report_checks -unique -slack_max -0.0 -path_delay max -group_count 100 -corner bc -format full_clock_expanded >> reports/$::env(STA_MODE)/timing_ff_max.rpt
+report_checks -group_count 100 -path_delay max -path_group wbm_clk_i -corner bc -format full_clock_expanded >> reports/$::env(STA_MODE)/timing_ff_max.rpt
+report_checks -group_count 100 -path_delay max -path_group wbs_clk_i -corner bc -format full_clock_expanded >> reports/$::env(STA_MODE)/timing_ff_max.rpt
+report_checks -group_count 100 -path_delay max -path_group lbist_clk -corner bc -format full_clock_expanded >> reports/$::env(STA_MODE)/timing_ff_max.rpt
+report_checks -path_delay max -corner bc >> reports/$::env(STA_MODE)/timing_ff_max.rpt
+
+echo "################ CORNER : BC (MIN) TIMING Report ###################" > reports/$::env(STA_MODE)/timing_ff_min.rpt
+report_checks -unique -slack_max -0.0 -path_delay min -group_count 100 -corner bc -format full_clock_expanded >> reports/$::env(STA_MODE)/timing_ff_min.rpt
+report_checks -group_count 100 -path_delay min -path_group wbm_clk_i -corner bc -format full_clock_expanded >> reports/$::env(STA_MODE)/timing_ff_min.rpt
+report_checks -group_count 100 -path_delay min -path_group wbs_clk_i -corner bc -format full_clock_expanded >> reports/$::env(STA_MODE)/timing_ff_min.rpt
+report_checks -group_count 100 -path_delay min -path_group lbist_clk -corner bc -format full_clock_expanded >> reports/$::env(STA_MODE)/timing_ff_min.rpt
+report_checks -path_delay min -corner bc >> reports/$::env(STA_MODE)/timing_ff_min.rpt
+
+
+echo "################ CORNER : TT (MAX) TIMING Report ###################" > reports/$::env(STA_MODE)/timing_tt_max.rpt
+report_checks -unique -slack_max -0.0 -path_delay max -group_count 100 -corner tt -format full_clock_expanded >> reports/$::env(STA_MODE)/timing_tt_max.rpt
+report_checks -group_count 100 -path_delay max -path_group wbm_clk_i -corner tt -format full_clock_expanded >> reports/$::env(STA_MODE)/timing_tt_max.rpt
+report_checks -group_count 100 -path_delay max -path_group wbs_clk_i -corner tt -format full_clock_expanded >> reports/$::env(STA_MODE)/timing_tt_max.rpt
+report_checks -group_count 100 -path_delay max -path_group lbist_clk -corner tt -format full_clock_expanded >> reports/$::env(STA_MODE)/timing_tt_max.rpt
+report_checks -path_delay max -corner tt >> reports/$::env(STA_MODE)/timing_tt_max.rpt
+
+echo "################ CORNER : TT (MIN) TIMING Report ###################" > reports/$::env(STA_MODE)/timing_tt_min.rpt
+report_checks -unique -slack_max -0.0 -path_delay min -group_count 100 -corner tt -format full_clock_expanded >> reports/$::env(STA_MODE)/timing_tt_min.rpt
+report_checks -group_count 100 -path_delay min -path_group wbm_clk_i -corner tt -format full_clock_expanded >> reports/$::env(STA_MODE)/timing_tt_min.rpt
+report_checks -group_count 100 -path_delay min -path_group wbs_clk_i -corner tt -format full_clock_expanded >> reports/$::env(STA_MODE)/timing_tt_min.rpt
+report_checks -group_count 100 -path_delay min -path_group lbist_clk -corner tt -format full_clock_expanded >> reports/$::env(STA_MODE)/timing_tt_min.rpt
+report_checks -path_delay min -corner tt >> reports/$::env(STA_MODE)/timing_tt_min.rpt
+
+
+report_checks -path_delay min_max
+
+exit
diff --git a/openlane/wb_interconnect/base.sdc b/openlane/wb_interconnect/base.sdc
new file mode 100644
index 0000000..a97c50d
--- /dev/null
+++ b/openlane/wb_interconnect/base.sdc
@@ -0,0 +1,192 @@
+###############################################################################
+# Created by write_sdc
+# Fri Nov 12 05:00:05 2021
+###############################################################################
+current_design wb_interconnect
+###############################################################################
+# Timing Constraints
+###############################################################################
+create_clock -name clk_i -period 10.0000 [get_ports {clk_i}]
+set_clock_uncertainty -rise_from [get_clocks {clk_i}] -rise_to [get_clocks {clk_i}] -hold 0.2500
+set_clock_uncertainty -rise_from [get_clocks {clk_i}] -rise_to [get_clocks {clk_i}] -setup 0.2500
+set_clock_uncertainty -rise_from [get_clocks {clk_i}] -fall_to [get_clocks {clk_i}] -hold 0.2500
+set_clock_uncertainty -rise_from [get_clocks {clk_i}] -fall_to [get_clocks {clk_i}] -setup 0.2500
+set_clock_uncertainty -fall_from [get_clocks {clk_i}] -rise_to [get_clocks {clk_i}] -hold 0.2500
+set_clock_uncertainty -fall_from [get_clocks {clk_i}] -rise_to [get_clocks {clk_i}] -setup 0.2500
+set_clock_uncertainty -fall_from [get_clocks {clk_i}] -fall_to [get_clocks {clk_i}] -hold 0.2500
+set_clock_uncertainty -fall_from [get_clocks {clk_i}] -fall_to [get_clocks {clk_i}] -setup 0.2500
+
+set ::env(SYNTH_TIMING_DERATE) 0.05
+puts "\[INFO\]: Setting timing derate to: [expr {$::env(SYNTH_TIMING_DERATE) * 10}] %"
+set_timing_derate -early [expr {1-$::env(SYNTH_TIMING_DERATE)}]
+set_timing_derate -late [expr {1+$::env(SYNTH_TIMING_DERATE)}]
+
+set_case_analysis 0 [get_ports {cfg_cska_wi[0]}]
+set_case_analysis 0 [get_ports {cfg_cska_wi[1]}]
+set_case_analysis 0 [get_ports {cfg_cska_wi[2]}]
+set_case_analysis 0 [get_ports {cfg_cska_wi[3]}]
+
+#Static Signal Clock Skew adjustment
+set_false_path -from [get_ports {cfg_cska_wi[0]}]
+set_false_path -from [get_ports {cfg_cska_wi[1]}]
+set_false_path -from [get_ports {cfg_cska_wi[2]}]
+set_false_path -from [get_ports {cfg_cska_wi[3]}]
+
+# Set max delay for clock skew
+set_max_delay 3.5 -from [get_ports {wbd_clk_int}]
+set_max_delay 2 -to [get_ports {wbd_clk_wi}]
+set_max_delay 3.5 -from wbd_clk_int -to wbd_clk_wi
+##
+set_input_delay -max 2.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {rst_n}]
+
+set_input_delay -max 6.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {m0_wbd_adr_i[*]}]
+set_input_delay -max 6.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {m0_wbd_dat_i[*]}]
+set_input_delay -max 6.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {m0_wbd_sel_i[*]}]
+set_input_delay -max 6.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s0_wbd_ack_i}]
+set_input_delay -max 6.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s0_wbd_dat_i[*]}]
+set_input_delay -max 6.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s1_wbd_ack_i}]
+set_input_delay -max 6.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s1_wbd_dat_i[*]}]
+set_input_delay -max 6.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s2_wbd_ack_i}]
+set_input_delay -max 6.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s2_wbd_dat_i[*]}]
+set_input_delay -max 6.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s3_wbd_ack_i}]
+set_input_delay -max 6.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s3_wbd_ack_i}]
+set_input_delay -max 6.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s4_wbd_dat_i[*]}]
+set_input_delay -max 6.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s4_wbd_dat_i[*]}]
+
+set_input_delay -min 2.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {m0_wbd_adr_i[*]}]
+set_input_delay -min 2.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {m0_wbd_dat_i[*]}]
+set_input_delay -min 2.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {m0_wbd_sel_i[*]}]
+set_input_delay -min 2.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s0_wbd_ack_i}]
+set_input_delay -min 2.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s0_wbd_dat_i[*]}]
+set_input_delay -min 2.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s1_wbd_ack_i}]
+set_input_delay -min 2.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s1_wbd_dat_i[*]}]
+set_input_delay -min 2.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s2_wbd_ack_i}]
+set_input_delay -min 2.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s2_wbd_dat_i[*]}]
+set_input_delay -min 2.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s3_wbd_ack_i}]
+set_input_delay -min 2.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s3_wbd_dat_i[*]}]
+set_input_delay -min 2.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s4_wbd_ack_i}]
+set_input_delay -min 2.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s4_wbd_dat_i[*]}]
+
+set_output_delay -max 4.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {m0_wbd_ack_o}]
+set_output_delay -max 4.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {m0_wbd_dat_o[*]}]
+set_output_delay -max 4.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {m0_wbd_err_o}]
+
+set_output_delay -max 4.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s0_wbd_adr_o[*]}]
+set_output_delay -max 4.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s0_wbd_cyc_o}]
+set_output_delay -max 4.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s0_wbd_dat_o[*]}]
+set_output_delay -max 4.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s0_wbd_sel_o[*]}]
+set_output_delay -max 4.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s0_wbd_we_o}]
+
+set_output_delay -max 4.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s1_wbd_adr_o[*]}]
+set_output_delay -max 4.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s1_wbd_cyc_o}]
+set_output_delay -max 4.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s1_wbd_dat_o[*]}]
+set_output_delay -max 4.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s1_wbd_sel_o[*]}]
+set_output_delay -max 4.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s1_wbd_we_o}]
+
+set_output_delay -max 4.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s2_wbd_adr_o[*]}]
+set_output_delay -max 4.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s2_wbd_cyc_o}]
+set_output_delay -max 4.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s2_wbd_dat_o[*]}]
+set_output_delay -max 4.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s2_wbd_sel_o[*]}]
+set_output_delay -max 4.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s2_wbd_we_o}]
+
+set_output_delay -max 4.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s3_wbd_adr_o[*]}]
+set_output_delay -max 4.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s3_wbd_cyc_o}]
+set_output_delay -max 4.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s3_wbd_dat_o[*]}]
+set_output_delay -max 4.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s3_wbd_sel_o[*]}]
+set_output_delay -max 4.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s3_wbd_we_o}]
+
+set_output_delay -max 4.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s4_wbd_adr_o[*]}]
+set_output_delay -max 4.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s4_wbd_cyc_o}]
+set_output_delay -max 4.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s4_wbd_dat_o[*]}]
+set_output_delay -max 4.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s4_wbd_sel_o[*]}]
+set_output_delay -max 4.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s4_wbd_we_o}]
+
+set_output_delay -min 2.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {m0_wbd_ack_o}]
+set_output_delay -min 2.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {m0_wbd_dat_o[*]}]
+set_output_delay -min 2.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {m0_wbd_err_o}]
+
+set_output_delay -min 2.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s0_wbd_adr_o[*]}]
+set_output_delay -min 2.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s0_wbd_cyc_o}]
+set_output_delay -min 2.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s0_wbd_dat_o[*]}]
+
+set_output_delay -min 2.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s1_wbd_adr_o[*]}]
+set_output_delay -min 2.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s1_wbd_cyc_o}]
+set_output_delay -min 2.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s1_wbd_dat_o[*]}]
+
+set_output_delay -min 2.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s2_wbd_adr_o[*]}]
+set_output_delay -min 2.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s2_wbd_cyc_o}]
+set_output_delay -min 2.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s2_wbd_dat_o[*]}]
+
+set_output_delay -min 2.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s3_wbd_adr_o[*]}]
+set_output_delay -min 2.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s3_wbd_cyc_o}]
+set_output_delay -min 2.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s3_wbd_dat_o[*]}]
+
+set_output_delay -min 2.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s4_wbd_adr_o[*]}]
+set_output_delay -min 2.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s4_wbd_cyc_o}]
+set_output_delay -min 2.0000 -clock [get_clocks {clk_i}] -add_delay [get_ports {s4_wbd_dat_o[*]}]
+
+
+###############################################################################
+# Environment
+###############################################################################
+set_load -pin_load 0.0334 [get_ports {m0_wbd_ack_o}]
+set_load -pin_load 0.0334 [get_ports {m0_wbd_err_o}]
+set_load -pin_load 0.0334 [get_ports {s0_wbd_cyc_o}]
+set_load -pin_load 0.0334 [get_ports {s0_wbd_stb_o}]
+set_load -pin_load 0.0334 [get_ports {s0_wbd_we_o}]
+set_load -pin_load 0.0334 [get_ports {s1_wbd_cyc_o}]
+set_load -pin_load 0.0334 [get_ports {s1_wbd_stb_o}]
+set_load -pin_load 0.0334 [get_ports {s1_wbd_we_o}]
+set_load -pin_load 0.0334 [get_ports {s2_wbd_cyc_o}]
+set_load -pin_load 0.0334 [get_ports {s2_wbd_stb_o}]
+set_load -pin_load 0.0334 [get_ports {s2_wbd_we_o}]
+set_load -pin_load 0.0334 [get_ports {s3_wbd_cyc_o}]
+set_load -pin_load 0.0334 [get_ports {s3_wbd_stb_o}]
+set_load -pin_load 0.0334 [get_ports {s3_wbd_we_o}]
+set_load -pin_load 0.0334 [get_ports {s4_wbd_cyc_o}]
+set_load -pin_load 0.0334 [get_ports {s4_wbd_stb_o}]
+set_load -pin_load 0.0334 [get_ports {s4_wbd_we_o}]
+set_load -pin_load 0.0334 [get_ports {wbd_clk_wi}]
+set_load -pin_load 0.0334 [get_ports {m0_wbd_dat_o[*]}]
+set_load -pin_load 0.0334 [get_ports {s0_wbd_adr_o[*]}]
+set_load -pin_load 0.0334 [get_ports {s0_wbd_dat_o[*]}]
+set_load -pin_load 0.0334 [get_ports {s0_wbd_sel_o[*]}]
+
+set_load -pin_load 0.0334 [get_ports {s1_wbd_adr_o[*]}]
+set_load -pin_load 0.0334 [get_ports {s1_wbd_dat_o[*]}]
+set_load -pin_load 0.0334 [get_ports {s1_wbd_sel_o[*]}]
+
+set_load -pin_load 0.0334 [get_ports {s2_wbd_adr_o[*]}]
+set_load -pin_load 0.0334 [get_ports {s2_wbd_dat_o[*]}]
+set_load -pin_load 0.0334 [get_ports {s2_wbd_sel_o[*]}]
+
+set_load -pin_load 0.0334 [get_ports {s3_wbd_adr_o[*]}]
+set_load -pin_load 0.0334 [get_ports {s3_wbd_dat_o[*]}]
+set_load -pin_load 0.0334 [get_ports {s3_wbd_sel_o[*]}]
+
+set_load -pin_load 0.0334 [get_ports {s4_wbd_adr_o[*]}]
+set_load -pin_load 0.0334 [get_ports {s4_wbd_dat_o[*]}]
+set_load -pin_load 0.0334 [get_ports {s4_wbd_sel_o[*]}]
+
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {clk_i}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {m0_wbd_cyc_i}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {m0_wbd_stb_i}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {m0_wbd_we_i}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {m0_wbd_adr_i[*]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {m0_wbd_dat_i[*]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {rst_n}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {wbd_clk_int}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {cfg_cska_wi[*]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {s0_wbd_dat_i[*]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {s0_wbd_ack_i}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {s1_wbd_dat_i[*]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {s1_wbd_ack_i}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {s2_wbd_dat_i[*]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {s2_wbd_ack_i}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {s3_wbd_dat_i[*]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {s3_wbd_ack_i}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {s4_wbd_dat_i[*]}]
+set_driving_cell -lib_cell sky130_fd_sc_hd__inv_8 -pin {Y} -input_transition_rise 0.0000 -input_transition_fall 0.0000 [get_ports {s4_wbd_ack_i}]
+###############################################################################
+# Design Rules
+###############################################################################
diff --git a/openlane/wb_interconnect/config.tcl b/openlane/wb_interconnect/config.tcl
new file mode 100755
index 0000000..6e1de03
--- /dev/null
+++ b/openlane/wb_interconnect/config.tcl
@@ -0,0 +1,120 @@
+# SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# SPDX-License-Identifier: Apache-2.0
+# SPDX-FileContributor: Modified by Dinesh Annayya <dinesha@opencores.org>
+
+# Global
+# ------
+
+set script_dir [file dirname [file normalize [info script]]]
+# Name
+set ::env(DESIGN_NAME) wb_interconnect
+
+
+set ::env(DESIGN_IS_CORE) "0"
+
+# Timing configuration
+set ::env(CLOCK_PERIOD) "10"
+set ::env(CLOCK_PORT) "clk_i"
+
+set ::env(SYNTH_MAX_FANOUT) 4
+set ::env(SYNTH_BUFFERING) {0}
+
+## CTS BUFFER
+set ::env(CTS_CLK_BUFFER_LIST) "sky130_fd_sc_hd__clkbuf_4 sky130_fd_sc_hd__clkbuf_8"
+set ::env(CTS_SINK_CLUSTERING_SIZE) "16"
+set ::env(CLOCK_BUFFER_FANOUT) "8"
+
+# Sources
+# -------
+
+# Local sources + no2usb sources
+set ::env(VERILOG_FILES) "\
+ $::env(DESIGN_DIR)/../../verilog/rtl/clk_skew_adjust/src/clk_skew_adjust.gv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/lib/wb_stagging.sv \
+ $::env(DESIGN_DIR)/../../verilog/rtl/wb_interconnect/src/wb_interconnect.sv \
+ "
+
+set ::env(SYNTH_PARAMETERS) "SCW=8 \
+ CH_CLK_WD=9\
+ CH_DATA_WD=104 \
+ "
+set ::env(SYNTH_READ_BLACKBOX_LIB) 1
+set ::env(SYNTH_DEFINES) [list SYNTHESIS ]
+set ::env(SDC_FILE) "$::env(DESIGN_DIR)/base.sdc"
+set ::env(BASE_SDC_FILE) "$::env(DESIGN_DIR)/base.sdc"
+
+set ::env(LEC_ENABLE) 0
+
+set ::env(VDD_PIN) [list {vccd1}]
+set ::env(GND_PIN) [list {vssd1}]
+
+set ::env(SCAN_TOTAL_CHAINS) 8
+
+# Floorplanning
+# -------------
+
+set ::env(FP_PIN_ORDER_CFG) $::env(DESIGN_DIR)/pin_order.cfg
+
+set ::env(FP_SIZING) absolute
+set ::env(DIE_AREA) "0 0 200 2300"
+
+
+# If you're going to use multiple power domains, then keep this disabled.
+set ::env(RUN_CVC) 0
+
+#set ::env(PDN_CFG) $script_dir/pdn.tcl
+
+
+set ::env(PL_TIME_DRIVEN) 1
+set ::env(FP_CORE_UTIL) "50"
+set ::env(PL_TARGET_DENSITY) "0.50"
+
+# helps in anteena fix
+set ::env(USE_ARC_ANTENNA_CHECK) "1"
+
+set ::env(FP_IO_VEXTEND) 4
+set ::env(FP_IO_HEXTEND) 4
+
+set ::env(FP_PDN_VPITCH) 100
+set ::env(FP_PDN_HPITCH) 100
+set ::env(FP_PDN_VWIDTH) 6.2
+set ::env(FP_PDN_HWIDTH) 6.2
+
+#set ::env(GLB_RT_MAXLAYER) 5
+set ::env(RT_MAX_LAYER) {met4}
+
+#Lef
+set ::env(MAGIC_GENERATE_LEF) {1}
+set ::env(MAGIC_WRITE_FULL_LEF) {0}
+
+set ::env(DIODE_INSERTION_STRATEGY) 4
+
+
+#LVS Issue - DEF Base looks to having issue
+set ::env(MAGIC_EXT_USE_GDS) {1}
+
+set ::env(GLB_RESIZER_MAX_SLEW_MARGIN) {1.5}
+set ::env(PL_RESIZER_MAX_SLEW_MARGIN) {1.5}
+
+set ::env(GLB_RESIZER_MAX_CAP_MARGIN) {0.25}
+set ::env(PL_RESIZER_MAX_CAP_MARGIN) {0.25}
+
+set ::env(GLB_RESIZER_MAX_WIRE_LENGTH) {500}
+set ::env(PL_RESIZER_MAX_WIRE_LENGTH) {500}
+
+set ::env(QUIT_ON_TIMING_VIOLATIONS) "0"
+set ::env(QUIT_ON_MAGIC_DRC) "1"
+set ::env(QUIT_ON_LVS_ERROR) "1"
+set ::env(QUIT_ON_SLEW_VIOLATIONS) "0"
diff --git a/openlane/wb_interconnect/pdn.tcl b/openlane/wb_interconnect/pdn.tcl
new file mode 100644
index 0000000..1fe689b
--- /dev/null
+++ b/openlane/wb_interconnect/pdn.tcl
@@ -0,0 +1,49 @@
+# SPDX-FileCopyrightText: 2020 Efabless Corporation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# SPDX-License-Identifier: Apache-2.0
+
+# Power nets
+set ::power_nets $::env(VDD_PIN)
+set ::ground_nets $::env(GND_PIN)
+
+set ::macro_blockage_layer_list "li1 met1 met2 met3 met4 met5"
+
+pdngen::specify_grid stdcell {
+ name grid
+ rails {
+ met1 {width 0.48 pitch $::env(PLACE_SITE_HEIGHT) offset 0}
+ }
+ straps {
+ met4 {width 1.6 pitch $::env(FP_PDN_VPITCH) offset $::env(FP_PDN_VOFFSET)}
+ met5 {width 1.6 pitch $::env(FP_PDN_HPITCH) offset $::env(FP_PDN_HOFFSET)}
+ }
+ connect {{met1 met4} {met4 met5}}
+}
+
+pdngen::specify_grid macro {
+ power_pins "VPWR"
+ ground_pins "VGND"
+ blockages "li1 met1 met2 met3 met4"
+ straps {
+ }
+ connect {{met4_PIN_ver met5}}
+}
+
+set ::halo 5
+
+# POWER or GROUND #Std. cell rails starting with power or ground rails at the bottom of the core area
+set ::rails_start_with "POWER" ;
+
+# POWER or GROUND #Upper metal stripes starting with power or ground rails at the left/bottom of the core area
+set ::stripes_start_with "POWER" ;
diff --git a/openlane/wb_interconnect/pin_order.cfg b/openlane/wb_interconnect/pin_order.cfg
new file mode 100644
index 0000000..18c6b9a
--- /dev/null
+++ b/openlane/wb_interconnect/pin_order.cfg
@@ -0,0 +1,1135 @@
+#BUS_SORT
+
+#MANUAL_PLACE
+
+#S
+m0_wbd_stb_i 0000 0 2
+m0_wbd_we_i
+m0_wbd_adr_i\[31\]
+m0_wbd_adr_i\[30\]
+m0_wbd_adr_i\[29\]
+m0_wbd_adr_i\[28\]
+m0_wbd_adr_i\[27\]
+m0_wbd_adr_i\[26\]
+m0_wbd_adr_i\[25\]
+m0_wbd_adr_i\[24\]
+m0_wbd_adr_i\[23\]
+m0_wbd_adr_i\[22\]
+m0_wbd_adr_i\[21\]
+m0_wbd_adr_i\[20\]
+m0_wbd_adr_i\[19\]
+m0_wbd_adr_i\[18\]
+m0_wbd_adr_i\[17\]
+m0_wbd_adr_i\[16\]
+m0_wbd_adr_i\[15\]
+m0_wbd_adr_i\[14\]
+m0_wbd_adr_i\[13\]
+m0_wbd_adr_i\[12\]
+m0_wbd_adr_i\[11\]
+m0_wbd_adr_i\[10\]
+m0_wbd_adr_i\[9\]
+m0_wbd_adr_i\[8\]
+m0_wbd_adr_i\[7\]
+m0_wbd_adr_i\[6\]
+m0_wbd_adr_i\[5\]
+m0_wbd_adr_i\[4\]
+m0_wbd_adr_i\[3\]
+m0_wbd_adr_i\[2\]
+m0_wbd_adr_i\[1\]
+m0_wbd_adr_i\[0\]
+m0_wbd_sel_i\[3\]
+m0_wbd_sel_i\[2\]
+m0_wbd_sel_i\[1\]
+m0_wbd_sel_i\[0\]
+m0_wbd_dat_i\[31\]
+m0_wbd_dat_i\[30\]
+m0_wbd_dat_i\[29\]
+m0_wbd_dat_i\[28\]
+m0_wbd_dat_i\[27\]
+m0_wbd_dat_i\[26\]
+m0_wbd_dat_i\[25\]
+m0_wbd_dat_i\[24\]
+m0_wbd_dat_i\[23\]
+m0_wbd_dat_i\[22\]
+m0_wbd_dat_i\[21\]
+m0_wbd_dat_i\[20\]
+m0_wbd_dat_i\[19\]
+m0_wbd_dat_i\[18\]
+m0_wbd_dat_i\[17\]
+m0_wbd_dat_i\[16\]
+m0_wbd_dat_i\[15\]
+m0_wbd_dat_i\[14\]
+m0_wbd_dat_i\[13\]
+m0_wbd_dat_i\[12\]
+m0_wbd_dat_i\[11\]
+m0_wbd_dat_i\[10\]
+m0_wbd_dat_i\[9\]
+m0_wbd_dat_i\[8\]
+m0_wbd_dat_i\[7\]
+m0_wbd_dat_i\[6\]
+m0_wbd_dat_i\[5\]
+m0_wbd_dat_i\[4\]
+m0_wbd_dat_i\[3\]
+m0_wbd_dat_i\[2\]
+m0_wbd_dat_i\[1\]
+m0_wbd_dat_i\[0\]
+m0_wbd_dat_o\[31\]
+m0_wbd_dat_o\[30\]
+m0_wbd_dat_o\[29\]
+m0_wbd_dat_o\[28\]
+m0_wbd_dat_o\[27\]
+m0_wbd_dat_o\[26\]
+m0_wbd_dat_o\[25\]
+m0_wbd_dat_o\[24\]
+m0_wbd_dat_o\[23\]
+m0_wbd_dat_o\[22\]
+m0_wbd_dat_o\[21\]
+m0_wbd_dat_o\[20\]
+m0_wbd_dat_o\[19\]
+m0_wbd_dat_o\[18\]
+m0_wbd_dat_o\[17\]
+m0_wbd_dat_o\[16\]
+m0_wbd_dat_o\[15\]
+m0_wbd_dat_o\[14\]
+m0_wbd_dat_o\[13\]
+m0_wbd_dat_o\[12\]
+m0_wbd_dat_o\[11\]
+m0_wbd_dat_o\[10\]
+m0_wbd_dat_o\[9\]
+m0_wbd_dat_o\[8\]
+m0_wbd_dat_o\[7\]
+m0_wbd_dat_o\[6\]
+m0_wbd_dat_o\[5\]
+m0_wbd_dat_o\[4\]
+m0_wbd_dat_o\[3\]
+m0_wbd_dat_o\[2\]
+m0_wbd_dat_o\[1\]
+m0_wbd_dat_o\[0\]
+m0_wbd_ack_o
+m0_wbd_err_o
+m0_wbd_cyc_i
+
+rst_n 110 0 2
+cfg_cska_wi\[3\]
+cfg_cska_wi\[2\]
+cfg_cska_wi\[1\]
+cfg_cska_wi\[0\]
+clk_i
+wbd_clk_wi
+wbd_clk_int
+ch_clk_in\[8\]
+ch_clk_in\[7\]
+ch_clk_in\[6\]
+ch_clk_in\[5\]
+ch_clk_in\[4\]
+ch_clk_in\[3\]
+ch_clk_in\[2\]
+ch_clk_in\[1\]
+ch_clk_in\[0\]
+
+
+#W
+ch_clk_out\[0\] 0025 0 2
+s0_wbd_cyc_o
+s0_wbd_stb_o
+s0_wbd_we_o
+s0_wbd_adr_o\[7\]
+s0_wbd_adr_o\[6\]
+s0_wbd_adr_o\[5\]
+s0_wbd_adr_o\[4\]
+s0_wbd_adr_o\[3\]
+s0_wbd_adr_o\[2\]
+s0_wbd_adr_o\[1\]
+s0_wbd_adr_o\[0\]
+s0_wbd_sel_o\[3\]
+s0_wbd_sel_o\[2\]
+s0_wbd_sel_o\[1\]
+s0_wbd_sel_o\[0\]
+s0_wbd_dat_o\[31\]
+s0_wbd_dat_o\[30\]
+s0_wbd_dat_o\[29\]
+s0_wbd_dat_o\[28\]
+s0_wbd_dat_o\[27\]
+s0_wbd_dat_o\[26\]
+s0_wbd_dat_o\[25\]
+s0_wbd_dat_o\[24\]
+s0_wbd_dat_o\[23\]
+s0_wbd_dat_o\[22\]
+s0_wbd_dat_o\[21\]
+s0_wbd_dat_o\[20\]
+s0_wbd_dat_o\[19\]
+s0_wbd_dat_o\[18\]
+s0_wbd_dat_o\[17\]
+s0_wbd_dat_o\[16\]
+s0_wbd_dat_o\[15\]
+s0_wbd_dat_o\[14\]
+s0_wbd_dat_o\[13\]
+s0_wbd_dat_o\[12\]
+s0_wbd_dat_o\[11\]
+s0_wbd_dat_o\[10\]
+s0_wbd_dat_o\[9\]
+s0_wbd_dat_o\[8\]
+s0_wbd_dat_o\[7\]
+s0_wbd_dat_o\[6\]
+s0_wbd_dat_o\[5\]
+s0_wbd_dat_o\[4\]
+s0_wbd_dat_o\[3\]
+s0_wbd_dat_o\[2\]
+s0_wbd_dat_o\[1\]
+s0_wbd_dat_o\[0\]
+s0_wbd_dat_i\[31\]
+s0_wbd_dat_i\[30\]
+s0_wbd_dat_i\[29\]
+s0_wbd_dat_i\[28\]
+s0_wbd_dat_i\[27\]
+s0_wbd_dat_i\[26\]
+s0_wbd_dat_i\[25\]
+s0_wbd_dat_i\[24\]
+s0_wbd_dat_i\[23\]
+s0_wbd_dat_i\[22\]
+s0_wbd_dat_i\[21\]
+s0_wbd_dat_i\[20\]
+s0_wbd_dat_i\[19\]
+s0_wbd_dat_i\[18\]
+s0_wbd_dat_i\[17\]
+s0_wbd_dat_i\[16\]
+s0_wbd_dat_i\[15\]
+s0_wbd_dat_i\[14\]
+s0_wbd_dat_i\[13\]
+s0_wbd_dat_i\[12\]
+s0_wbd_dat_i\[11\]
+s0_wbd_dat_i\[10\]
+s0_wbd_dat_i\[9\]
+s0_wbd_dat_i\[8\]
+s0_wbd_dat_i\[7\]
+s0_wbd_dat_i\[6\]
+s0_wbd_dat_i\[5\]
+s0_wbd_dat_i\[4\]
+s0_wbd_dat_i\[3\]
+s0_wbd_dat_i\[2\]
+s0_wbd_dat_i\[1\]
+s0_wbd_dat_i\[0\]
+s0_wbd_ack_i
+
+ch_data_in\[0\] 0150 0 2
+ch_data_in\[1\]
+ch_data_in\[2\]
+ch_data_in\[3\]
+ch_data_in\[4\]
+ch_data_out\[5\]
+ch_data_out\[6\]
+ch_data_out\[7\]
+ch_data_out\[8\]
+ch_data_out\[9\]
+ch_data_out\[10\]
+ch_data_out\[11\]
+ch_data_out\[12\]
+
+ch_data_in\[13\]
+ch_data_in\[14\]
+ch_data_in\[15\]
+ch_data_in\[16\]
+ch_data_in\[17\]
+ch_data_out\[18\]
+ch_data_out\[19\]
+ch_data_out\[20\]
+ch_data_out\[21\]
+ch_data_out\[22\]
+ch_data_out\[23\]
+ch_data_out\[24\]
+ch_data_out\[25\]
+
+ch_data_in\[26\]
+ch_data_in\[27\]
+ch_data_in\[28\]
+ch_data_in\[29\]
+ch_data_in\[30\]
+ch_data_out\[31\]
+ch_data_out\[32\]
+ch_data_out\[33\]
+ch_data_out\[34\]
+ch_data_out\[35\]
+ch_data_out\[36\]
+ch_data_out\[37\]
+ch_data_out\[38\]
+
+ch_data_in\[39\]
+ch_data_in\[40\]
+ch_data_in\[41\]
+ch_data_in\[42\]
+ch_data_in\[43\]
+ch_data_out\[44\]
+ch_data_out\[45\]
+ch_data_out\[46\]
+ch_data_out\[47\]
+ch_data_out\[48\]
+ch_data_out\[49\]
+ch_data_out\[50\]
+ch_data_out\[51\]
+
+ch_data_in\[52\]
+ch_data_in\[53\]
+ch_data_in\[54\]
+ch_data_in\[55\]
+ch_data_in\[56\]
+ch_data_out\[57\]
+ch_data_out\[58\]
+ch_data_out\[59\]
+ch_data_out\[60\]
+ch_data_out\[61\]
+ch_data_out\[62\]
+ch_data_out\[63\]
+ch_data_out\[64\]
+
+ch_data_in\[65\]
+ch_data_in\[66\]
+ch_data_in\[67\]
+ch_data_in\[68\]
+ch_data_in\[69\]
+ch_data_out\[70\]
+ch_data_out\[71\]
+ch_data_out\[72\]
+ch_data_out\[73\]
+ch_data_out\[74\]
+ch_data_out\[75\]
+ch_data_out\[76\]
+ch_data_out\[77\]
+
+ch_data_in\[78\]
+ch_data_in\[79\]
+ch_data_in\[80\]
+ch_data_in\[81\]
+ch_data_in\[82\]
+ch_data_out\[83\]
+ch_data_out\[84\]
+ch_data_out\[85\]
+ch_data_out\[86\]
+ch_data_out\[87\]
+ch_data_out\[88\]
+ch_data_out\[89\]
+ch_data_out\[90\]
+
+ch_data_in\[91\]
+ch_data_in\[92\]
+ch_data_in\[93\]
+ch_data_in\[94\]
+ch_data_in\[95\]
+ch_data_out\[96\]
+ch_data_out\[97\]
+ch_data_out\[98\]
+ch_data_out\[99\]
+ch_data_out\[100\]
+ch_data_out\[101\]
+ch_data_out\[102\]
+ch_data_out\[103\]
+
+ch_clk_out\[5\] 0525 0 2
+s5_wbd_cyc_o
+s5_wbd_stb_o
+s5_wbd_we_o
+s5_wbd_adr_o\[9\]
+s5_wbd_adr_o\[8\]
+s5_wbd_adr_o\[7\]
+s5_wbd_adr_o\[6\]
+s5_wbd_adr_o\[5\]
+s5_wbd_adr_o\[4\]
+s5_wbd_adr_o\[3\]
+s5_wbd_adr_o\[2\]
+s5_wbd_adr_o\[1\]
+s5_wbd_adr_o\[0\]
+s5_wbd_dat_o\[31\]
+s5_wbd_dat_o\[30\]
+s5_wbd_dat_o\[29\]
+s5_wbd_dat_o\[28\]
+s5_wbd_dat_o\[27\]
+s5_wbd_dat_o\[26\]
+s5_wbd_dat_o\[25\]
+s5_wbd_dat_o\[24\]
+s5_wbd_dat_o\[23\]
+s5_wbd_dat_o\[22\]
+s5_wbd_dat_o\[21\]
+s5_wbd_dat_o\[20\]
+s5_wbd_dat_o\[19\]
+s5_wbd_dat_o\[18\]
+s5_wbd_dat_o\[17\]
+s5_wbd_dat_o\[16\]
+s5_wbd_dat_o\[15\]
+s5_wbd_dat_o\[14\]
+s5_wbd_dat_o\[13\]
+s5_wbd_dat_o\[12\]
+s5_wbd_dat_o\[11\]
+s5_wbd_dat_o\[10\]
+s5_wbd_dat_o\[9\]
+s5_wbd_dat_o\[8\]
+s5_wbd_dat_o\[7\]
+s5_wbd_dat_o\[6\]
+s5_wbd_dat_o\[5\]
+s5_wbd_dat_o\[4\]
+s5_wbd_dat_o\[3\]
+s5_wbd_dat_o\[2\]
+s5_wbd_dat_o\[1\]
+s5_wbd_dat_o\[0\]
+s5_wbd_sel_o\[3\]
+s5_wbd_sel_o\[2\]
+s5_wbd_sel_o\[1\]
+s5_wbd_sel_o\[0\]
+s5_wbd_dat_i\[31\]
+s5_wbd_dat_i\[30\]
+s5_wbd_dat_i\[29\]
+s5_wbd_dat_i\[28\]
+s5_wbd_dat_i\[27\]
+s5_wbd_dat_i\[26\]
+s5_wbd_dat_i\[25\]
+s5_wbd_dat_i\[24\]
+s5_wbd_dat_i\[23\]
+s5_wbd_dat_i\[22\]
+s5_wbd_dat_i\[21\]
+s5_wbd_dat_i\[20\]
+s5_wbd_dat_i\[19\]
+s5_wbd_dat_i\[18\]
+s5_wbd_dat_i\[17\]
+s5_wbd_dat_i\[16\]
+s5_wbd_dat_i\[15\]
+s5_wbd_dat_i\[14\]
+s5_wbd_dat_i\[13\]
+s5_wbd_dat_i\[12\]
+s5_wbd_dat_i\[11\]
+s5_wbd_dat_i\[10\]
+s5_wbd_dat_i\[9\]
+s5_wbd_dat_i\[8\]
+s5_wbd_dat_i\[7\]
+s5_wbd_dat_i\[6\]
+s5_wbd_dat_i\[5\]
+s5_wbd_dat_i\[4\]
+s5_wbd_dat_i\[3\]
+s5_wbd_dat_i\[2\]
+s5_wbd_dat_i\[1\]
+s5_wbd_dat_i\[0\]
+s5_wbd_ack_i
+
+ch_data_out\[52\] 0650 0 2
+ch_data_out\[53\]
+ch_data_out\[54\]
+ch_data_out\[55\]
+ch_data_out\[56\]
+ch_data_in\[57\]
+ch_data_in\[58\]
+ch_data_in\[59\]
+ch_data_in\[60\]
+ch_data_in\[61\]
+ch_data_in\[62\]
+ch_data_in\[63\]
+ch_data_in\[64\]
+
+ch_clk_out\[6\] 1025 0 2
+s6_wbd_cyc_o
+s6_wbd_stb_o
+s6_wbd_we_o
+s6_wbd_adr_o\[9\]
+s6_wbd_adr_o\[8\]
+s6_wbd_adr_o\[7\]
+s6_wbd_adr_o\[6\]
+s6_wbd_adr_o\[5\]
+s6_wbd_adr_o\[4\]
+s6_wbd_adr_o\[3\]
+s6_wbd_adr_o\[2\]
+s6_wbd_adr_o\[1\]
+s6_wbd_adr_o\[0\]
+s6_wbd_dat_o\[31\]
+s6_wbd_dat_o\[30\]
+s6_wbd_dat_o\[29\]
+s6_wbd_dat_o\[28\]
+s6_wbd_dat_o\[27\]
+s6_wbd_dat_o\[26\]
+s6_wbd_dat_o\[25\]
+s6_wbd_dat_o\[24\]
+s6_wbd_dat_o\[23\]
+s6_wbd_dat_o\[22\]
+s6_wbd_dat_o\[21\]
+s6_wbd_dat_o\[20\]
+s6_wbd_dat_o\[19\]
+s6_wbd_dat_o\[18\]
+s6_wbd_dat_o\[17\]
+s6_wbd_dat_o\[16\]
+s6_wbd_dat_o\[15\]
+s6_wbd_dat_o\[14\]
+s6_wbd_dat_o\[13\]
+s6_wbd_dat_o\[12\]
+s6_wbd_dat_o\[11\]
+s6_wbd_dat_o\[10\]
+s6_wbd_dat_o\[9\]
+s6_wbd_dat_o\[8\]
+s6_wbd_dat_o\[7\]
+s6_wbd_dat_o\[6\]
+s6_wbd_dat_o\[5\]
+s6_wbd_dat_o\[4\]
+s6_wbd_dat_o\[3\]
+s6_wbd_dat_o\[2\]
+s6_wbd_dat_o\[1\]
+s6_wbd_dat_o\[0\]
+s6_wbd_sel_o\[3\]
+s6_wbd_sel_o\[2\]
+s6_wbd_sel_o\[1\]
+s6_wbd_sel_o\[0\]
+s6_wbd_dat_i\[31\]
+s6_wbd_dat_i\[30\]
+s6_wbd_dat_i\[29\]
+s6_wbd_dat_i\[28\]
+s6_wbd_dat_i\[27\]
+s6_wbd_dat_i\[26\]
+s6_wbd_dat_i\[25\]
+s6_wbd_dat_i\[24\]
+s6_wbd_dat_i\[23\]
+s6_wbd_dat_i\[22\]
+s6_wbd_dat_i\[21\]
+s6_wbd_dat_i\[20\]
+s6_wbd_dat_i\[19\]
+s6_wbd_dat_i\[18\]
+s6_wbd_dat_i\[17\]
+s6_wbd_dat_i\[16\]
+s6_wbd_dat_i\[15\]
+s6_wbd_dat_i\[14\]
+s6_wbd_dat_i\[13\]
+s6_wbd_dat_i\[12\]
+s6_wbd_dat_i\[11\]
+s6_wbd_dat_i\[10\]
+s6_wbd_dat_i\[9\]
+s6_wbd_dat_i\[8\]
+s6_wbd_dat_i\[7\]
+s6_wbd_dat_i\[6\]
+s6_wbd_dat_i\[5\]
+s6_wbd_dat_i\[4\]
+s6_wbd_dat_i\[3\]
+s6_wbd_dat_i\[2\]
+s6_wbd_dat_i\[1\]
+s6_wbd_dat_i\[0\]
+s6_wbd_ack_i
+
+ch_data_out\[65\] 1150 0 2
+ch_data_out\[66\]
+ch_data_out\[67\]
+ch_data_out\[68\]
+ch_data_out\[69\]
+ch_data_in\[70\]
+ch_data_in\[71\]
+ch_data_in\[72\]
+ch_data_in\[73\]
+ch_data_in\[74\]
+ch_data_in\[75\]
+ch_data_in\[76\]
+ch_data_in\[77\]
+
+ch_clk_out\[7\] 1525 0 2
+s7_wbd_cyc_o
+s7_wbd_stb_o
+s7_wbd_we_o
+s7_wbd_adr_o\[9\]
+s7_wbd_adr_o\[8\]
+s7_wbd_adr_o\[7\]
+s7_wbd_adr_o\[6\]
+s7_wbd_adr_o\[5\]
+s7_wbd_adr_o\[4\]
+s7_wbd_adr_o\[3\]
+s7_wbd_adr_o\[2\]
+s7_wbd_adr_o\[1\]
+s7_wbd_adr_o\[0\]
+s7_wbd_dat_o\[31\]
+s7_wbd_dat_o\[30\]
+s7_wbd_dat_o\[29\]
+s7_wbd_dat_o\[28\]
+s7_wbd_dat_o\[27\]
+s7_wbd_dat_o\[26\]
+s7_wbd_dat_o\[25\]
+s7_wbd_dat_o\[24\]
+s7_wbd_dat_o\[23\]
+s7_wbd_dat_o\[22\]
+s7_wbd_dat_o\[21\]
+s7_wbd_dat_o\[20\]
+s7_wbd_dat_o\[19\]
+s7_wbd_dat_o\[18\]
+s7_wbd_dat_o\[17\]
+s7_wbd_dat_o\[16\]
+s7_wbd_dat_o\[15\]
+s7_wbd_dat_o\[14\]
+s7_wbd_dat_o\[13\]
+s7_wbd_dat_o\[12\]
+s7_wbd_dat_o\[11\]
+s7_wbd_dat_o\[10\]
+s7_wbd_dat_o\[9\]
+s7_wbd_dat_o\[8\]
+s7_wbd_dat_o\[7\]
+s7_wbd_dat_o\[6\]
+s7_wbd_dat_o\[5\]
+s7_wbd_dat_o\[4\]
+s7_wbd_dat_o\[3\]
+s7_wbd_dat_o\[2\]
+s7_wbd_dat_o\[1\]
+s7_wbd_dat_o\[0\]
+s7_wbd_sel_o\[3\]
+s7_wbd_sel_o\[2\]
+s7_wbd_sel_o\[1\]
+s7_wbd_sel_o\[0\]
+s7_wbd_dat_i\[31\]
+s7_wbd_dat_i\[30\]
+s7_wbd_dat_i\[29\]
+s7_wbd_dat_i\[28\]
+s7_wbd_dat_i\[27\]
+s7_wbd_dat_i\[26\]
+s7_wbd_dat_i\[25\]
+s7_wbd_dat_i\[24\]
+s7_wbd_dat_i\[23\]
+s7_wbd_dat_i\[22\]
+s7_wbd_dat_i\[21\]
+s7_wbd_dat_i\[20\]
+s7_wbd_dat_i\[19\]
+s7_wbd_dat_i\[18\]
+s7_wbd_dat_i\[17\]
+s7_wbd_dat_i\[16\]
+s7_wbd_dat_i\[15\]
+s7_wbd_dat_i\[14\]
+s7_wbd_dat_i\[13\]
+s7_wbd_dat_i\[12\]
+s7_wbd_dat_i\[11\]
+s7_wbd_dat_i\[10\]
+s7_wbd_dat_i\[9\]
+s7_wbd_dat_i\[8\]
+s7_wbd_dat_i\[7\]
+s7_wbd_dat_i\[6\]
+s7_wbd_dat_i\[5\]
+s7_wbd_dat_i\[4\]
+s7_wbd_dat_i\[3\]
+s7_wbd_dat_i\[2\]
+s7_wbd_dat_i\[1\]
+s7_wbd_dat_i\[0\]
+s7_wbd_ack_i
+
+ch_data_out\[78\] 1650 0 2
+ch_data_out\[79\]
+ch_data_out\[80\]
+ch_data_out\[81\]
+ch_data_out\[82\]
+ch_data_in\[83\]
+ch_data_in\[84\]
+ch_data_in\[85\]
+ch_data_in\[86\]
+ch_data_in\[87\]
+ch_data_in\[88\]
+ch_data_in\[89\]
+ch_data_in\[90\]
+
+ch_clk_out\[8\] 2025 0 2
+s8_wbd_stb_o
+s8_wbd_we_o
+s8_wbd_adr_o\[9\]
+s8_wbd_adr_o\[8\]
+s8_wbd_adr_o\[7\]
+s8_wbd_adr_o\[6\]
+s8_wbd_adr_o\[5\]
+s8_wbd_adr_o\[4\]
+s8_wbd_adr_o\[3\]
+s8_wbd_adr_o\[2\]
+s8_wbd_adr_o\[1\]
+s8_wbd_adr_o\[0\]
+s8_wbd_dat_o\[31\]
+s8_wbd_dat_o\[30\]
+s8_wbd_dat_o\[29\]
+s8_wbd_dat_o\[28\]
+s8_wbd_dat_o\[27\]
+s8_wbd_dat_o\[26\]
+s8_wbd_dat_o\[25\]
+s8_wbd_dat_o\[24\]
+s8_wbd_dat_o\[23\]
+s8_wbd_dat_o\[22\]
+s8_wbd_dat_o\[21\]
+s8_wbd_dat_o\[20\]
+s8_wbd_dat_o\[19\]
+s8_wbd_dat_o\[18\]
+s8_wbd_dat_o\[17\]
+s8_wbd_dat_o\[16\]
+s8_wbd_dat_o\[15\]
+s8_wbd_dat_o\[14\]
+s8_wbd_dat_o\[13\]
+s8_wbd_dat_o\[12\]
+s8_wbd_dat_o\[11\]
+s8_wbd_dat_o\[10\]
+s8_wbd_dat_o\[9\]
+s8_wbd_dat_o\[8\]
+s8_wbd_dat_o\[7\]
+s8_wbd_dat_o\[6\]
+s8_wbd_dat_o\[5\]
+s8_wbd_dat_o\[4\]
+s8_wbd_dat_o\[3\]
+s8_wbd_dat_o\[2\]
+s8_wbd_dat_o\[1\]
+s8_wbd_dat_o\[0\]
+s8_wbd_sel_o\[3\]
+s8_wbd_sel_o\[2\]
+s8_wbd_sel_o\[1\]
+s8_wbd_sel_o\[0\]
+s8_wbd_dat_i\[31\]
+s8_wbd_dat_i\[30\]
+s8_wbd_dat_i\[29\]
+s8_wbd_dat_i\[28\]
+s8_wbd_dat_i\[27\]
+s8_wbd_dat_i\[26\]
+s8_wbd_dat_i\[25\]
+s8_wbd_dat_i\[24\]
+s8_wbd_dat_i\[23\]
+s8_wbd_dat_i\[22\]
+s8_wbd_dat_i\[21\]
+s8_wbd_dat_i\[20\]
+s8_wbd_dat_i\[19\]
+s8_wbd_dat_i\[18\]
+s8_wbd_dat_i\[17\]
+s8_wbd_dat_i\[16\]
+s8_wbd_dat_i\[15\]
+s8_wbd_dat_i\[14\]
+s8_wbd_dat_i\[13\]
+s8_wbd_dat_i\[12\]
+s8_wbd_dat_i\[11\]
+s8_wbd_dat_i\[10\]
+s8_wbd_dat_i\[9\]
+s8_wbd_dat_i\[8\]
+s8_wbd_dat_i\[7\]
+s8_wbd_dat_i\[6\]
+s8_wbd_dat_i\[5\]
+s8_wbd_dat_i\[4\]
+s8_wbd_dat_i\[3\]
+s8_wbd_dat_i\[2\]
+s8_wbd_dat_i\[1\]
+s8_wbd_dat_i\[0\]
+s8_wbd_ack_i
+s8_wbd_cyc_o
+
+ch_data_out\[91\] 2150 0 2
+ch_data_out\[92\]
+ch_data_out\[93\]
+ch_data_out\[94\]
+ch_data_out\[95\]
+ch_data_in\[96\]
+ch_data_in\[97\]
+ch_data_in\[98\]
+ch_data_in\[99\]
+ch_data_in\[100\]
+ch_data_in\[101\]
+ch_data_in\[102\]
+ch_data_in\[103\]
+
+scan_mode 2200 0 2
+scan_en
+scan_si\[7\]
+scan_si\[6\]
+scan_si\[5\]
+scan_si\[4\]
+scan_si\[3\]
+scan_si\[2\]
+scan_si\[1\]
+scan_si\[0\]
+
+#E
+ch_clk_out\[1\] 0025 0 2
+s1_wbd_cyc_o
+s1_wbd_stb_o
+s1_wbd_we_o
+s1_wbd_adr_o\[10\]
+s1_wbd_adr_o\[9\]
+s1_wbd_adr_o\[8\]
+s1_wbd_adr_o\[7\]
+s1_wbd_adr_o\[6\]
+s1_wbd_adr_o\[5\]
+s1_wbd_adr_o\[4\]
+s1_wbd_adr_o\[3\]
+s1_wbd_adr_o\[2\]
+s1_wbd_adr_o\[1\]
+s1_wbd_adr_o\[0\]
+s1_wbd_dat_o\[31\]
+s1_wbd_dat_o\[30\]
+s1_wbd_dat_o\[29\]
+s1_wbd_dat_o\[28\]
+s1_wbd_dat_o\[27\]
+s1_wbd_dat_o\[26\]
+s1_wbd_dat_o\[25\]
+s1_wbd_dat_o\[24\]
+s1_wbd_dat_o\[23\]
+s1_wbd_dat_o\[22\]
+s1_wbd_dat_o\[21\]
+s1_wbd_dat_o\[20\]
+s1_wbd_dat_o\[19\]
+s1_wbd_dat_o\[18\]
+s1_wbd_dat_o\[17\]
+s1_wbd_dat_o\[16\]
+s1_wbd_dat_o\[15\]
+s1_wbd_dat_o\[14\]
+s1_wbd_dat_o\[13\]
+s1_wbd_dat_o\[12\]
+s1_wbd_dat_o\[11\]
+s1_wbd_dat_o\[10\]
+s1_wbd_dat_o\[9\]
+s1_wbd_dat_o\[8\]
+s1_wbd_dat_o\[7\]
+s1_wbd_dat_o\[6\]
+s1_wbd_dat_o\[5\]
+s1_wbd_dat_o\[4\]
+s1_wbd_dat_o\[3\]
+s1_wbd_dat_o\[2\]
+s1_wbd_dat_o\[1\]
+s1_wbd_dat_o\[0\]
+s1_wbd_sel_o\[3\]
+s1_wbd_sel_o\[2\]
+s1_wbd_sel_o\[1\]
+s1_wbd_sel_o\[0\]
+s1_wbd_dat_i\[31\]
+s1_wbd_dat_i\[30\]
+s1_wbd_dat_i\[29\]
+s1_wbd_dat_i\[28\]
+s1_wbd_dat_i\[27\]
+s1_wbd_dat_i\[26\]
+s1_wbd_dat_i\[25\]
+s1_wbd_dat_i\[24\]
+s1_wbd_dat_i\[23\]
+s1_wbd_dat_i\[22\]
+s1_wbd_dat_i\[21\]
+s1_wbd_dat_i\[20\]
+s1_wbd_dat_i\[19\]
+s1_wbd_dat_i\[18\]
+s1_wbd_dat_i\[17\]
+s1_wbd_dat_i\[16\]
+s1_wbd_dat_i\[15\]
+s1_wbd_dat_i\[14\]
+s1_wbd_dat_i\[13\]
+s1_wbd_dat_i\[12\]
+s1_wbd_dat_i\[11\]
+s1_wbd_dat_i\[10\]
+s1_wbd_dat_i\[9\]
+s1_wbd_dat_i\[8\]
+s1_wbd_dat_i\[7\]
+s1_wbd_dat_i\[6\]
+s1_wbd_dat_i\[5\]
+s1_wbd_dat_i\[4\]
+s1_wbd_dat_i\[3\]
+s1_wbd_dat_i\[2\]
+s1_wbd_dat_i\[1\]
+s1_wbd_dat_i\[0\]
+s1_wbd_ack_i
+
+ch_data_out\[0\] 0150 0 2
+ch_data_out\[1\]
+ch_data_out\[2\]
+ch_data_out\[3\]
+ch_data_out\[4\]
+ch_data_in\[5\]
+ch_data_in\[6\]
+ch_data_in\[7\]
+ch_data_in\[8\]
+ch_data_in\[9\]
+ch_data_in\[10\]
+ch_data_in\[11\]
+ch_data_in\[12\]
+
+ch_clk_out\[2\] 625 0 2
+s2_wbd_cyc_o
+s2_wbd_stb_o
+s2_wbd_we_o
+s2_wbd_adr_o\[10\]
+s2_wbd_adr_o\[9\]
+s2_wbd_adr_o\[8\]
+s2_wbd_adr_o\[7\]
+s2_wbd_adr_o\[6\]
+s2_wbd_adr_o\[5\]
+s2_wbd_adr_o\[4\]
+s2_wbd_adr_o\[3\]
+s2_wbd_adr_o\[2\]
+s2_wbd_adr_o\[1\]
+s2_wbd_adr_o\[0\]
+s2_wbd_dat_o\[31\]
+s2_wbd_dat_o\[30\]
+s2_wbd_dat_o\[29\]
+s2_wbd_dat_o\[28\]
+s2_wbd_dat_o\[27\]
+s2_wbd_dat_o\[26\]
+s2_wbd_dat_o\[25\]
+s2_wbd_dat_o\[24\]
+s2_wbd_dat_o\[23\]
+s2_wbd_dat_o\[22\]
+s2_wbd_dat_o\[21\]
+s2_wbd_dat_o\[20\]
+s2_wbd_dat_o\[19\]
+s2_wbd_dat_o\[18\]
+s2_wbd_dat_o\[17\]
+s2_wbd_dat_o\[16\]
+s2_wbd_dat_o\[15\]
+s2_wbd_dat_o\[14\]
+s2_wbd_dat_o\[13\]
+s2_wbd_dat_o\[12\]
+s2_wbd_dat_o\[11\]
+s2_wbd_dat_o\[10\]
+s2_wbd_dat_o\[9\]
+s2_wbd_dat_o\[8\]
+s2_wbd_dat_o\[7\]
+s2_wbd_dat_o\[6\]
+s2_wbd_dat_o\[5\]
+s2_wbd_dat_o\[4\]
+s2_wbd_dat_o\[3\]
+s2_wbd_dat_o\[2\]
+s2_wbd_dat_o\[1\]
+s2_wbd_dat_o\[0\]
+s2_wbd_sel_o\[3\]
+s2_wbd_sel_o\[2\]
+s2_wbd_sel_o\[1\]
+s2_wbd_sel_o\[0\]
+s2_wbd_dat_i\[31\]
+s2_wbd_dat_i\[30\]
+s2_wbd_dat_i\[29\]
+s2_wbd_dat_i\[28\]
+s2_wbd_dat_i\[27\]
+s2_wbd_dat_i\[26\]
+s2_wbd_dat_i\[25\]
+s2_wbd_dat_i\[24\]
+s2_wbd_dat_i\[23\]
+s2_wbd_dat_i\[22\]
+s2_wbd_dat_i\[21\]
+s2_wbd_dat_i\[20\]
+s2_wbd_dat_i\[19\]
+s2_wbd_dat_i\[18\]
+s2_wbd_dat_i\[17\]
+s2_wbd_dat_i\[16\]
+s2_wbd_dat_i\[15\]
+s2_wbd_dat_i\[14\]
+s2_wbd_dat_i\[13\]
+s2_wbd_dat_i\[12\]
+s2_wbd_dat_i\[11\]
+s2_wbd_dat_i\[10\]
+s2_wbd_dat_i\[9\]
+s2_wbd_dat_i\[8\]
+s2_wbd_dat_i\[7\]
+s2_wbd_dat_i\[6\]
+s2_wbd_dat_i\[5\]
+s2_wbd_dat_i\[4\]
+s2_wbd_dat_i\[3\]
+s2_wbd_dat_i\[2\]
+s2_wbd_dat_i\[1\]
+s2_wbd_dat_i\[0\]
+s2_wbd_ack_i
+
+ch_data_out\[13\] 0750 0 2
+ch_data_out\[14\]
+ch_data_out\[15\]
+ch_data_out\[16\]
+ch_data_out\[17\]
+ch_data_in\[18\]
+ch_data_in\[19\]
+ch_data_in\[20\]
+ch_data_in\[21\]
+ch_data_in\[22\]
+ch_data_in\[23\]
+ch_data_in\[24\]
+ch_data_in\[25\]
+
+ch_clk_out\[3\] 1225 0 2
+s3_wbd_cyc_o
+s3_wbd_stb_o
+s3_wbd_we_o
+s3_wbd_adr_o\[10\]
+s3_wbd_adr_o\[9\]
+s3_wbd_adr_o\[8\]
+s3_wbd_adr_o\[7\]
+s3_wbd_adr_o\[6\]
+s3_wbd_adr_o\[5\]
+s3_wbd_adr_o\[4\]
+s3_wbd_adr_o\[3\]
+s3_wbd_adr_o\[2\]
+s3_wbd_adr_o\[1\]
+s3_wbd_adr_o\[0\]
+s3_wbd_dat_o\[31\]
+s3_wbd_dat_o\[30\]
+s3_wbd_dat_o\[29\]
+s3_wbd_dat_o\[28\]
+s3_wbd_dat_o\[27\]
+s3_wbd_dat_o\[26\]
+s3_wbd_dat_o\[25\]
+s3_wbd_dat_o\[24\]
+s3_wbd_dat_o\[23\]
+s3_wbd_dat_o\[22\]
+s3_wbd_dat_o\[21\]
+s3_wbd_dat_o\[20\]
+s3_wbd_dat_o\[19\]
+s3_wbd_dat_o\[18\]
+s3_wbd_dat_o\[17\]
+s3_wbd_dat_o\[16\]
+s3_wbd_dat_o\[15\]
+s3_wbd_dat_o\[14\]
+s3_wbd_dat_o\[13\]
+s3_wbd_dat_o\[12\]
+s3_wbd_dat_o\[11\]
+s3_wbd_dat_o\[10\]
+s3_wbd_dat_o\[9\]
+s3_wbd_dat_o\[8\]
+s3_wbd_dat_o\[7\]
+s3_wbd_dat_o\[6\]
+s3_wbd_dat_o\[5\]
+s3_wbd_dat_o\[4\]
+s3_wbd_dat_o\[3\]
+s3_wbd_dat_o\[2\]
+s3_wbd_dat_o\[1\]
+s3_wbd_dat_o\[0\]
+s3_wbd_sel_o\[3\]
+s3_wbd_sel_o\[2\]
+s3_wbd_sel_o\[1\]
+s3_wbd_sel_o\[0\]
+s3_wbd_dat_i\[31\]
+s3_wbd_dat_i\[30\]
+s3_wbd_dat_i\[29\]
+s3_wbd_dat_i\[28\]
+s3_wbd_dat_i\[27\]
+s3_wbd_dat_i\[26\]
+s3_wbd_dat_i\[25\]
+s3_wbd_dat_i\[24\]
+s3_wbd_dat_i\[23\]
+s3_wbd_dat_i\[22\]
+s3_wbd_dat_i\[21\]
+s3_wbd_dat_i\[20\]
+s3_wbd_dat_i\[19\]
+s3_wbd_dat_i\[18\]
+s3_wbd_dat_i\[17\]
+s3_wbd_dat_i\[16\]
+s3_wbd_dat_i\[15\]
+s3_wbd_dat_i\[14\]
+s3_wbd_dat_i\[13\]
+s3_wbd_dat_i\[12\]
+s3_wbd_dat_i\[11\]
+s3_wbd_dat_i\[10\]
+s3_wbd_dat_i\[9\]
+s3_wbd_dat_i\[8\]
+s3_wbd_dat_i\[7\]
+s3_wbd_dat_i\[6\]
+s3_wbd_dat_i\[5\]
+s3_wbd_dat_i\[4\]
+s3_wbd_dat_i\[3\]
+s3_wbd_dat_i\[2\]
+s3_wbd_dat_i\[1\]
+s3_wbd_dat_i\[0\]
+s3_wbd_ack_i
+
+ch_data_out\[26\] 1350 0 2
+ch_data_out\[27\]
+ch_data_out\[28\]
+ch_data_out\[29\]
+ch_data_out\[30\]
+ch_data_in\[31\]
+ch_data_in\[32\]
+ch_data_in\[33\]
+ch_data_in\[34\]
+ch_data_in\[35\]
+ch_data_in\[36\]
+ch_data_in\[37\]
+ch_data_in\[38\]
+
+ch_clk_out\[4\] 1825 0 2
+s4_wbd_cyc_o
+s4_wbd_stb_o
+s4_wbd_we_o
+s4_wbd_adr_o\[10\]
+s4_wbd_adr_o\[9\]
+s4_wbd_adr_o\[8\]
+s4_wbd_adr_o\[7\]
+s4_wbd_adr_o\[6\]
+s4_wbd_adr_o\[5\]
+s4_wbd_adr_o\[4\]
+s4_wbd_adr_o\[3\]
+s4_wbd_adr_o\[2\]
+s4_wbd_adr_o\[1\]
+s4_wbd_adr_o\[0\]
+s4_wbd_dat_o\[31\]
+s4_wbd_dat_o\[30\]
+s4_wbd_dat_o\[29\]
+s4_wbd_dat_o\[28\]
+s4_wbd_dat_o\[27\]
+s4_wbd_dat_o\[26\]
+s4_wbd_dat_o\[25\]
+s4_wbd_dat_o\[24\]
+s4_wbd_dat_o\[23\]
+s4_wbd_dat_o\[22\]
+s4_wbd_dat_o\[21\]
+s4_wbd_dat_o\[20\]
+s4_wbd_dat_o\[19\]
+s4_wbd_dat_o\[18\]
+s4_wbd_dat_o\[17\]
+s4_wbd_dat_o\[16\]
+s4_wbd_dat_o\[15\]
+s4_wbd_dat_o\[14\]
+s4_wbd_dat_o\[13\]
+s4_wbd_dat_o\[12\]
+s4_wbd_dat_o\[11\]
+s4_wbd_dat_o\[10\]
+s4_wbd_dat_o\[9\]
+s4_wbd_dat_o\[8\]
+s4_wbd_dat_o\[7\]
+s4_wbd_dat_o\[6\]
+s4_wbd_dat_o\[5\]
+s4_wbd_dat_o\[4\]
+s4_wbd_dat_o\[3\]
+s4_wbd_dat_o\[2\]
+s4_wbd_dat_o\[1\]
+s4_wbd_dat_o\[0\]
+s4_wbd_sel_o\[3\]
+s4_wbd_sel_o\[2\]
+s4_wbd_sel_o\[1\]
+s4_wbd_sel_o\[0\]
+s4_wbd_dat_i\[31\]
+s4_wbd_dat_i\[30\]
+s4_wbd_dat_i\[29\]
+s4_wbd_dat_i\[28\]
+s4_wbd_dat_i\[27\]
+s4_wbd_dat_i\[26\]
+s4_wbd_dat_i\[25\]
+s4_wbd_dat_i\[24\]
+s4_wbd_dat_i\[23\]
+s4_wbd_dat_i\[22\]
+s4_wbd_dat_i\[21\]
+s4_wbd_dat_i\[20\]
+s4_wbd_dat_i\[19\]
+s4_wbd_dat_i\[18\]
+s4_wbd_dat_i\[17\]
+s4_wbd_dat_i\[16\]
+s4_wbd_dat_i\[15\]
+s4_wbd_dat_i\[14\]
+s4_wbd_dat_i\[13\]
+s4_wbd_dat_i\[12\]
+s4_wbd_dat_i\[11\]
+s4_wbd_dat_i\[10\]
+s4_wbd_dat_i\[9\]
+s4_wbd_dat_i\[8\]
+s4_wbd_dat_i\[7\]
+s4_wbd_dat_i\[6\]
+s4_wbd_dat_i\[5\]
+s4_wbd_dat_i\[4\]
+s4_wbd_dat_i\[3\]
+s4_wbd_dat_i\[2\]
+s4_wbd_dat_i\[1\]
+s4_wbd_dat_i\[0\]
+s4_wbd_ack_i
+
+ch_data_out\[39\] 1950 0 2
+ch_data_out\[40\]
+ch_data_out\[41\]
+ch_data_out\[42\]
+ch_data_out\[43\]
+ch_data_in\[44\]
+ch_data_in\[45\]
+ch_data_in\[46\]
+ch_data_in\[47\]
+ch_data_in\[48\]
+ch_data_in\[49\]
+ch_data_in\[50\]
+ch_data_in\[51\]
+
+scan_mode_o 2200 0 2
+scan_en_o
+scan_so\[7\]
+scan_so\[6\]
+scan_so\[5\]
+scan_so\[4\]
+scan_so\[3\]
+scan_so\[2\]
+scan_so\[1\]
+scan_so\[0\]
diff --git a/openlane/wb_interconnect/sta.tcl b/openlane/wb_interconnect/sta.tcl
new file mode 100644
index 0000000..cb809a5
--- /dev/null
+++ b/openlane/wb_interconnect/sta.tcl
@@ -0,0 +1,57 @@
+# SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# SPDX-License-Identifier: Apache-2.0
+# SPDX-FileContributor: Modified by Dinesh Annayya <dinesha@opencores.org>
+
+
+set ::env(LIB_FASTEST) "$::env(PDK_ROOT)/sky130A/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__ff_n40C_1v95.lib"
+set ::env(LIB_SLOWEST) "$::env(PDK_ROOT)/sky130A/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__ss_100C_1v60.lib"
+set ::env(CURRENT_NETLIST) runs/wb_interconnect/results/synthesis/wb_interconnect.synthesis_preroute.v
+set ::env(DESIGN_NAME) "wb_interconnect"
+set ::env(CURRENT_SPEF) ../../spef/wb_interconnect.spef
+set ::env(BASE_SDC_FILE) "base.sdc"
+set ::env(SYNTH_DRIVING_CELL) "sky130_fd_sc_hd__inv_8"
+set ::env(SYNTH_DRIVING_CELL_PIN) "Y"
+set ::env(SYNTH_CAP_LOAD) "17.65"
+set ::env(WIRE_RC_LAYER) "met1"
+
+
+set_cmd_units -time ns -capacitance pF -current mA -voltage V -resistance kOhm -distance um
+read_liberty -min $::env(LIB_FASTEST)
+read_liberty -max $::env(LIB_SLOWEST)
+read_verilog $::env(CURRENT_NETLIST)
+link_design $::env(DESIGN_NAME)
+
+read_spef $::env(CURRENT_SPEF)
+
+read_sdc -echo $::env(BASE_SDC_FILE)
+
+# check for missing constraints
+check_setup -verbose > unconstraints.rpt
+
+set_operating_conditions -analysis_type single
+# Propgate the clock
+set_propagated_clock [all_clocks]
+
+report_tns
+report_wns
+report_power
+report_checks -unique -slack_max -0.0 -group_count 100
+report_checks -unique -slack_min -0.0 -group_count 100
+report_checks -path_delay min_max
+report_checks -group_count 100 -slack_max -0.01 > timing.rpt
+
+report_checks -group_count 100 -slack_min -0.01 >> timing.rpt
+
+
diff --git a/verilog/gl/user_project_wrapper.v.gz b/verilog/gl/user_project_wrapper.v.gz
new file mode 100644
index 0000000..55d332d
--- /dev/null
+++ b/verilog/gl/user_project_wrapper.v.gz
Binary files differ
diff --git a/verilog/rtl/clk_skew_adjust/src/clk_skew_adjust.gv b/verilog/rtl/clk_skew_adjust/src/clk_skew_adjust.gv
new file mode 100644
index 0000000..7fd1a62
--- /dev/null
+++ b/verilog/rtl/clk_skew_adjust/src/clk_skew_adjust.gv
@@ -0,0 +1,205 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// clock skew adjust ////
+//// ////
+//// This file is part of the YIFive cores project ////
+//// https://github.com/dineshannayya/yifive_r0.git ////
+//// http://www.opencores.org/cores/yifive/ ////
+//// ////
+//// Description ////
+//// This block is useful for global clock skew adjustment ////
+//// logic implementation: ////
+//// clk_out = (sel=0) ? clk_in : ////
+//// (sel=1) ? clk_d1 : ////
+//// (sel=1) ? clk_d2 : ////
+//// ..... ////
+//// (sel=15)? clk_d15 :clk_in ////
+//// ////
+//// Note: each d* indicate clk buf delay ////
+//// ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.0 - 29th Feb 2021, Dinesh A ////
+//// Initial version ////
+///
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+// Clock-in is east pad direction
+// clock out give in other three direction for better placement
+/////////////////////////////////////////////////////////////////////
+module clk_skew_adjust(
+`ifdef USE_POWER_PINS
+ vccd1,// User area 1 1.8V supply
+ vssd1,// User area 1 digital ground
+`endif
+clk_in, sel, clk_out);
+
+
+`ifdef USE_POWER_PINS
+ input vccd1;// User area 1 1.8V supply
+ input vssd1;// User area 1 digital ground
+`endif
+ input clk_in;
+ output clk_out;
+ input [3:0] sel;
+ wire in0;
+ wire in1;
+ wire in2;
+ wire in3;
+ wire in4;
+ wire in5;
+ wire in6;
+ wire in7;
+ wire in8;
+ wire in9;
+ wire in10;
+ wire in11;
+ wire in12;
+ wire in13;
+ wire in14;
+ wire in15;
+
+ wire clk_d1;
+ wire clk_d2;
+ wire clk_d3;
+ wire clk_d4;
+ wire clk_d5;
+ wire clk_d6;
+ wire clk_d7;
+ wire clk_d8;
+ wire clk_d9;
+ wire clk_d10;
+ wire clk_d11;
+ wire clk_d12;
+ wire clk_d13;
+ wire clk_d14;
+ wire clk_d15;
+
+ wire d00;
+ wire d01;
+ wire d02;
+ wire d03;
+ wire d04;
+ wire d05;
+ wire d06;
+ wire d07;
+ wire d10;
+ wire d11;
+ wire d12;
+ wire d13;
+ wire d20;
+ wire d21;
+ wire d30;
+
+
+ sky130_fd_sc_hd__clkdlybuf4s15_2 clkbuf_1 (.A(clk_in), .X(clk_d1));
+ sky130_fd_sc_hd__clkdlybuf4s15_2 clkbuf_2 (.A(clk_d1), .X(clk_d2));
+ sky130_fd_sc_hd__clkdlybuf4s15_2 clkbuf_3 (.A(clk_d2), .X(clk_d3));
+ sky130_fd_sc_hd__clkdlybuf4s15_2 clkbuf_4 (.A(clk_d3), .X(clk_d4));
+ sky130_fd_sc_hd__clkdlybuf4s15_2 clkbuf_5 (.A(clk_d4), .X(clk_d5));
+ sky130_fd_sc_hd__clkdlybuf4s15_2 clkbuf_6 (.A(clk_d5), .X(clk_d6));
+ sky130_fd_sc_hd__clkdlybuf4s15_2 clkbuf_7 (.A(clk_d6), .X(clk_d7));
+ sky130_fd_sc_hd__clkdlybuf4s15_2 clkbuf_8 (.A(clk_d7), .X(clk_d8));
+ sky130_fd_sc_hd__clkdlybuf4s15_2 clkbuf_9 (.A(clk_d8), .X(clk_d9));
+ sky130_fd_sc_hd__clkdlybuf4s15_2 clkbuf_10 (.A(clk_d9), .X(clk_d10));
+ sky130_fd_sc_hd__clkdlybuf4s15_2 clkbuf_11 (.A(clk_d10), .X(clk_d11));
+ sky130_fd_sc_hd__clkdlybuf4s15_2 clkbuf_12 (.A(clk_d11), .X(clk_d12));
+ sky130_fd_sc_hd__clkdlybuf4s15_2 clkbuf_13 (.A(clk_d12), .X(clk_d13));
+ sky130_fd_sc_hd__clkdlybuf4s15_2 clkbuf_14 (.A(clk_d13), .X(clk_d14));
+ sky130_fd_sc_hd__clkdlybuf4s15_2 clkbuf_15 (.A(clk_d14), .X(clk_d15));
+
+
+ // Tap point selection
+ assign in0 = clk_in;
+ assign in1 = clk_d1;
+ assign in2 = clk_d2;
+ assign in3 = clk_d3;
+ assign in4 = clk_d4;
+ assign in5 = clk_d5;
+ assign in6 = clk_d6;
+ assign in7 = clk_d7;
+ assign in8 = clk_d8;
+ assign in9 = clk_d9;
+ assign in10 = clk_d10;
+ assign in11 = clk_d11;
+ assign in12 = clk_d12;
+ assign in13 = clk_d13;
+ assign in14 = clk_d14;
+ assign in15 = clk_d15;
+
+
+ // first level mux - 8
+ sky130_fd_sc_hd__mux2_1 u_mux_level_00 ( .X (d00) , .A0 (in0), .A1(in1), .S(sel[0]));
+ sky130_fd_sc_hd__mux2_1 u_mux_level_01 ( .X (d01) , .A0 (in2), .A1(in3), .S(sel[0]));
+ sky130_fd_sc_hd__mux2_1 u_mux_level_02 ( .X (d02) , .A0 (in4), .A1(in5), .S(sel[0]));
+ sky130_fd_sc_hd__mux2_1 u_mux_level_03 ( .X (d03) , .A0 (in6), .A1(in7), .S(sel[0]));
+ sky130_fd_sc_hd__mux2_1 u_mux_level_04 ( .X (d04) , .A0 (in8), .A1(in9), .S(sel[0]));
+ sky130_fd_sc_hd__mux2_1 u_mux_level_05 ( .X (d05) , .A0 (in10), .A1(in11), .S(sel[0]));
+ sky130_fd_sc_hd__mux2_1 u_mux_level_06 ( .X (d06) , .A0 (in12), .A1(in13), .S(sel[0]));
+ sky130_fd_sc_hd__mux2_1 u_mux_level_07 ( .X (d07) , .A0 (in14), .A1(in15), .S(sel[0]));
+
+ // second level mux - 4
+ sky130_fd_sc_hd__mux2_1 u_mux_level_10 ( .X (d10) , .A0 (d00), .A1(d01), .S(sel[1]));
+ sky130_fd_sc_hd__mux2_1 u_mux_level_11 ( .X (d11) , .A0 (d02), .A1(d03), .S(sel[1]));
+ sky130_fd_sc_hd__mux2_1 u_mux_level_12 ( .X (d12) , .A0 (d04), .A1(d05), .S(sel[1]));
+ sky130_fd_sc_hd__mux2_1 u_mux_level_13 ( .X (d13) , .A0 (d06), .A1(d07), .S(sel[1]));
+
+ // third level mux - 2
+ sky130_fd_sc_hd__mux2_1 u_mux_level_20 ( .X (d20) , .A0 (d10), .A1(d11), .S(sel[2]));
+ sky130_fd_sc_hd__mux2_1 u_mux_level_21 ( .X (d21) , .A0 (d12), .A1(d13), .S(sel[2]));
+
+ // fourth level mux - 1
+ sky130_fd_sc_hd__mux2_4 u_mux_level_30 ( .X (d30) , .A0 (d20), .A1(d21), .S(sel[3]));
+
+
+ assign clk_out = d30;
+
+endmodule
diff --git a/verilog/rtl/clk_skew_adjust/src/clk_skew_adjust.v b/verilog/rtl/clk_skew_adjust/src/clk_skew_adjust.v
new file mode 100644
index 0000000..a961a50
--- /dev/null
+++ b/verilog/rtl/clk_skew_adjust/src/clk_skew_adjust.v
@@ -0,0 +1,2898 @@
+module clk_skew_adjust (clk_in,
+ clk_out,
+ vccd1,
+ vssd1,
+ sel);
+ input clk_in;
+ output clk_out;
+ input vccd1;
+ input vssd1;
+ input [3:0] sel;
+
+ sky130_fd_sc_hd__clkdlybuf4s15_2 clkbuf_1 (.A(clk_in),
+ .X(clk_d1),
+ .VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__clkdlybuf4s15_2 clkbuf_10 (.A(clk_d9),
+ .X(clk_d10),
+ .VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__clkdlybuf4s15_2 clkbuf_11 (.A(clk_d10),
+ .X(clk_d11),
+ .VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__clkdlybuf4s15_2 clkbuf_12 (.A(clk_d11),
+ .X(clk_d12),
+ .VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__clkdlybuf4s15_2 clkbuf_13 (.A(clk_d12),
+ .X(clk_d13),
+ .VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__clkdlybuf4s15_2 clkbuf_14 (.A(clk_d13),
+ .X(clk_d14),
+ .VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__clkdlybuf4s15_2 clkbuf_15 (.A(clk_d14),
+ .X(clk_d15),
+ .VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__clkdlybuf4s15_2 clkbuf_2 (.A(clk_d1),
+ .X(clk_d2),
+ .VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__clkdlybuf4s15_2 clkbuf_3 (.A(clk_d2),
+ .X(clk_d3),
+ .VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__clkdlybuf4s15_2 clkbuf_4 (.A(clk_d3),
+ .X(clk_d4),
+ .VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__clkdlybuf4s15_2 clkbuf_5 (.A(clk_d4),
+ .X(clk_d5),
+ .VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__clkdlybuf4s15_2 clkbuf_6 (.A(clk_d5),
+ .X(clk_d6),
+ .VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__clkdlybuf4s15_2 clkbuf_7 (.A(clk_d6),
+ .X(clk_d7),
+ .VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__clkdlybuf4s15_2 clkbuf_8 (.A(clk_d7),
+ .X(clk_d8),
+ .VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__clkdlybuf4s15_2 clkbuf_9 (.A(clk_d8),
+ .X(clk_d9),
+ .VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__mux2_1 u_mux_level_00 (.A0(clk_in),
+ .A1(clk_d1),
+ .S(sel[0]),
+ .X(d00),
+ .VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__mux2_1 u_mux_level_01 (.A0(clk_d2),
+ .A1(clk_d3),
+ .S(sel[0]),
+ .X(d01),
+ .VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__mux2_1 u_mux_level_02 (.A0(clk_d4),
+ .A1(clk_d5),
+ .S(sel[0]),
+ .X(d02),
+ .VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__mux2_1 u_mux_level_03 (.A0(clk_d6),
+ .A1(clk_d7),
+ .S(sel[0]),
+ .X(d03),
+ .VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__mux2_1 u_mux_level_04 (.A0(clk_d8),
+ .A1(clk_d9),
+ .S(sel[0]),
+ .X(d04),
+ .VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__mux2_1 u_mux_level_05 (.A0(clk_d10),
+ .A1(clk_d11),
+ .S(sel[0]),
+ .X(d05),
+ .VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__mux2_1 u_mux_level_06 (.A0(clk_d12),
+ .A1(clk_d13),
+ .S(sel[0]),
+ .X(d06),
+ .VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__mux2_1 u_mux_level_07 (.A0(clk_d14),
+ .A1(clk_d15),
+ .S(sel[0]),
+ .X(d07),
+ .VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__mux2_1 u_mux_level_10 (.A0(d00),
+ .A1(d01),
+ .S(sel[1]),
+ .X(d10),
+ .VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__mux2_1 u_mux_level_11 (.A0(d02),
+ .A1(d03),
+ .S(sel[1]),
+ .X(d11),
+ .VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__mux2_1 u_mux_level_12 (.A0(d04),
+ .A1(d05),
+ .S(sel[1]),
+ .X(d12),
+ .VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__mux2_1 u_mux_level_13 (.A0(d06),
+ .A1(d07),
+ .S(sel[1]),
+ .X(d13),
+ .VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__mux2_1 u_mux_level_20 (.A0(d10),
+ .A1(d11),
+ .S(sel[2]),
+ .X(d20),
+ .VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__mux2_1 u_mux_level_21 (.A0(d12),
+ .A1(d13),
+ .S(sel[2]),
+ .X(d21),
+ .VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__mux2_4 u_mux_level_30 (.A0(d20),
+ .A1(d21),
+ .S(sel[3]),
+ .X(clk_out),
+ .VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_0 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_1 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_2 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_3 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_4 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_5 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_6 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_7 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_8 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_9 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_10 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_11 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_12 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_13 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_14 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_15 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_16 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_17 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_18 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_19 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_20 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_21 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_22 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_23 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_24 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_25 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_26 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_27 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_28 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_29 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_30 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_31 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_32 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_33 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_34 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_35 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_36 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_37 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_38 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_39 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_40 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_41 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_42 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_43 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_44 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_45 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_46 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_47 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_48 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_49 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_50 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_51 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_52 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_53 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_54 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_55 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_56 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_57 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_58 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_59 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_60 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_61 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_62 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 PHY_63 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_64 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_65 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_66 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_67 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_68 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_69 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_70 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_71 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_72 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_73 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_74 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_75 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_76 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_77 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_78 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_79 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_80 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_81 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_82 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_83 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_84 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_85 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_86 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_87 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_88 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_89 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_90 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_91 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_92 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_93 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_94 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_95 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_96 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_97 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_98 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_99 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_100 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_101 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_102 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_103 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_104 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_105 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_106 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_107 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_108 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_109 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_110 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_111 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_112 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_113 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_114 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_115 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_116 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_117 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_118 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_119 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_120 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_121 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_122 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_123 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_124 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_125 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_126 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_127 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_128 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_129 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_130 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_131 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_132 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_133 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_134 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_135 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_136 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_137 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_138 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_139 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_140 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_141 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_142 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_143 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_144 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_145 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_146 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_147 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_148 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_149 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_150 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_151 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_152 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_153 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_154 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_155 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_156 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_157 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_158 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_159 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_160 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_161 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_162 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_163 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_164 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__tapvpwrvgnd_1 PHY_165 (.VGND(vssd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_0_3 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_0_15 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_4 FILLER_0_27 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_0_32 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_0_44 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_6 FILLER_0_56 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_0_63 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_0_75 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_6 FILLER_0_87 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_0_94 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_0_106 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_6 FILLER_0_118 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_0_125 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_0_137 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_6 FILLER_0_149 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_0_156 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_0_168 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_6 FILLER_0_180 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 FILLER_0_187 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_1_3 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_1_15 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_4 FILLER_1_27 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_1_32 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_1_44 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_1_56 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_1_68 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_1_80 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_1_93 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_1_105 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_1_117 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_1_129 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_1_141 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_1_154 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_1_166 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_1_178 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_2_3 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_2_15 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_2_27 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_2_39 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_8 FILLER_2_51 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__fill_2 FILLER_2_59 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_2_62 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_2_74 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_2_86 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_2_98 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_2_110 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_2_123 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_2_135 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_2_147 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_2_159 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_2_171 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_6 FILLER_2_184 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_3_3 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_3_15 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_4 FILLER_3_27 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_3_32 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_3_44 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_3_56 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_3_68 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_3_80 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_3_93 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_3_105 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_3_117 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_3_129 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_3_141 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_3_154 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_3_166 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_3_178 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_4_3 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_8 FILLER_4_15 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 FILLER_4_23 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_4_35 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_4_47 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__fill_2 FILLER_4_59 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_4_62 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_4_74 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_4_86 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_4_98 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_4_110 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_4_123 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_4_135 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_4_147 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_4_159 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_4_171 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_6 FILLER_4_184 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_5_3 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_5_15 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_4 FILLER_5_27 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_5_32 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_5_44 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_5_56 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_5_68 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_5_80 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_5_93 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_5_114 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_8 FILLER_5_126 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 FILLER_5_134 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_6 FILLER_5_146 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__fill_1 FILLER_5_152 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_5_154 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_5_166 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_5_178 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_6_3 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_6_15 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_6_27 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_6_39 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_8 FILLER_6_51 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__fill_2 FILLER_6_59 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_6_62 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_6_74 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_6_86 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_6_98 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_6_110 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_6_123 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_6_135 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_6_147 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_6_159 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_6_171 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_6 FILLER_6_184 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_7_3 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_7_15 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_4 FILLER_7_27 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_7_32 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_7_44 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_7_56 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_7_68 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_7_80 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_7_102 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_7_114 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_7_126 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_7_138 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 FILLER_7_150 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_7_154 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_7_166 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_7_178 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_8_3 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_8_15 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_8_27 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_8_39 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_8 FILLER_8_51 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__fill_2 FILLER_8_59 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_8_62 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_8_74 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_8_86 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_8_98 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_8_110 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_8_123 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_8_135 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_8_147 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_8_159 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_8_171 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_6 FILLER_8_184 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_9_3 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_9_15 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_4 FILLER_9_27 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_9_32 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_9_44 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_8 FILLER_9_56 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 FILLER_9_64 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_9_76 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_4 FILLER_9_88 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_9_93 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_9_105 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_9_117 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_9_129 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_9_141 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_9_154 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_8 FILLER_9_166 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_6 FILLER_9_183 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__fill_1 FILLER_9_189 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_10_3 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_10_15 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_10_27 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_10_39 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_8 FILLER_10_51 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__fill_2 FILLER_10_59 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_10_62 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_10_74 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_10_86 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_10_98 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_10_110 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_10_123 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_10_135 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_10_147 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_10_159 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_10_171 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_6 FILLER_10_184 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_11_3 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 FILLER_11_15 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_4 FILLER_11_27 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_11_32 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_11_44 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_11_56 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_11_68 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_11_80 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_11_93 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_11_105 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_11_117 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_11_129 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_11_141 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_11_154 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_8 FILLER_11_166 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 FILLER_11_174 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_4 FILLER_11_186 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_12_3 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_12_15 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_12_27 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_12_39 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_8 FILLER_12_51 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__fill_2 FILLER_12_59 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_12_62 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_12_74 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_12_86 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_8 FILLER_12_98 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 FILLER_12_106 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_4 FILLER_12_118 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_12_123 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_12_135 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_12_147 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_12_159 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_12_171 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_6 FILLER_12_184 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_13_3 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_13_15 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_4 FILLER_13_27 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_13_32 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_13_44 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_13_56 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_13_68 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_13_80 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_13_93 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_13_105 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_13_117 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_13_129 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_13_141 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_13_154 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_13_166 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_13_178 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_14_3 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_14_15 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_14_27 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_14_39 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_8 FILLER_14_51 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__fill_2 FILLER_14_59 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_14_62 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_14_74 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_14_86 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_14_98 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_14_110 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_14_123 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__fill_2 FILLER_14_135 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_14_146 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_6 FILLER_14_158 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__fill_1 FILLER_14_164 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_8 FILLER_14_174 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__fill_1 FILLER_14_182 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_6 FILLER_14_184 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_15_3 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_15_15 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_4 FILLER_15_27 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_15_32 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_15_44 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_15_56 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_15_68 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_15_80 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_15_93 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_15_105 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_15_117 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_15_129 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_15_141 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_15_154 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_15_166 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_15_178 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_16_3 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_16_15 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_16_27 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_16_39 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_8 FILLER_16_51 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__fill_2 FILLER_16_59 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_16_62 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_16_74 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_16_86 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_16_98 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_16_110 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_16_123 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_16_135 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_16_147 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_16_159 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_16_171 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_6 FILLER_16_184 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_17_3 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_17_15 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_4 FILLER_17_27 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_17_32 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_17_44 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_4 FILLER_17_56 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__fill_1 FILLER_17_60 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_17_73 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_6 FILLER_17_85 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__fill_1 FILLER_17_91 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_17_93 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_17_105 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_17_117 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_17_129 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_17_141 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_17_154 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_8 FILLER_17_166 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 FILLER_17_174 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_4 FILLER_17_186 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_18_3 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_18_15 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_4 FILLER_18_27 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_18_40 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_8 FILLER_18_52 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__fill_1 FILLER_18_60 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_18_62 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_18_74 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_18_86 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_18_98 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_18_110 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_18_123 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_18_135 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_18_147 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_18_159 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_18_171 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_6 FILLER_18_184 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_19_3 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_19_15 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_4 FILLER_19_27 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_19_32 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_19_44 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_19_56 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_19_68 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_19_80 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_19_93 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_19_105 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_19_117 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_19_129 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_19_141 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_19_154 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_19_166 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_19_178 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_20_3 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_20_15 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_20_27 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_20_39 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_8 FILLER_20_51 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__fill_2 FILLER_20_59 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_20_62 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_20_74 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_20_86 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_20_98 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_20_110 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_20_123 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_20_135 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_20_147 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_20_159 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_20_171 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_6 FILLER_20_184 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_21_12 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_6 FILLER_21_24 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__fill_1 FILLER_21_30 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_21_32 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_21_44 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_21_56 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_21_68 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_21_80 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_21_93 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_21_105 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_21_117 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_21_129 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_21_141 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_21_154 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_4 FILLER_21_166 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_8 FILLER_21_179 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 FILLER_21_187 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_22_3 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_22_15 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_22_27 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_22_39 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_8 FILLER_22_51 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__fill_2 FILLER_22_59 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_22_71 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_22_83 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_22_95 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_22_107 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 FILLER_22_119 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_22_132 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_22_144 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_22_156 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_22_168 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 FILLER_22_180 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_6 FILLER_22_184 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_23_3 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_23_15 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_4 FILLER_23_27 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_23_32 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_23_44 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_23_56 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_23_68 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_23_80 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_23_93 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_23_105 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_6 FILLER_23_117 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__fill_1 FILLER_23_123 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_23_133 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_8 FILLER_23_145 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_4 FILLER_23_154 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_23_167 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_8 FILLER_23_179 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 FILLER_23_187 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_24_3 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_24_15 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_24_27 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_24_39 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_8 FILLER_24_51 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__fill_2 FILLER_24_59 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_24_62 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_24_74 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_24_86 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_24_98 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_24_110 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_24_123 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_24_135 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_24_147 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_24_159 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_24_171 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_6 FILLER_24_184 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_25_12 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_6 FILLER_25_24 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__fill_1 FILLER_25_30 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_25_32 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_25_44 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 FILLER_25_56 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_25_68 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_25_80 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_25_93 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_25_105 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_25_117 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_25_129 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_25_141 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_25_154 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_8 FILLER_25_166 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 FILLER_25_174 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_4 FILLER_25_186 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_26_3 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_26_15 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_26_27 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_26_39 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_8 FILLER_26_51 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__fill_2 FILLER_26_59 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_26_62 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_26_74 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_26_86 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_26_98 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_26_110 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_26_123 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_26_135 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_26_147 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_8 FILLER_26_159 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 FILLER_26_167 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_4 FILLER_26_179 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_6 FILLER_26_184 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_27_3 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_27_15 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_4 FILLER_27_27 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_27_32 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_27_44 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_27_56 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_27_68 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_27_80 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_27_93 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_27_105 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_27_117 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_27_129 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_27_141 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_27_154 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_27_166 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_27_178 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_28_3 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_28_15 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_28_27 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_28_39 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_8 FILLER_28_51 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__fill_2 FILLER_28_59 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_28_62 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_28_74 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_28_86 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_28_98 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_28_110 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_28_123 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_28_135 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_28_147 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_28_159 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_28_171 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_6 FILLER_28_184 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_29_3 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_29_15 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_4 FILLER_29_27 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_29_32 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_29_44 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_29_56 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_8 FILLER_29_68 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 FILLER_29_76 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_4 FILLER_29_88 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_29_93 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_29_105 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_29_117 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_29_129 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_29_141 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_29_154 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_6 FILLER_29_166 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_8 FILLER_29_181 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__fill_1 FILLER_29_189 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_30_3 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_30_15 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_30_27 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_30_39 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_8 FILLER_30_51 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__fill_2 FILLER_30_59 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_30_62 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_30_74 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_30_86 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_8 FILLER_30_98 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__fill_2 FILLER_30_106 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_4 FILLER_30_117 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__fill_1 FILLER_30_121 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_30_123 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_4 FILLER_30_135 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__fill_1 FILLER_30_139 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_30_149 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_8 FILLER_30_161 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__fill_1 FILLER_30_169 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_4 FILLER_30_179 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_6 FILLER_30_184 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_31_3 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_31_15 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_4 FILLER_31_27 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_31_32 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_31_44 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_6 FILLER_31_56 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_31_63 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_31_75 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_6 FILLER_31_87 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_31_94 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_31_106 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_6 FILLER_31_118 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_31_125 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__fill_1 FILLER_31_137 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_8 FILLER_31_147 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_31_156 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_12 FILLER_31_168 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_6 FILLER_31_180 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+ sky130_fd_sc_hd__decap_3 FILLER_31_187 (.VGND(vssd1),
+ .VNB(vssd1),
+ .VPB(vccd1),
+ .VPWR(vccd1));
+endmodule
diff --git a/verilog/rtl/clk_skew_adjust/synth/Makefile b/verilog/rtl/clk_skew_adjust/synth/Makefile
new file mode 100644
index 0000000..f6ae1df
--- /dev/null
+++ b/verilog/rtl/clk_skew_adjust/synth/Makefile
@@ -0,0 +1,49 @@
+# //////////////////////////////////////////////////////////////////////////////
+# // SPDX-FileCopyrightText: 2021, Dinesh Annayya
+# //
+# // Licensed under the Apache License, Version 2.0 (the "License");
+# // you may not use this file except in compliance with the License.
+# // You may obtain a copy of the License at
+# //
+# // http://www.apache.org/licenses/LICENSE-2.0
+# //
+# // Unless required by applicable law or agreed to in writing, software
+# // distributed under the License is distributed on an "AS IS" BASIS,
+# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# // See the License for the specific language governing permissions and
+# // limitations under the License.
+# // SPDX-License-Identifier: Apache-2.0
+# // SPDX-FileContributor: Dinesh Annayya <dinesha@opencores.org>
+# // //////////////////////////////////////////////////////////////////////////
+#------------------------------------------------------------------------------
+# Makefile for Synthesis
+#------------------------------------------------------------------------------
+
+# Paths
+export ROOT_DIR := $(shell pwd)
+export REPORT_DIR := $(ROOT_DIR)/reports
+export NETLIST_DIR := $(ROOT_DIR)/netlist
+export TMP_DIR := $(ROOT_DIR)/tmp
+
+
+# Targets
+.PHONY: clean create synth
+
+default: clean create synth
+
+synth: clean create
+ yosys -g -c synth.tcl -l synth.log
+
+create:
+ mkdir -p ./tmp/synthesis;
+ mkdir -p ./reports;
+ mkdir -p ./netlist;
+ $(OPENLANE_ROOT)/scripts/libtrim.pl $(PDK_ROOT)/sky130A/libs.ref/sky130_fd_sc_hd/lib/sky130_fd_sc_hd__tt_025C_1v80.lib $(PDK_ROOT)/sky130A/libs.tech/openlane/sky130_fd_sc_hd/no_synth.cells > ./tmp/trimmed.lib
+
+
+
+clean:
+ $(RM) -R synth.log
+ $(RM) -R $(REPORT_DIR)
+ $(RM) -R $(NETLIST_DIR)
+ $(RM) -R $(TMP_DIR)
diff --git a/verilog/rtl/clk_skew_adjust/synth/synth.tcl b/verilog/rtl/clk_skew_adjust/synth/synth.tcl
new file mode 100755
index 0000000..b7adea6
--- /dev/null
+++ b/verilog/rtl/clk_skew_adjust/synth/synth.tcl
@@ -0,0 +1,385 @@
+# //////////////////////////////////////////////////////////////////////////////
+# // SPDX-FileCopyrightText: 2021, Dinesh Annayya
+# //
+# // Licensed under the Apache License, Version 2.0 (the "License");
+# // you may not use this file except in compliance with the License.
+# // You may obtain a copy of the License at
+# //
+# // http://www.apache.org/licenses/LICENSE-2.0
+# //
+# // Unless required by applicable law or agreed to in writing, software
+# // distributed under the License is distributed on an "AS IS" BASIS,
+# // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# // See the License for the specific language governing permissions and
+# // limitations under the License.
+# // SPDX-License-Identifier: Apache-2.0
+# // SPDX-FileContributor: Dinesh Annayya <dinesha@opencores.org>
+# // //////////////////////////////////////////////////////////////////////////
+# inputs expected as env vars
+#set opt $::env(SYNTH_OPT)
+########### config.tcl ##################
+# User config
+
+# User config
+set ::env(DESIGN_DIR) ../
+
+set ::env(PROJ_DIR) ../../../../
+
+# User config
+set ::env(DESIGN_NAME) clk_mux
+
+# Change if needed
+set ::env(VERILOG_FILES) [glob \
+ ../src/clk_mux.v ]
+
+
+set ::env(SYNTH_DEFINES) [list YOSYS ]
+
+
+set ::env(LIB_SYNTH) ./tmp/trimmed.lib
+
+
+# Fill this
+set ::env(CLOCK_PERIOD) "10"
+#set ::env(CLOCK_PORT) "mclk"
+set ::env(CLOCK_TREE_SYNTH) 0
+
+set ::env(RUN_SIMPLE_CTS) 0
+set ::env(SYNTH_BUFFERING) 0
+set ::env(SYNTH_SIZING) 0
+
+set ::env(SYNTH_DRIVING_CELL) "sky130_fd_sc_hd__inv_8"
+set ::env(SYNTH_CAP_LOAD) "17.65"
+set ::env(SYNTH_MAX_TRAN) "[expr {0.1*10.0}]"
+
+set ::env(SYNTH_MAX_FANOUT) 6
+set ::env(FP_CORE_UTIL) 50
+set ::env(PL_TARGET_DENSITY) [ expr ($::env(FP_CORE_UTIL)+5) / 100.0 ]
+set ::env(CELL_PAD) 4
+
+set ::env(SYNTH_NO_FLAT) "0"
+
+
+set ::env(SYNTH_STRATEGY) "AREA 0"
+set ::env(SYNTH_TIELO_PORT) "sky130_fd_sc_hd__conb_1 LO"
+set ::env(SYNTH_TIEHI_PORT) "sky130_fd_sc_hd__conb_1 HI"
+set ::env(SYNTH_MIN_BUF_PORT) "sky130_fd_sc_hd__buf_2 A X"
+
+
+#set ::env(CLOCK_NET) $::env(CLOCK_PORT)
+
+
+
+set ::env(yosys_tmp_file_tag) "./tmp/"
+set ::env(TMP_DIR) "./tmp/"
+set ::env(yosys_netlist_dir) "./netlist"
+set ::env(yosys_report_file_tag) "./reports/yosys"
+set ::env(yosys_result_file_tag) "./reports/yosys.synthesis"
+
+set ::env(SAVE_NETLIST) $::env(yosys_netlist_dir)/$::env(DESIGN_NAME).gv
+
+
+
+########### End of config.tcl
+set buffering $::env(SYNTH_BUFFERING)
+set sizing $::env(SYNTH_SIZING)
+
+yosys -import
+
+set vtop $::env(DESIGN_NAME)
+#set sdc_file $::env(SDC_FILE)
+set sclib $::env(LIB_SYNTH)
+
+if { [info exists ::env(SYNTH_DEFINES) ] } {
+ foreach define $::env(SYNTH_DEFINES) {
+ log "Defining $define"
+ verilog_defines -D$define
+ }
+}
+
+set vIdirsArgs ""
+if {[info exist ::env(VERILOG_INCLUDE_DIRS)]} {
+ foreach dir $::env(VERILOG_INCLUDE_DIRS) {
+ log "Adding include file -I$dir "
+ lappend vIdirsArgs "-I$dir"
+ }
+ set vIdirsArgs [join $vIdirsArgs]
+}
+
+
+
+if { [info exists ::env(EXTRA_LIBS) ] } {
+ foreach lib $::env(EXTRA_LIBS) {
+ read_liberty {*}$vIdirsArgs -lib -ignore_miss_dir -setattr blackbox $lib
+ }
+}
+
+
+
+# ns expected (in sdc as well)
+set clock_period [expr {$::env(CLOCK_PERIOD)*1000}]
+
+set driver $::env(SYNTH_DRIVING_CELL)
+set cload $::env(SYNTH_CAP_LOAD)
+# input pin cap of IN_3VX8
+set max_FO $::env(SYNTH_MAX_FANOUT)
+if {![info exist ::env(SYNTH_MAX_TRAN)]} {
+ set ::env(SYNTH_MAX_TRAN) [expr {0.1*$clock_period}]
+} else {
+ set ::env(SYNTH_MAX_TRAN) [expr {$::env(SYNTH_MAX_TRAN) * 1000}]
+}
+set max_Tran $::env(SYNTH_MAX_TRAN)
+
+
+# Mapping parameters
+set A_factor 0.00
+set B_factor 0.88
+set F_factor 0.00
+
+# Don't change these unless you know what you are doing
+set stat_ext ".stat.rpt"
+set chk_ext ".chk.rpt"
+set gl_ext ".gl.v"
+set constr_ext ".$clock_period.constr"
+set timing_ext ".timing.txt"
+set abc_ext ".abc"
+
+
+# get old sdc, add library specific stuff for abc scripts
+set sdc_file $::env(yosys_tmp_file_tag).sdc
+set outfile [open ${sdc_file} w]
+#puts $outfile $sdc_data
+puts $outfile "set_driving_cell ${driver}"
+puts $outfile "set_load ${cload}"
+close $outfile
+
+
+# ABC Scrips
+set abc_rs_K "resub,-K,"
+set abc_rs "resub"
+set abc_rsz "resub,-z"
+set abc_rw_K "rewrite,-K,"
+set abc_rw "rewrite"
+set abc_rwz "rewrite,-z"
+set abc_rf "refactor"
+set abc_rfz "refactor,-z"
+set abc_b "balance"
+
+set abc_resyn2 "${abc_b}; ${abc_rw}; ${abc_rf}; ${abc_b}; ${abc_rw}; ${abc_rwz}; ${abc_b}; ${abc_rfz}; ${abc_rwz}; ${abc_b}"
+set abc_share "strash; multi,-m; ${abc_resyn2}"
+set abc_resyn2a "${abc_b};${abc_rw};${abc_b};${abc_rw};${abc_rwz};${abc_b};${abc_rwz};${abc_b}"
+set abc_resyn3 "balance;resub;resub,-K,6;balance;resub,-z;resub,-z,-K,6;balance;resub,-z,-K,5;balance"
+set abc_resyn2rs "${abc_b};${abc_rs_K},6;${abc_rw};${abc_rs_K},6,-N,2;${abc_rf};${abc_rs_K},8;${abc_rw};${abc_rs_K},10;${abc_rwz};${abc_rs_K},10,-N,2;${abc_b},${abc_rs_K},12;${abc_rfz};${abc_rs_K},12,-N,2;${abc_rwz};${abc_b}"
+
+set abc_choice "fraig_store; ${abc_resyn2}; fraig_store; ${abc_resyn2}; fraig_store; fraig_restore"
+set abc_choice2 "fraig_store; balance; fraig_store; ${abc_resyn2}; fraig_store; ${abc_resyn2}; fraig_store; ${abc_resyn2}; fraig_store; fraig_restore"
+
+set abc_map_old_cnt "map,-p,-a,-B,0.2,-A,0.9,-M,0"
+set abc_map_old_dly "map,-p,-B,0.2,-A,0.9,-M,0"
+set abc_retime_area "retime,-D,{D},-M,5"
+set abc_retime_dly "retime,-D,{D},-M,6"
+set abc_map_new_area "amap,-m,-Q,0.1,-F,20,-A,20,-C,5000"
+
+set abc_area_recovery_1 "${abc_choice}; map;"
+set abc_area_recovery_2 "${abc_choice2}; map;"
+
+set map_old_cnt "map,-p,-a,-B,0.2,-A,0.9,-M,0"
+set map_old_dly "map,-p,-B,0.2,-A,0.9,-M,0"
+set abc_retime_area "retime,-D,{D},-M,5"
+set abc_retime_dly "retime,-D,{D},-M,6"
+set abc_map_new_area "amap,-m,-Q,0.1,-F,20,-A,20,-C,5000"
+
+if {$buffering==1} {
+ set abc_fine_tune "buffer,-N,${max_FO},-S,${max_Tran};upsize,{D};dnsize,{D}"
+} elseif {$sizing} {
+ set abc_fine_tune "upsize,{D};dnsize,{D}"
+} else {
+ set abc_fine_tune ""
+}
+
+
+set delay_scripts [list \
+ "+read_constr,${sdc_file};fx;mfs;strash;refactor;${abc_resyn2};${abc_retime_dly}; scleanup;${abc_map_old_dly};retime,-D,{D};${abc_fine_tune};stime,-p;print_stats -m" \
+ \
+ "+read_constr,${sdc_file};fx;mfs;strash;refactor;${abc_resyn2};${abc_retime_dly}; scleanup;${abc_choice2};${abc_map_old_dly};${abc_area_recovery_2}; retime,-D,{D};${abc_fine_tune};stime,-p;print_stats -m" \
+ \
+ "+read_constr,${sdc_file};fx;mfs;strash;refactor;${abc_resyn2};${abc_retime_dly}; scleanup;${abc_choice};${abc_map_old_dly};${abc_area_recovery_1}; retime,-D,{D};${abc_fine_tune};stime,-p;print_stats -m" \
+ \
+ "+read_constr,${sdc_file};fx;mfs;strash;refactor;${abc_resyn2};${abc_retime_area};scleanup;${abc_choice2};${abc_map_new_area};${abc_choice2};${abc_map_old_dly};retime,-D,{D};${abc_fine_tune};stime,-p;print_stats -m" \
+ ]
+
+set area_scripts [list \
+ "+read_constr,${sdc_file};fx;mfs;strash;refactor;${abc_resyn2};${abc_retime_area};scleanup;${abc_choice2};${abc_map_new_area};retime,-D,{D};${abc_fine_tune};stime,-p;print_stats -m" \
+ \
+ "+read_constr,${sdc_file};fx;mfs;strash;refactor;${abc_resyn2};${abc_retime_area};scleanup;${abc_choice2};${abc_map_new_area};${abc_choice2};${abc_map_new_area};retime,-D,{D};${abc_fine_tune};stime,-p;print_stats -m" \
+ \
+ "+read_constr,${sdc_file};fx;mfs;strash;refactor;${abc_choice2};${abc_retime_area};scleanup;${abc_choice2};${abc_map_new_area};${abc_choice2};${abc_map_new_area};retime,-D,{D};${abc_fine_tune};stime,-p;print_stats -m" \
+ ]
+
+set all_scripts [list {*}$delay_scripts {*}$area_scripts]
+
+set strategy_parts [split $::env(SYNTH_STRATEGY)]
+
+proc synth_strategy_format_err { } {
+ upvar area_scripts area_scripts
+ upvar delay_scripts delay_scripts
+ log -stderr "\[ERROR] Misformatted SYNTH_STRATEGY (\"$::env(SYNTH_STRATEGY)\")."
+ log -stderr "\[ERROR] Correct format is \"DELAY|AREA 0-[expr [llength $delay_scripts]-1]|0-[expr [llength $area_scripts]-1]\"."
+ exit 1
+}
+
+if { [llength $strategy_parts] != 2 } {
+ synth_strategy_format_err
+}
+
+set strategy_type [lindex $strategy_parts 0]
+set strategy_type_idx [lindex $strategy_parts 1]
+
+if { $strategy_type != "AREA" && $strategy_type != "DELAY" } {
+ log -stderr "\[ERROR] AREA|DELAY tokens not found. ($strategy_type)"
+ synth_strategy_format_err
+}
+
+if { $strategy_type == "DELAY" && $strategy_type_idx >= [llength $delay_scripts] } {
+ log -stderr "\[ERROR] strategy index ($strategy_type_idx) is too high."
+ synth_strategy_format_err
+}
+
+if { $strategy_type == "AREA" && $strategy_type_idx >= [llength $area_scripts] } {
+ log -stderr "\[ERROR] strategy index ($strategy_type_idx) is too high."
+ synth_strategy_format_err
+}
+
+if { $strategy_type == "DELAY" } {
+ set strategy $strategy_type_idx
+} else {
+ set strategy [expr {[llength $delay_scripts]+$strategy_type_idx}]
+}
+
+
+for { set i 0 } { $i < [llength $::env(VERILOG_FILES)] } { incr i } {
+ read_verilog -sv {*}$vIdirsArgs [lindex $::env(VERILOG_FILES) $i]
+}
+
+if { [info exists ::env(VERILOG_FILES_BLACKBOX)] } {
+ foreach verilog_file $::env(VERILOG_FILES_BLACKBOX) {
+ read_verilog -sv {*}$vIdirsArgs -lib $verilog_file
+ }
+}
+select -module $vtop
+show -format dot -prefix $::env(TMP_DIR)/synthesis/hierarchy
+select -clear
+
+hierarchy -check -top $vtop
+
+# Infer tri-state buffers.
+set tbuf_map false
+if { [info exists ::env(TRISTATE_BUFFER_MAP)] } {
+ if { [file exists $::env(TRISTATE_BUFFER_MAP)] } {
+ set tbuf_map true
+ tribuf
+ } else {
+ log "WARNING: TRISTATE_BUFFER_MAP is defined but could not be found: $::env(TRISTATE_BUFFER_MAP)"
+ }
+}
+
+if { $::env(SYNTH_NO_FLAT) } {
+ synth -top $vtop
+} else {
+ synth -top $vtop -flatten
+}
+
+share -aggressive
+opt
+opt_clean -purge
+
+tee -o "$::env(yosys_report_file_tag)_pre.stat" stat
+
+# Map tri-state buffers.
+if { $tbuf_map } {
+ log {mapping tbuf}
+ techmap -map $::env(TRISTATE_BUFFER_MAP)
+ simplemap
+}
+
+# handle technology mapping of 4-MUX, and tell Yosys to infer 4-muxes
+if { [info exists ::env(SYNTH_MUX4_MAP)] && [file exists $::env(SYNTH_MUX4_MAP)] } {
+ muxcover -mux4
+ techmap -map $::env(SYNTH_MUX4_MAP)
+ simplemap
+}
+
+# handle technology mapping of 2-MUX
+if { [info exists ::env(SYNTH_MUX_MAP)] && [file exists $::env(SYNTH_MUX_MAP)] } {
+ techmap -map $::env(SYNTH_MUX_MAP)
+ simplemap
+}
+
+# handle technology mapping of latches
+if { [info exists ::env(SYNTH_LATCH_MAP)] && [file exists $::env(SYNTH_LATCH_MAP)] } {
+ techmap -map $::env(SYNTH_LATCH_MAP)
+ simplemap
+}
+
+dfflibmap -liberty $sclib
+tee -o "$::env(yosys_report_file_tag)_dff.stat" stat
+
+if { [info exists ::env(SYNTH_EXPLORE)] && $::env(SYNTH_EXPLORE) } {
+ design -save myDesign
+
+ for { set index 0 } { $index < [llength $all_scripts] } { incr index } {
+ log "\[INFO\]: ABC: WireLoad : S_$index"
+ design -load myDesign
+
+ abc -D $clock_period \
+ -constr "$sdc_file" \
+ -liberty $sclib \
+ -script [lindex $all_scripts $index]
+
+ setundef -zero
+
+ hilomap -hicell {*}$::env(SYNTH_TIEHI_PORT) -locell {*}$::env(SYNTH_TIELO_PORT)
+
+ # get rid of the assignments that make verilog2def fail
+ splitnets
+ opt_clean -purge
+ insbuf -buf {*}$::env(SYNTH_MIN_BUF_PORT)
+
+ tee -o "$::env(yosys_report_file_tag)_$index$chk_ext" check
+ write_verilog -noattr -noexpr -nohex -nodec -defparam "$::env(yosys_result_file_tag)_$index.v"
+ design -reset
+ }
+} else {
+
+ log "\[INFO\]: ABC: WireLoad : S_$strategy"
+
+ abc -D $clock_period \
+ -constr "$sdc_file" \
+ -liberty $sclib \
+ -script [lindex $all_scripts $strategy] \
+ -showtmp;
+
+ setundef -zero
+
+ hilomap -hicell {*}$::env(SYNTH_TIEHI_PORT) -locell {*}$::env(SYNTH_TIELO_PORT)
+
+ # get rid of the assignments that make verilog2def fail
+ splitnets
+ opt_clean -purge
+ insbuf -buf {*}$::env(SYNTH_MIN_BUF_PORT)
+
+ tee -o "$::env(yosys_report_file_tag)_$strategy$chk_ext" check
+ write_verilog -noattr -noexpr -nohex -nodec -defparam "$::env(SAVE_NETLIST)"
+}
+
+if { $::env(SYNTH_NO_FLAT) } {
+ design -reset
+ file copy -force $::env(SAVE_NETLIST) $::env(yosys_tmp_file_tag)_unflat.v
+ read_verilog -sv $::env(SAVE_NETLIST)
+ synth -top $vtop -flatten
+ splitnets
+ opt_clean -purge
+ insbuf -buf {*}$::env(SYNTH_MIN_BUF_PORT)
+ write_verilog -noattr -noexpr -nohex -nodec -defparam "$::env(SAVE_NETLIST)"
+ tee -o "$::env(yosys_report_file_tag)_$strategy$chk_ext" check
+}
diff --git a/verilog/rtl/digital_core.v b/verilog/rtl/digital_core.v
new file mode 100644
index 0000000..c57d82c
--- /dev/null
+++ b/verilog/rtl/digital_core.v
@@ -0,0 +1,738 @@
+
+`include "top_defines.v"
+module digital_core (
+
+ reset_n ,
+ scan_mode ,
+ scan_enable ,
+ fastsim_mode ,
+ mastermode ,
+ xtal_clk ,
+ clkout ,
+ reset_out_n ,
+
+ // Reg Bus Interface Signal
+ ext_reg_cs ,
+ ext_reg_tid ,
+ ext_reg_wr ,
+ ext_reg_addr ,
+ ext_reg_wdata ,
+ ext_reg_be ,
+
+ // Outputs
+ ext_reg_rdata ,
+ ext_reg_ack ,
+
+
+ // Line Side Interface TX Path
+ phy_tx_en ,
+ phy_txd ,
+ phy_tx_clk ,
+
+ // Line Side Interface RX Path
+ phy_rx_clk ,
+ phy_rx_dv ,
+ phy_rxd ,
+
+ //MDIO interface
+ mdio_clk ,
+ mdio_in ,
+ mdio_out ,
+ mdio_out_en ,
+
+
+ // UART Line Interface
+ si ,
+ so ,
+
+
+ spi_sck ,
+ spi_so ,
+ spi_si ,
+ spi_cs_n ,
+
+
+ // External ROM interface
+ wb_xrom_adr ,
+ wb_xrom_ack ,
+ wb_xrom_err ,
+ wb_xrom_wr ,
+ wb_xrom_rdata ,
+ wb_xrom_wdata ,
+
+ wb_xrom_stb ,
+ wb_xrom_cyc ,
+
+ // External RAM interface
+ wb_xram_adr ,
+ wb_xram_ack ,
+ wb_xram_err ,
+ wb_xram_wr ,
+ wb_xram_be ,
+ wb_xram_rdata ,
+ wb_xram_wdata ,
+
+ wb_xram_stb ,
+ wb_xram_cyc,
+
+ ea_in
+
+
+
+ );
+
+
+//----------------------------------------
+// Global Clock Defination
+//----------------------------------------
+input reset_n ; // Active Low Reset
+input scan_mode ; // scan mode
+input scan_enable ; // scan enable
+input fastsim_mode ; // Fast Sim Mode
+input mastermode ; // 1 : Risc master mode
+
+input xtal_clk ; // xtal clock 25Mhz
+output clkout ; // clock output
+output reset_out_n ; // clock output
+
+//---------------------------------
+// Reg Bus Interface Signal
+//---------------------------------
+input ext_reg_cs ;
+input ext_reg_wr ;
+input [3:0] ext_reg_tid ;
+input [14:0] ext_reg_addr ;
+input [31:0] ext_reg_wdata ;
+input [3:0] ext_reg_be ;
+
+// Outputs
+output [31:0] ext_reg_rdata ;
+output ext_reg_ack ;
+
+//----------------------------------------
+// MAC Line Side Interface TX Path
+//----------------------------------------
+output phy_tx_en ; // MAC Tx Enable
+output [7:0] phy_txd ; // MAC Tx Data
+input phy_tx_clk ; // MAC Tx Clock
+
+//----------------------------------------
+// MAC Line Side Interface RX Path
+//----------------------------------------
+input phy_rx_clk ; // MAC Rx Clock
+input phy_rx_dv ; // MAC Rx Dv
+input [7:0] phy_rxd ; // MAC Rxd
+
+//----------------------------------------
+// MDIO interface
+//----------------------------------------
+output mdio_clk ; // MDIO Clock
+input mdio_in ; // MDIO Data
+output mdio_out ; // MDIO Data
+output mdio_out_en ; // MDIO Data
+
+
+//----------------------------------------
+// UART Line Interface
+//----------------------------------------
+input si ; // serial in
+output so ; // serial out
+
+//----------------------------------------
+// SPI Line Interface
+//----------------------------------------
+
+output spi_sck ; // clock
+output spi_so ; // data out
+input spi_si ; // data in
+output [3:0] spi_cs_n ; // chip select
+
+//----------------------------------------
+// 8051 core ROM related signals
+//---------------------------------------
+output [15:0] wb_xrom_adr ; // instruction address
+input wb_xrom_ack ; // instruction acknowlage
+output wb_xrom_err ; // instruction error
+output wb_xrom_wr ; // instruction error
+input [31:0] wb_xrom_rdata ; // rom data input
+output [31:0] wb_xrom_wdata ; // rom data input
+
+output wb_xrom_stb ; // instruction strobe
+output wb_xrom_cyc ; // instruction cycle
+
+
+//----------------------------------------
+// 8051 core RAM related signals
+//---------------------------------------
+output [15:0] wb_xram_adr ; // data-ram address
+input wb_xram_ack ; // data-ram acknowlage
+output wb_xram_err ; // data-ram error
+output wb_xram_wr ; // data-ram error
+output [3:0] wb_xram_be ; // Byte enable
+input [31:0] wb_xram_rdata ; // ram data input
+output [31:0] wb_xram_wdata ; // ram data input
+
+output wb_xram_stb ; // data-ram strobe
+output wb_xram_cyc ; // data-ram cycle
+
+
+input ea_in ; // input for external access (ea signal)
+ // ea=0 program is in external rom
+ // ea=1 program is in internal rom
+//---------------------------------------------
+// 8051 Instruction ROM interface
+//---------------------------------------------
+wire [15:0] wbi_risc_adr;
+wire [31:0] wbi_risc_rdata;
+
+
+//-----------------------------
+// MAC Related wire Decleration
+//-----------------------------
+wire [8:0] app_rxfifo_rddata_o ;
+wire [31:0] app_rx_desc_data ;
+wire mdio_out_en ;
+wire mdio_out ;
+wire gen_resetn ;
+
+
+//---------------------------------------------
+// 8051 Instruction RAM interface
+//---------------------------------------------
+wire [15:0] wbd_risc_adr ;
+wire [7:0] wbd_risc_rdata ;
+wire [7:0] wbd_risc_wdata ;
+
+wire [14:0] reg_mac_addr ;
+wire [31:0] reg_mac_wdata ;
+wire [3:0] reg_mac_be ;
+wire [31:0] reg_mac_rdata ;
+wire reg_mac_ack ;
+
+wire [14:0] reg_uart_addr ;
+wire [31:0] reg_uart_wdata ;
+wire [3:0] reg_uart_be ;
+wire [31:0] reg_uart_rdata ;
+wire reg_uart_ack ;
+
+wire [14:0] reg_spi_addr ;
+wire [31:0] reg_spi_wdata ;
+wire [3:0] reg_spi_be ;
+wire [31:0] reg_spi_rdata ;
+wire reg_spi_ack ;
+
+wire [3:0] wb_xrom_be ;
+wire [3:0] wb_xram_be ;
+
+wire [7:0] p0 ;
+wire [7:0] p1 ;
+wire [7:0] p2 ;
+wire [7:0] p3 ;
+
+wire [3:0] wbgt_taddr ;
+wire [31:0] wbgt_din ;
+wire [31:0] wbgt_dout ;
+wire [12:0] wbgt_addr ;
+wire [3:0] wbgt_be ;
+wire wbgt_we ;
+wire wbgt_ack ;
+wire wbgt_stb ;
+wire wbgt_cyc ;
+
+wire [3:0] wbgr_taddr ;
+wire [31:0] wbgr_din ;
+wire [31:0] wbgr_dout ;
+wire [12:0] wbgr_addr ;
+wire [3:0] wbgr_be ;
+wire wbgr_we ;
+wire wbgr_ack ;
+wire wbgr_stb ;
+wire wbgr_cyc ;
+
+wire [8:0] app_txfifo_wrdata_i;
+wire [15:0] app_txfifo_addr;
+wire [15:0] app_rxfifo_addr;
+wire [3:0] tx_qcnt ;
+wire [3:0] rx_qcnt ;
+
+wire tx_q_empty = (tx_qcnt == 0);
+wire rx_q_empty = (rx_qcnt == 0);
+
+wire [31:0] reg_rdata = (reg_mac_ack) ? reg_mac_rdata :
+ (reg_uart_ack) ? reg_uart_rdata :
+ (reg_spi_ack) ? reg_spi_rdata : 'h0;
+
+wire reg_ack = reg_mac_ack | reg_uart_ack | reg_spi_ack;
+
+
+assign reset_out_n = gen_resetn;
+
+
+assign wb_xram_adr[15] = 0;
+assign wb_xram_adr[1:0] = 2'b00;
+assign wb_xrom_adr[15:13] = 0;
+
+wire [9:0] cfg_tx_buf_qbase_addr;
+wire [9:0] cfg_rx_buf_qbase_addr;
+
+// QCounter Inc/dec generation
+
+wire tx_qcnt_inc = (cfg_tx_buf_qbase_addr == wb_xram_adr[15:6]) & wb_xram_stb & wb_xram_wr & wb_xram_ack && (wb_xram_be[3] == 1'b1);
+wire tx_qcnt_dec = (cfg_tx_buf_qbase_addr == wb_xram_adr[15:6]) & wb_xram_stb & !wb_xram_wr & wb_xram_ack && (wb_xram_be[3] == 1'b1);
+wire rx_qcnt_inc = (cfg_rx_buf_qbase_addr == wb_xram_adr[15:6]) & wb_xram_stb & wb_xram_wr & wb_xram_ack && (wb_xram_be[3] == 1'b1);
+wire rx_qcnt_dec = (cfg_rx_buf_qbase_addr == wb_xram_adr[15:6]) & wb_xram_stb & !wb_xram_wr & wb_xram_ack && (wb_xram_be[3] == 1'b1);
+
+assign reg_mac_addr[1:0] = 2'b0;
+assign reg_uart_addr[1:0] = 2'b0;
+assign reg_spi_addr[1:0] = 2'b0;
+//-------------------------------------------
+// clock-gen instantiation
+//-------------------------------------------
+clkgen u_clkgen (
+ . reset_n (reset_n ),
+ . fastsim_mode (fastsim_mode ),
+ . mastermode (mastermode ),
+ . xtal_clk (xtal_clk ),
+ . clkout (clkout ),
+ . gen_resetn (gen_resetn ),
+ . risc_reset (risc_reset ),
+ . app_clk (app_clk ),
+ . uart_ref_clk (uart_clk_16x )
+
+ );
+
+//--------------------------------------------------------------
+// Target ID Mapping
+// 4'b0100 -- MAC core
+// 4'b0011 -- UART
+// 4'b0010 -- SPI core
+// 4'b0001 -- External RAM
+// 4'b0000 -- External ROM
+//--------------------------------------------------------------
+
+
+wire [31:0] wb_master2_rdata;
+
+wire [3:0] wb_master2_be = (wbd_risc_adr[1:0] == 2'b00) ? 4'b0001:
+ (wbd_risc_adr[1:0] == 2'b01) ? 4'b0010:
+ (wbd_risc_adr[1:0] == 2'b10) ? 4'b0100: 4'b1000;
+
+assign wbd_risc_rdata = (wbd_risc_adr[1:0] == 2'b00) ? wb_master2_rdata[7:0]:
+ (wbd_risc_adr[1:0] == 2'b01) ? wb_master2_rdata[15:8]:
+ (wbd_risc_adr[1:0] == 2'b10) ? wb_master2_rdata[23:16]:
+ wb_master2_rdata[31:24];
+
+//------------------------------
+// RISC Data Memory Map
+// 0x0000 to 0x7FFFF - Data Memory
+// 0x8000 to 0x8FFF - SPI
+// 0x9000 to 0x9FFF - UART
+// 0xA000 to 0xAFFF - MAC Core
+//-----------------------------
+//
+wire [3:0] wbd_tar_id = (wbd_risc_adr[15] == 1'b0 ) ? 4'b0001 :
+ (wbd_risc_adr[15:12] == 4'b1000 ) ? 4'b0010 :
+ (wbd_risc_adr[15:12] == 4'b1001 ) ? 4'b0011 : 4'b0100;
+
+wb_crossbar #(5,5,32,4,13,4) u_wb_crossbar (
+
+ .rst_n (gen_resetn ),
+ .clk (app_clk ),
+
+
+ // Master Interface Signal
+ .wbd_taddr_master ({4'b0000,
+ wbd_tar_id,
+ ext_reg_tid,
+ wbgt_taddr,
+ wbgr_taddr}),
+ .wbd_din_master ({32'h0 ,
+ {wbd_risc_wdata[7:0],
+ wbd_risc_wdata[7:0],
+ wbd_risc_wdata[7:0],
+ wbd_risc_wdata[7:0]},
+ ext_reg_wdata,
+ wbgt_din,
+ wbgr_din}
+ ),
+ .wbd_dout_master ({wbi_risc_rdata,
+ wb_master2_rdata,
+ ext_reg_rdata,
+ wbgt_dout,
+ wbgr_dout}
+ ),
+ .wbd_adr_master ({wbi_risc_adr[12:0],
+ wbd_risc_adr[14:2],
+ ext_reg_addr[14:2],
+ wbgt_addr,
+ wbgr_addr}
+ ),
+ .wbd_be_master ({4'b1111,
+ wb_master2_be,
+ ext_reg_be,
+ wbgt_be,
+ wbgr_be}
+ ),
+ .wbd_we_master ({1'b0,wbd_risc_we,ext_reg_wr,
+ wbgt_we,wbgr_we} ),
+ .wbd_ack_master ({wbi_risc_ack,
+ wbd_risc_ack,
+ ext_reg_ack,
+ wbgt_ack,
+ wbgr_ack} ),
+ .wbd_stb_master ({wbi_risc_stb,
+ wbd_risc_stb,
+ ext_reg_cs,
+ wbgt_stb,
+ wbgr_stb} ),
+ .wbd_cyc_master ({wbi_risc_stb|wbi_risc_ack,
+ wbd_risc_stb|wbd_risc_ack,
+ ext_reg_cs|ext_reg_ack,
+ wbgt_cyc,wbgr_cyc}),
+ .wbd_err_master (),
+ .wbd_rty_master (),
+
+ // Slave Interface Signal
+ .wbd_din_slave ({
+ reg_mac_wdata,
+ reg_uart_wdata,
+ reg_spi_wdata,
+ wb_xram_wdata,
+ wb_xrom_wdata
+ }),
+ .wbd_dout_slave ({
+ reg_mac_rdata,
+ reg_uart_rdata,
+ reg_spi_rdata,
+ {wb_xram_rdata},
+ wb_xrom_rdata
+ }),
+ .wbd_adr_slave ({reg_mac_addr[14:2],
+ reg_uart_addr[14:2],
+ reg_spi_addr[14:2],
+ wb_xram_adr[14:2],
+ wb_xrom_adr[12:0]}
+ ),
+ .wbd_be_slave ({reg_mac_be,
+ reg_uart_be,
+ reg_spi_be,
+ wb_xram_be,
+ wb_xrom_be}
+ ),
+ .wbd_we_slave ({reg_mac_wr,
+ reg_uart_wr,
+ reg_spi_wr,
+ wb_xram_wr,
+ wb_xrom_wr
+ }),
+ .wbd_ack_slave ({reg_mac_ack,
+ reg_uart_ack,
+ reg_spi_ack,
+ wb_xram_ack,
+ wb_xrom_ack
+ }),
+ .wbd_stb_slave ({reg_mac_cs,
+ reg_uart_cs,
+ reg_spi_cs,
+ wb_xram_stb,
+ wb_xrom_stb
+ }),
+ .wbd_cyc_slave (),
+ .wbd_err_slave (),
+ .wbd_rty_slave ()
+ );
+
+
+//-------------------------------------------
+// GMAC core instantiation
+//-------------------------------------------
+
+g_mac_top u_eth_dut (
+
+ .scan_mode (1'b0 ),
+ .s_reset_n (gen_resetn ),
+ .tx_reset_n (gen_resetn ),
+ .rx_reset_n (gen_resetn ),
+ .reset_mdio_clk_n (gen_resetn ),
+ .app_reset_n (gen_resetn ),
+
+ // Reg Bus Interface Signal
+ . reg_cs (reg_mac_cs ),
+ . reg_wr (reg_mac_wr ),
+ . reg_addr (reg_mac_addr[5:2] ),
+ . reg_wdata (reg_mac_wdata ),
+ . reg_be (reg_mac_be ),
+
+ // Outputs
+ . reg_rdata (reg_mac_rdata ),
+ . reg_ack (reg_mac_ack ),
+
+
+ .app_clk (app_clk ),
+
+ // Application RX FIFO Interface
+ .app_txfifo_wren_i (app_txfifo_wren_i ),
+ .app_txfifo_wrdata_i (app_txfifo_wrdata_i ),
+ .app_txfifo_addr (app_txfifo_addr ),
+ .app_txfifo_full_o (app_txfifo_full_o ),
+ .app_txfifo_afull_o (app_txfifo_afull_o ),
+ .app_txfifo_space_o ( ),
+
+ // Application TX FIFO Interface
+ .app_rxfifo_rden_i (app_rxfifo_rden_i ),
+ .app_rxfifo_empty_o (app_rxfifo_empty_o ),
+ .app_rxfifo_aempty_o (app_rxfifo_aempty_o ),
+ .app_rxfifo_cnt_o ( ),
+ .app_rxfifo_rdata_o (app_rxfifo_rddata_o ),
+ .app_rxfifo_addr (app_rxfifo_addr ),
+
+ .app_rx_desc_req (app_rx_desc_req ),
+ .app_rx_desc_ack (app_rx_desc_ack ),
+ .app_rx_desc_discard (app_rx_desc_discard ),
+ .app_rx_desc_data (app_rx_desc_data ),
+
+ // Line Side Interface TX Path
+ .phy_tx_en (phy_tx_en ),
+ .phy_tx_er ( ),
+ .phy_txd (phy_txd ),
+ .phy_tx_clk (phy_tx_clk ),
+
+ // Line Side Interface RX Path
+ .phy_rx_clk (phy_rx_clk ),
+ .phy_rx_er (1'b0 ),
+ .phy_rx_dv (phy_rx_dv ),
+ .phy_rxd (phy_rxd ),
+ .phy_crs (1'b0 ),
+
+ //MDIO interface
+ .mdio_clk (mdio_clk ),
+ .mdio_in (mdio_in ),
+ .mdio_out_en (mdio_out_en ),
+ .mdio_out (mdio_out ),
+
+ // QCounter
+ .rx_buf_qbase_addr (cfg_rx_buf_qbase_addr),
+ .tx_buf_qbase_addr (cfg_tx_buf_qbase_addr),
+
+ .tx_qcnt_inc (tx_qcnt_inc),
+ .tx_qcnt_dec (tx_qcnt_dec),
+ .rx_qcnt_inc (rx_qcnt_inc),
+ .rx_qcnt_dec (rx_qcnt_dec),
+ .tx_qcnt (tx_qcnt),
+ .rx_qcnt (rx_qcnt)
+
+
+ );
+
+
+
+
+
+wb_rd_mem2mem #(.D_WD(32),.BE_WD(4),.ADR_WD(13),.TAR_WD(4)) u_wb_gmac_tx (
+
+ .rst_n ( gen_resetn ),
+ .clk ( app_clk ),
+
+ // descriptor handshake
+ .cfg_desc_baddr (cfg_tx_buf_qbase_addr),
+ .desc_q_empty (tx_q_empty ),
+
+ // Master Interface Signal
+ .mem_taddr ( 4'h1 ),
+ .mem_full (app_txfifo_full_o ),
+ .mem_afull (app_txfifo_afull_o ),
+ .mem_wr (app_txfifo_wren_i ),
+ .mem_din (app_txfifo_wrdata_i ),
+
+ // Slave Interface Signal
+ .wbo_dout ( wbgt_dout ),
+ .wbo_taddr ( wbgt_taddr ),
+ .wbo_addr ( wbgt_addr ),
+ .wbo_be ( wbgt_be ),
+ .wbo_we ( wbgt_we ),
+ .wbo_ack ( wbgt_ack ),
+ .wbo_stb ( wbgt_stb ),
+ .wbo_cyc ( wbgt_cyc ),
+ .wbo_err ( wbgt_err ),
+ .wbo_rty ( wbgt_rty )
+ );
+
+
+wb_wr_mem2mem #(.D_WD(32),.BE_WD(4),.ADR_WD(13),.TAR_WD(4)) u_wb_gmac_rx(
+
+ .rst_n ( gen_resetn ),
+ .clk ( app_clk ),
+
+
+ // Master Interface Signal
+ .mem_taddr ( 4'h1 ),
+ .mem_addr (app_rxfifo_addr ),
+ .mem_empty (app_rxfifo_empty_o ),
+ .mem_aempty (app_rxfifo_aempty_o ),
+ .mem_rd (app_rxfifo_rden_i ),
+ .mem_dout (app_rxfifo_rddata_o[7:0]),
+ .mem_eop (app_rxfifo_rddata_o[8]),
+
+ .cfg_desc_baddr (cfg_rx_buf_qbase_addr ),
+ .desc_req (app_rx_desc_req ),
+ .desc_ack (app_rx_desc_ack ),
+ .desc_disccard (app_rx_desc_discard ),
+ .desc_data (app_rx_desc_data ),
+ // Slave Interface Signal
+ .wbo_din ( wbgr_din ),
+ .wbo_taddr ( wbgr_taddr ),
+ .wbo_addr ( wbgr_addr ),
+ .wbo_be ( wbgr_be ),
+ .wbo_we ( wbgr_we ),
+ .wbo_ack ( wbgr_ack ),
+ .wbo_stb ( wbgr_stb ),
+ .wbo_cyc ( wbgr_cyc ),
+ .wbo_err ( wbgr_err ),
+ .wbo_rty ( wbgr_rty )
+ );
+
+//-------------------------------------
+// UART core instantiation
+//-------------------------------------
+
+uart_core u_uart_core
+
+ (
+ . line_reset_n (gen_resetn ),
+ . line_clk_16x (uart_clk_16x ),
+
+ . app_reset_n (gen_resetn ),
+ . app_clk (app_clk ),
+
+
+ // Reg Bus Interface Signal
+ . reg_cs (reg_uart_cs ),
+ . reg_wr (reg_uart_wr ),
+ . reg_addr (reg_uart_addr[5:2] ),
+ . reg_wdata (reg_uart_wdata ),
+ . reg_be (reg_uart_be ),
+
+ // Outputs
+ . reg_rdata (reg_uart_rdata ),
+ . reg_ack (reg_uart_ack ),
+
+
+
+ // Line Interface
+ . si (si ),
+ . so (so )
+
+ );
+
+
+//--------------------------------
+// SPI core instantiation
+//--------------------------------
+
+
+spi_core u_spi_core (
+
+ . clk (app_clk ),
+ . reset_n (gen_resetn ),
+
+ // Reg Bus Interface Signal
+ . reg_cs (reg_spi_cs ),
+ . reg_wr (reg_spi_wr ),
+ . reg_addr (reg_spi_addr[5:2] ),
+ . reg_wdata (reg_spi_wdata ),
+ . reg_be (reg_spi_be ),
+
+ // Outputs
+ . reg_rdata (reg_spi_rdata ),
+ . reg_ack (reg_spi_ack ),
+
+
+ . sck (spi_sck ),
+ . so (spi_so ),
+ . si (spi_si ),
+ . cs_n (spi_cs_n )
+
+ );
+
+
+
+oc8051_top u_8051_core (
+ . wb_rst_i (risc_reset ),
+ . wb_clk_i (app_clk ),
+
+//interface to instruction rom
+ . wbi_adr_o (wbi_risc_adr ),
+ . wbi_dat_i (wbi_risc_rdata ),
+ . wbi_stb_o (wbi_risc_stb ),
+ . wbi_ack_i (wbi_risc_ack ),
+ . wbi_cyc_o (wbi_risc_cyc ),
+ . wbi_err_i (wbi_risc_err ),
+
+//interface to data ram
+ . wbd_dat_i (wbd_risc_rdata ),
+ . wbd_dat_o (wbd_risc_wdata ),
+ . wbd_adr_o (wbd_risc_adr ),
+ . wbd_we_o (wbd_risc_we ),
+ . wbd_ack_i (wbd_risc_ack ),
+ . wbd_stb_o (wbd_risc_stb ),
+ . wbd_cyc_o (wbd_risc_cyc ),
+ . wbd_err_i (wbd_risc_err ),
+
+// interrupt interface
+ . int0_i ( ),
+ . int1_i ( ),
+
+
+// port interface
+ `ifdef OC8051_PORTS
+ `ifdef OC8051_PORT0
+ .p0_i ( p0 ),
+ .p0_o ( p0 ),
+ `endif
+
+ `ifdef OC8051_PORT1
+ .p1_i ( p1 ),
+ .p1_o ( p1 ),
+ `endif
+
+ `ifdef OC8051_PORT2
+ .p2_i ( p2 ),
+ .p2_o ( p2 ),
+ `endif
+
+ `ifdef OC8051_PORT3
+ .p3_i ( p3 ),
+ .p3_o ( p3 ),
+ `endif
+ `endif
+
+// serial interface
+ `ifdef OC8051_UART
+ .rxd_i ( ),
+ .txd_o ( ),
+ `endif
+
+// counter interface
+ `ifdef OC8051_TC01
+ .t0_i ( ),
+ .t1_i ( ),
+ `endif
+
+ `ifdef OC8051_TC2
+ .t2_i ( ),
+ .t2ex_i ( ),
+ `endif
+
+// BIST
+`ifdef OC8051_BIST
+ .scanb_rst ( ),
+ .scanb_clk ( ),
+ .scanb_si ( ),
+ .scanb_so ( ),
+ .scanb_en ( ),
+`endif
+// external access (active low)
+ .ea_in (ea_in )
+ );
+
+endmodule
diff --git a/verilog/rtl/glbl/src/glbl_cfg.sv b/verilog/rtl/glbl/src/glbl_cfg.sv
new file mode 100644
index 0000000..6ce06a1
--- /dev/null
+++ b/verilog/rtl/glbl/src/glbl_cfg.sv
@@ -0,0 +1,576 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Global confg register ////
+//// ////
+//// This file is part of the mbist_ctrl project ////
+//// https://github.com/dineshannayya/mbist_ctrl.git ////
+//// ////
+//// Description ////
+//// This block generate all the global config and status ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.1 - 18 Nov 2021 Dinesh A ////
+//// Initial version ////
+//// 0.2 - 27 Nov 2021, Dinesh A ////
+//// Scan Ports added & Chip ID change to LBST ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+module glbl_cfg #(parameter SCW = 8 // SCAN CHAIN WIDTH
+ ) (
+
+`ifdef USE_POWER_PINS
+ inout vccd1, // User area 1 1.8V supply
+ inout vssd1, // User area 1 digital ground
+`endif
+
+ input logic mclk,
+ input logic reset_n,
+
+ // Scan I/F
+ input logic scan_en,
+ input logic scan_mode,
+ input logic [SCW-1:0] scan_si,
+ output logic [SCW-1:0] scan_so,
+ output logic scan_en_o,
+ output logic scan_mode_o,
+
+ // Clock Skew Adjust
+ input logic wbd_clk_int ,
+ input logic [3:0] cfg_cska_glbl ,
+ output logic wbd_clk_glbl , // clock skew adjust for web host
+
+
+ // Reg Bus Interface Signal
+ input logic reg_cs,
+ input logic reg_wr,
+ input logic [7:0] reg_addr,
+ input logic [31:0] reg_wdata,
+ input logic [3:0] reg_be,
+
+ // Outputs
+ output logic [31:0] reg_rdata,
+ output logic reg_ack,
+
+ // BIST I/F
+ output logic [7:0] bist_en,
+ output logic [7:0] bist_run,
+ output logic [7:0] bist_load,
+
+ output logic [7:0] bist_sdi,
+ output logic [7:0] bist_shift,
+ input logic [7:0] bist_sdo,
+
+ input logic [7:0] bist_done,
+ input logic [7:0] bist_error,
+ input logic [7:0] bist_correct,
+ input logic [3:0] bist_error_cnt0,
+ input logic [3:0] bist_error_cnt1,
+ input logic [3:0] bist_error_cnt2,
+ input logic [3:0] bist_error_cnt3,
+ input logic [3:0] bist_error_cnt4,
+ input logic [3:0] bist_error_cnt5,
+ input logic [3:0] bist_error_cnt6,
+ input logic [3:0] bist_error_cnt7
+
+ );
+
+
+
+//-----------------------------------------------------------------------
+// Internal Wire Declarations
+//-----------------------------------------------------------------------
+
+logic sw_rd_en ;
+logic sw_wr_en ;
+logic [3:0] sw_addr ; // addressing 16 registers
+logic [3:0] wr_be ;
+logic [31:0] sw_reg_wdata;
+
+
+
+logic [31:0] reg_0; // Software_Reg 0
+logic [31:0] reg_1; // Software Reg 1
+logic [7:0] cfg_bist_ctrl_1; // BIST control
+logic [31:0] cfg_bist_ctrl_2; // BIST control
+logic [31:0] cfg_bist_status_1; // BIST Status
+logic [31:0] cfg_bist_status_2; // BIST Status
+logic [31:0] serail_dout; // BIST Serial Signature
+logic [31:0] reg_9; // Software_Reg 9
+logic [31:0] reg_10; // Software Reg 10
+logic [31:0] reg_11; // Software Reg 11
+
+logic [31:0] reg_out;
+
+//-----------------------------------------------------------------------
+// Main code starts here
+//-----------------------------------------------------------------------
+
+
+assign scan_en_o = scan_en;
+assign scan_mode_o = scan_mode;
+
+// wb_host clock skew control
+clk_skew_adjust u_skew_glbl
+ (
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1 ),// User area 1 1.8V supply
+ .vssd1 (vssd1 ),// User area 1 digital ground
+`endif
+ .clk_in (wbd_clk_int ),
+ .sel (cfg_cska_glbl ),
+ .clk_out (wbd_clk_glbl )
+ );
+
+//-----------------------------------------------------------------------
+// register read enable and write enable decoding logic
+//-----------------------------------------------------------------------
+
+assign sw_addr = reg_addr [5:2];
+assign sw_rd_en = reg_cs & !reg_wr;
+assign sw_wr_en = reg_cs & reg_wr;
+assign wr_be = reg_be;
+assign sw_reg_wdata = reg_wdata;
+
+
+wire sw_wr_en_0 = sw_wr_en & (sw_addr == 4'h0);
+wire sw_rd_en_0 = sw_rd_en & (sw_addr == 4'h0);
+wire sw_wr_en_1 = sw_wr_en & (sw_addr == 4'h1);
+wire sw_rd_en_1 = sw_rd_en & (sw_addr == 4'h1);
+wire sw_wr_en_2 = sw_wr_en & (sw_addr == 4'h2);
+wire sw_rd_en_2 = sw_rd_en & (sw_addr == 4'h2);
+wire sw_wr_en_3 = sw_wr_en & (sw_addr == 4'h3);
+wire sw_rd_en_3 = sw_rd_en & (sw_addr == 4'h3);
+wire sw_wr_en_4 = sw_wr_en & (sw_addr == 4'h4);
+wire sw_rd_en_4 = sw_rd_en & (sw_addr == 4'h4);
+wire sw_wr_en_5 = sw_wr_en & (sw_addr == 4'h5);
+wire sw_rd_en_5 = sw_rd_en & (sw_addr == 4'h5);
+wire sw_wr_en_6 = sw_wr_en & (sw_addr == 4'h6);
+wire sw_rd_en_6 = sw_rd_en & (sw_addr == 4'h6);
+wire sw_wr_en_7 = sw_wr_en & (sw_addr == 4'h7);
+wire sw_rd_en_7 = sw_rd_en & (sw_addr == 4'h7);
+wire sw_wr_en_8 = sw_wr_en & (sw_addr == 4'h8);
+wire sw_wr_en_9 = sw_wr_en & (sw_addr == 4'h9);
+wire sw_wr_en_10 = sw_wr_en & (sw_addr == 4'hA);
+wire sw_wr_en_11 = sw_wr_en & (sw_addr == 4'hB);
+
+logic wb_req;
+logic wb_req_d;
+logic wb_req_pedge;
+
+always_ff @(negedge reset_n or posedge mclk) begin
+ if ( reset_n == 1'b0 ) begin
+ wb_req <= '0;
+ wb_req_d <= '0;
+ end else begin
+ wb_req <= reg_cs && (reg_ack == 0) ;
+ wb_req_d <= wb_req;
+ end
+end
+
+// Detect pos edge of request
+assign wb_req_pedge = (wb_req_d ==0) && (wb_req==1'b1);
+//-----------------------------------------------------------------
+// Reg 4/5 are BIST Serial I/F register and it takes minimum 32
+// cycle to respond ACK back
+// ----------------------------------------------------------------
+wire ser_acc = sw_wr_en_6 | sw_rd_en_7;
+wire non_ser_acc = reg_cs ? !ser_acc : 1'b0;
+wire serial_ack;
+
+always @ (posedge mclk or negedge reset_n)
+begin : preg_out_Seq
+ if (reset_n == 1'b0) begin
+ reg_rdata <= 'h0;
+ reg_ack <= 1'b0;
+ end else if (ser_acc && serial_ack) begin
+ reg_rdata <= serail_dout ;
+ reg_ack <= 1'b1;
+ end else if (non_ser_acc && !reg_ack) begin
+ reg_rdata <= reg_out ;
+ reg_ack <= 1'b1;
+ end else begin
+ reg_ack <= 1'b0;
+ end
+end
+
+always @( *)
+begin
+ reg_out [31:0] = 32'h0;
+
+ case (sw_addr [3:0])
+ 4'b0000 : reg_out [31:0] = reg_0;
+ 4'b0001 : reg_out [31:0] = reg_1;
+ 4'b0010 : reg_out [31:0] = {24'h0,cfg_bist_ctrl_1};
+ 4'b0011 : reg_out [31:0] = cfg_bist_ctrl_2 [31:0];
+ 4'b0100 : reg_out [31:0] = cfg_bist_status_1 [31:0];
+ 4'b0101 : reg_out [31:0] = cfg_bist_status_2 [31:0];
+ 4'b0110 : reg_out [31:0] = 'h0; // Serial Write Data
+ 4'b0111 : reg_out [31:0] = serail_dout; // This is with Shift
+ 4'b1000 : reg_out [31:0] = serail_dout; // This is previous Shift
+ 4'b1001 : reg_out [31:0] = reg_9; // Software Reg1
+ 4'b1010 : reg_out [31:0] = reg_10; // Software Reg2
+ 4'b1011 : reg_out [31:0] = reg_11; // Software Reg3
+ default : reg_out [31:0] = 'h0;
+ endcase
+end
+
+
+//-----------------------------------------------------------------------
+// Individual register assignments
+//-----------------------------------------------------------------------
+//-----------------------------------------------------------------------
+// reg-0
+// -----------------------------------------------------------------
+generic_register #(8,8'h11 ) u_reg0_be0 (
+ .we ({8{sw_wr_en_0 &
+ wr_be[0] }} ),
+ .data_in (sw_reg_wdata[7:0] ),
+ .reset_n (reset_n ),
+ .clk (mclk ),
+
+ //List of Outs
+ .data_out (reg_0[7:0] )
+ );
+
+generic_register #(8,8'h22 ) u_reg0_be1 (
+ .we ({8{sw_wr_en_0 &
+ wr_be[1] }} ),
+ .data_in (sw_reg_wdata[15:8] ),
+ .reset_n (reset_n ),
+ .clk (mclk ),
+
+ //List of Outs
+ .data_out (reg_0[15:8] )
+ );
+generic_register #(8,8'h33 ) u_reg0_be2 (
+ .we ({8{sw_wr_en_0 &
+ wr_be[2] }} ),
+ .data_in (sw_reg_wdata[23:16] ),
+ .reset_n (reset_n ),
+ .clk (mclk ),
+
+ //List of Outs
+ .data_out (reg_0[23:16] )
+ );
+
+generic_register #(8,8'h44 ) u_reg0_be3 (
+ .we ({8{sw_wr_en_0 &
+ wr_be[3] }} ),
+ .data_in (sw_reg_wdata[31:24] ),
+ .reset_n (reset_n ),
+ .clk (mclk ),
+
+ //List of Outs
+ .data_out (reg_0[31:24] )
+ );
+
+//-----------------------------------------------------------------------
+// reg-1
+// -----------------------------------------------------------------
+generic_register #(8,8'hAA ) u_reg1_be0 (
+ .we ({8{sw_wr_en_1 &
+ wr_be[0] }} ),
+ .data_in (sw_reg_wdata[7:0] ),
+ .reset_n (reset_n ),
+ .clk (mclk ),
+
+ //List of Outs
+ .data_out (reg_1[7:0] )
+ );
+
+generic_register #(8,8'hBB ) u_reg1_be1 (
+ .we ({8{sw_wr_en_1 &
+ wr_be[1] }} ),
+ .data_in (sw_reg_wdata[15:8] ),
+ .reset_n (reset_n ),
+ .clk (mclk ),
+
+ //List of Outs
+ .data_out (reg_1[15:8] )
+ );
+generic_register #(8,8'hCC ) u_reg1_be2 (
+ .we ({8{sw_wr_en_1 &
+ wr_be[2] }} ),
+ .data_in (sw_reg_wdata[23:16] ),
+ .reset_n (reset_n ),
+ .clk (mclk ),
+
+ //List of Outs
+ .data_out (reg_1[23:16] )
+ );
+
+generic_register #(8,8'hDD ) u_reg1_be3 (
+ .we ({8{sw_wr_en_1 &
+ wr_be[3] }} ),
+ .data_in (sw_reg_wdata[31:24] ),
+ .reset_n (reset_n ),
+ .clk (mclk ),
+
+ //List of Outs
+ .data_out (reg_1[31:24] )
+ );
+
+//-----------------------------------------------------------------------
+// reg-2
+// -----------------------------------------------------------------
+generic_register #(8,8'h0 ) u_reg2_be0 (
+ .we ({8{sw_wr_en_2 &
+ wr_be[0] }} ),
+ .data_in (sw_reg_wdata[7:0] ),
+ .reset_n (reset_n ),
+ .clk (mclk ),
+
+ //List of Outs
+ .data_out (cfg_bist_ctrl_1[7:0] )
+ );
+
+
+wire [3:0] bist_serial_sel = cfg_bist_ctrl_1[3:0];
+//-----------------------------------------------------------------------
+// reg-3
+// -----------------------------------------------------------------
+// Bist control
+assign bist_en[0] = cfg_bist_ctrl_2[0];
+assign bist_run[0] = cfg_bist_ctrl_2[1];
+assign bist_load[0] = cfg_bist_ctrl_2[2];
+
+assign bist_en[1] = cfg_bist_ctrl_2[4];
+assign bist_run[1] = cfg_bist_ctrl_2[5];
+assign bist_load[1] = cfg_bist_ctrl_2[6];
+
+assign bist_en[2] = cfg_bist_ctrl_2[8];
+assign bist_run[2] = cfg_bist_ctrl_2[9];
+assign bist_load[2] = cfg_bist_ctrl_2[10];
+
+assign bist_en[3] = cfg_bist_ctrl_2[12];
+assign bist_run[3] = cfg_bist_ctrl_2[13];
+assign bist_load[3] = cfg_bist_ctrl_2[14];
+
+assign bist_en[4] = cfg_bist_ctrl_2[16];
+assign bist_run[4] = cfg_bist_ctrl_2[17];
+assign bist_load[4] = cfg_bist_ctrl_2[18];
+
+assign bist_en[5] = cfg_bist_ctrl_2[20];
+assign bist_run[5] = cfg_bist_ctrl_2[21];
+assign bist_load[5] = cfg_bist_ctrl_2[22];
+
+assign bist_en[6] = cfg_bist_ctrl_2[24];
+assign bist_run[6] = cfg_bist_ctrl_2[25];
+assign bist_load[6] = cfg_bist_ctrl_2[26];
+
+assign bist_en[7] = cfg_bist_ctrl_2[28];
+assign bist_run[7] = cfg_bist_ctrl_2[29];
+assign bist_load[7] = cfg_bist_ctrl_2[30];
+
+
+
+generic_register #(8,8'h0 ) u_bist_ctrl_be0 (
+ .we ({8{sw_wr_en_3 &
+ wr_be[0] }} ),
+ .data_in (sw_reg_wdata[7:0] ),
+ .reset_n (reset_n ),
+ .clk (mclk ),
+
+ //List of Outs
+ .data_out (cfg_bist_ctrl_2[7:0] )
+ );
+
+generic_register #(8,8'h0 ) u_bist_ctrl_be1 (
+ .we ({8{sw_wr_en_3 &
+ wr_be[1] }} ),
+ .data_in (sw_reg_wdata[15:8] ),
+ .reset_n (reset_n ),
+ .clk (mclk ),
+
+ //List of Outs
+ .data_out (cfg_bist_ctrl_2[15:8] )
+ );
+generic_register #(8,8'h0 ) u_bist_ctrl_be2 (
+ .we ({8{sw_wr_en_3 &
+ wr_be[2] }} ),
+ .data_in (sw_reg_wdata[23:16] ),
+ .reset_n (reset_n ),
+ .clk (mclk ),
+
+ //List of Outs
+ .data_out (cfg_bist_ctrl_2[23:16] )
+ );
+
+generic_register #(8,8'h0 ) u_bist_ctrl_be3 (
+ .we ({8{sw_wr_en_3 &
+ wr_be[3] }} ),
+ .data_in (sw_reg_wdata[31:24] ),
+ .reset_n (reset_n ),
+ .clk (mclk ),
+
+ //List of Outs
+ .data_out (cfg_bist_ctrl_2[31:24] )
+ );
+
+
+//-----------------------------------------------------------------------
+// reg-3
+//-----------------------------------------------------------------
+
+assign cfg_bist_status_2 = { bist_error_cnt7, 1'b0, bist_correct[7], bist_error[7], bist_done[7],
+ bist_error_cnt6, 1'b0, bist_correct[6], bist_error[6], bist_done[6],
+ bist_error_cnt5, 1'b0, bist_correct[5], bist_error[5], bist_done[5],
+ bist_error_cnt4, 1'b0, bist_correct[4], bist_error[4], bist_done[4]
+ };
+assign cfg_bist_status_1 = { bist_error_cnt3, 1'b0, bist_correct[3], bist_error[3], bist_done[3],
+ bist_error_cnt2, 1'b0, bist_correct[2], bist_error[2], bist_done[2],
+ bist_error_cnt1, 1'b0, bist_correct[1], bist_error[1], bist_done[1],
+ bist_error_cnt0, 1'b0, bist_correct[0], bist_error[0], bist_done[0]
+ };
+
+//-----------------------------------------------------------------------
+// reg-4 => Write to Serail I/F
+// reg-5 => READ from Serail I/F
+//-----------------------------------------------------------------
+wire bist_sdi_int;
+wire bist_shift_int;
+wire bist_sdo_int;
+
+assign bist_sdo_int = (bist_serial_sel == 4'b0000) ? bist_sdo[0] :
+ (bist_serial_sel == 4'b0001) ? bist_sdo[1] :
+ (bist_serial_sel == 4'b0010) ? bist_sdo[2] :
+ (bist_serial_sel == 4'b0011) ? bist_sdo[3] :
+ (bist_serial_sel == 4'b0100) ? bist_sdo[4] :
+ (bist_serial_sel == 4'b0101) ? bist_sdo[5] :
+ (bist_serial_sel == 4'b0110) ? bist_sdo[6] :
+ (bist_serial_sel == 4'b0111) ? bist_sdo[7] :
+ 1'b0;
+
+assign bist_shift[0] = (bist_serial_sel == 4'b0000) ? bist_shift_int : 1'b0;
+assign bist_shift[1] = (bist_serial_sel == 4'b0001) ? bist_shift_int : 1'b0;
+assign bist_shift[2] = (bist_serial_sel == 4'b0010) ? bist_shift_int : 1'b0;
+assign bist_shift[3] = (bist_serial_sel == 4'b0011) ? bist_shift_int : 1'b0;
+assign bist_shift[4] = (bist_serial_sel == 4'b0100) ? bist_shift_int : 1'b0;
+assign bist_shift[5] = (bist_serial_sel == 4'b0101) ? bist_shift_int : 1'b0;
+assign bist_shift[6] = (bist_serial_sel == 4'b0110) ? bist_shift_int : 1'b0;
+assign bist_shift[7] = (bist_serial_sel == 4'b0111) ? bist_shift_int : 1'b0;
+
+assign bist_sdi[0] = (bist_serial_sel == 4'b0000) ? bist_sdi_int : 1'b0;
+assign bist_sdi[1] = (bist_serial_sel == 4'b0001) ? bist_sdi_int : 1'b0;
+assign bist_sdi[2] = (bist_serial_sel == 4'b0010) ? bist_sdi_int : 1'b0;
+assign bist_sdi[3] = (bist_serial_sel == 4'b0011) ? bist_sdi_int : 1'b0;
+assign bist_sdi[4] = (bist_serial_sel == 4'b0100) ? bist_sdi_int : 1'b0;
+assign bist_sdi[5] = (bist_serial_sel == 4'b0101) ? bist_sdi_int : 1'b0;
+assign bist_sdi[6] = (bist_serial_sel == 4'b0110) ? bist_sdi_int : 1'b0;
+assign bist_sdi[7] = (bist_serial_sel == 4'b0111) ? bist_sdi_int : 1'b0;
+
+ser_inf_32b u_ser_intf
+ (
+
+ // Master Port
+ .rst_n (reset_n), // Regular Reset signal
+ .clk (mclk), // System clock
+ .reg_wr (sw_wr_en_6 & wb_req_pedge), // Write Request
+ .reg_rd (sw_rd_en_7 & wb_req_pedge), // Read Request
+ .reg_wdata (reg_wdata) , // data output
+ .reg_rdata (serail_dout), // data input
+ .reg_ack (serial_ack), // acknowlegement
+
+ // Slave Port
+ .sdi (bist_sdi_int), // Serial SDI
+ .shift (bist_shift_int), // Shift Signal
+ .sdo (bist_sdo_int) // Serial SDO
+
+ );
+
+
+//-----------------------------------------
+// Software Reg-1 : ASCI Representation of LBST = 32'h4C66_8354
+// ----------------------------------------
+gen_32b_reg #(32'h4C66_8354) u_reg_9 (
+ //List of Inputs
+ .reset_n (reset_n ),
+ .clk (mclk ),
+ .cs (sw_wr_en_9 ),
+ .we (wr_be ),
+ .data_in (sw_reg_wdata ),
+
+ //List of Outs
+ .data_out (reg_9 )
+ );
+
+//-----------------------------------------
+// Software Reg-2, Release date: <DAY><MONTH><YEAR>
+// ----------------------------------------
+gen_32b_reg #(32'h1603_2022) u_reg_101 (
+ //List of Inputs
+ .reset_n (reset_n ),
+ .clk (mclk ),
+ .cs (sw_wr_en_10 ),
+ .we (wr_be ),
+ .data_in (sw_reg_wdata ),
+
+ //List of Outs
+ .data_out (reg_10 )
+ );
+
+//-----------------------------------------
+// Software Reg-3: Poject Revison 1.6 = 0001600
+// ----------------------------------------
+gen_32b_reg #(32'h0001_6000) u_reg_11 (
+ //List of Inputs
+ .reset_n (reset_n ),
+ .clk (mclk ),
+ .cs (sw_wr_en_11 ),
+ .we (wr_be ),
+ .data_in (sw_reg_wdata ),
+
+ //List of Outs
+ .data_out (reg_11 )
+ );
+
+endmodule
diff --git a/verilog/rtl/glbl/src/run_iverilog b/verilog/rtl/glbl/src/run_iverilog
new file mode 100755
index 0000000..d9b0e86
--- /dev/null
+++ b/verilog/rtl/glbl/src/run_iverilog
@@ -0,0 +1 @@
+iverilog -g2005-sv glbl_cfg.sv ../../lib/ser_inf_32b.sv ../../lib/registers.v
diff --git a/verilog/rtl/glbl/src/run_verilator b/verilog/rtl/glbl/src/run_verilator
new file mode 100755
index 0000000..aaa2366
--- /dev/null
+++ b/verilog/rtl/glbl/src/run_verilator
@@ -0,0 +1 @@
+verilator -cc glbl_cfg.sv ../../lib/ser_inf_32b.sv ../../lib/registers.v --top-module glbl_cfg
diff --git a/verilog/rtl/gmac/crc32/g_rx_crc32.v b/verilog/rtl/gmac/crc32/g_rx_crc32.v
new file mode 100755
index 0000000..c14ce14
--- /dev/null
+++ b/verilog/rtl/gmac/crc32/g_rx_crc32.v
@@ -0,0 +1,302 @@
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Tubo 8051 cores MAC Interface Module ////
+//// ////
+//// This file is part of the Turbo 8051 cores project ////
+//// http://www.opencores.org/cores/turbo8051/ ////
+//// ////
+//// Description ////
+//// Turbo 8051 definitions. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+/***************************************************************
+ Description:
+ rx_crc32.v: This block contains the crc32 checker.
+ * CRC is generated in the receive data when mi2rc_rcv_valid is asserted.
+ * For the recieve data. crc_ok indicates whenther the packet was
+ * good or bad.
+ * The 32-bit crc shift register is reset to all 1's when
+ * mi2rc_strt_rcv is asserted.
+
+ *********************************************************************/
+module g_rx_crc32 (
+ // CRC Valid signal to rx_fsm
+ rc2rf_crc_ok,
+
+ // Global Signals
+ phy_rx_clk,
+ reset_n,
+ // CRC Data signals
+ mi2rc_strt_rcv,
+ mi2rc_rcv_valid,
+ mi2rc_rx_byte
+ );
+
+ // defx[ine inputs and outputs.
+
+ output rc2rf_crc_ok; // asserted when crc check is ok. to rx.
+
+ input phy_rx_clk; // serial clock from phy.
+ input reset_n; // global asynchronous reset.
+
+ input mi2rc_rcv_valid; // when asserted, crc is computed on
+ // rx_crc_data. from rx.
+ input mi2rc_strt_rcv; // when asserted, crc shift register is
+ // reset to all 1's. from rx.
+ input [7:0] mi2rc_rx_byte; // receive data. from rx.
+
+
+
+
+ // reg/wire declarations for primary outputs.
+ wire rc2rf_crc_ok;
+
+ // define constants and parameters here.
+ // define local signals here.
+
+ wire [7:0] crc_in;
+ wire gen_crc;
+ reg [31:0] current_crc, next_crc;
+ reg crc_ok_ul;
+
+ wire [31:0] rx_fcs;
+
+ // code starts here.
+
+ // select either rx_crc_data or tx_data as the input to crc generator.
+ assign crc_in = mi2rc_rx_byte;
+
+ // enable crc generator
+
+ assign gen_crc = mi2rc_rcv_valid ; //
+
+ // 32-bit crc shift register for crc calculation.
+
+ always @(posedge phy_rx_clk or negedge reset_n)
+ begin
+ if (!reset_n)
+ begin
+ current_crc <= 32'hffffffff;
+ end
+ else
+ begin
+ if (mi2rc_strt_rcv)
+ begin
+ current_crc <= 32'hffffffff;
+ end
+ else if (gen_crc) // generate crc
+ begin
+ current_crc <= next_crc;
+ end // else: !if(tx_reset_crc || mi2rc_strt_rcv)
+ end // else: !if(!reset_n)
+ end // always @ (posedge phy_rx_clk or negedge reset_n)
+
+ // combinational logic to generate next_crc
+
+ always @(current_crc or crc_in)
+ begin
+
+ next_crc[0] = current_crc[8] ^ current_crc[2] ^ crc_in[2];
+ next_crc[1] = current_crc[9] ^ current_crc[0] ^ crc_in[0] ^
+ current_crc[3] ^ crc_in[3];
+ next_crc[2] = current_crc[10] ^ current_crc[0] ^ crc_in[0] ^
+ current_crc[1] ^ crc_in[1] ^ current_crc[4] ^
+ crc_in[4];
+ next_crc[3] = current_crc[11] ^ current_crc[1] ^ crc_in[1] ^
+ current_crc[2] ^ crc_in[2] ^ current_crc[5] ^
+ crc_in[5];
+ next_crc[4] = current_crc[12] ^ current_crc[2] ^ crc_in[2] ^
+ current_crc[3] ^ crc_in[3] ^ current_crc[6] ^
+ current_crc[0] ^ crc_in[0] ^ crc_in[6];
+ next_crc[5] = current_crc[13] ^ current_crc[3] ^ crc_in[3] ^
+ current_crc[4] ^ crc_in[4] ^ current_crc[7] ^
+ current_crc[1] ^ crc_in[1] ^ crc_in[7];
+ next_crc[6] = current_crc[14] ^ current_crc[4] ^ crc_in[4] ^
+ current_crc[5] ^ crc_in[5];
+ next_crc[7] = current_crc[15] ^ current_crc[5] ^ crc_in[5] ^
+ current_crc[6] ^ current_crc[0] ^ crc_in[0] ^
+ crc_in[6];
+ next_crc[8] = current_crc[16] ^ current_crc[0] ^ crc_in[0] ^
+ current_crc[6] ^ current_crc[0] ^ crc_in[0] ^
+ crc_in[6] ^ current_crc[7] ^ current_crc[1] ^
+ crc_in[1] ^ crc_in[7];
+ next_crc[9] = current_crc[17] ^ current_crc[1] ^ crc_in[1] ^
+ current_crc[7] ^ current_crc[1] ^ crc_in[1] ^
+ crc_in[7];
+ next_crc[10] = current_crc[18] ^ current_crc[2] ^ crc_in[2];
+ next_crc[11] = current_crc[19] ^ current_crc[3] ^ crc_in[3];
+ next_crc[12] = current_crc[20] ^ current_crc[0] ^ crc_in[0] ^
+ current_crc[4] ^ crc_in[4];
+ next_crc[13] = current_crc[21] ^ current_crc[0] ^ crc_in[0] ^
+ current_crc[1] ^ crc_in[1] ^ current_crc[5] ^
+ crc_in[5];
+ next_crc[14] = current_crc[22] ^ current_crc[0] ^ crc_in[0] ^
+ current_crc[1] ^ crc_in[1] ^ current_crc[2] ^
+ crc_in[2] ^ current_crc[6] ^ current_crc[0] ^
+ crc_in[0] ^ crc_in[6];
+ next_crc[15] = current_crc[23] ^ current_crc[1] ^ crc_in[1] ^
+ current_crc[2] ^ crc_in[2] ^ current_crc[3] ^
+ crc_in[3] ^ current_crc[7] ^ current_crc[1] ^
+ crc_in[1] ^ crc_in[7];
+ next_crc[16] = current_crc[24] ^ current_crc[0] ^ crc_in[0] ^
+ current_crc[2] ^ crc_in[2] ^ current_crc[3] ^
+ crc_in[3] ^ current_crc[4] ^ crc_in[4];
+ next_crc[17] = current_crc[25] ^ current_crc[0] ^ crc_in[0] ^
+ current_crc[1] ^ crc_in[1] ^ current_crc[3] ^
+ crc_in[3] ^ current_crc[4] ^ crc_in[4] ^
+ current_crc[5] ^ crc_in[5];
+ next_crc[18] = current_crc[26] ^ current_crc[1] ^ crc_in[1] ^
+ current_crc[2] ^ crc_in[2] ^ current_crc[4] ^
+ crc_in[4] ^ current_crc[5] ^ crc_in[5] ^
+ current_crc[6] ^ current_crc[0] ^ crc_in[0] ^
+ crc_in[6];
+ next_crc[19] = current_crc[27] ^ current_crc[0] ^ crc_in[0] ^
+ current_crc[2] ^ crc_in[2] ^ current_crc[3] ^
+ crc_in[3] ^ current_crc[5] ^ crc_in[5] ^
+ current_crc[6] ^ current_crc[0] ^ crc_in[0] ^
+ crc_in[6] ^ current_crc[7] ^ current_crc[1] ^
+ crc_in[1] ^ crc_in[7];
+ next_crc[20] = current_crc[28] ^ current_crc[0] ^ crc_in[0] ^
+ current_crc[1] ^ crc_in[1] ^ current_crc[3] ^
+ crc_in[3] ^ current_crc[4] ^ crc_in[4] ^
+ current_crc[6] ^ current_crc[0] ^ crc_in[0] ^
+ crc_in[6] ^ current_crc[7] ^ current_crc[1] ^
+ crc_in[1] ^ crc_in[7];
+ next_crc[21] = current_crc[29] ^ current_crc[1] ^ crc_in[1] ^
+ current_crc[2] ^ crc_in[2] ^ current_crc[4] ^
+ crc_in[4] ^ current_crc[5] ^ crc_in[5] ^
+ current_crc[7] ^ current_crc[1] ^ crc_in[1] ^
+ crc_in[7];
+ next_crc[22] = current_crc[30] ^ current_crc[0] ^ crc_in[0] ^
+ current_crc[2] ^ crc_in[2] ^ current_crc[3] ^
+ crc_in[3] ^ current_crc[5] ^ crc_in[5] ^
+ current_crc[6] ^ current_crc[0] ^ crc_in[0] ^
+ crc_in[6];
+ next_crc[23] = current_crc[31] ^ current_crc[0] ^ crc_in[0] ^
+ current_crc[1] ^ crc_in[1] ^ current_crc[3] ^
+ crc_in[3] ^ current_crc[4] ^ crc_in[4] ^
+ current_crc[6] ^ current_crc[0] ^ crc_in[0] ^
+ crc_in[6] ^ current_crc[7] ^ current_crc[1] ^
+ crc_in[1] ^ crc_in[7];
+ next_crc[24] = current_crc[0] ^ crc_in[0] ^ current_crc[1] ^
+ crc_in[1] ^ current_crc[2] ^ crc_in[2] ^
+ current_crc[4] ^ crc_in[4] ^ current_crc[5] ^
+ crc_in[5] ^ current_crc[7] ^ current_crc[1] ^
+ crc_in[1] ^ crc_in[7];
+ next_crc[25] = current_crc[1] ^ crc_in[1] ^ current_crc[2] ^
+ crc_in[2] ^ current_crc[3] ^ crc_in[3] ^
+ current_crc[5] ^ crc_in[5] ^ current_crc[6] ^
+ current_crc[0] ^ crc_in[0] ^ crc_in[6];
+ next_crc[26] = current_crc[2] ^ crc_in[2] ^ current_crc[3] ^
+ crc_in[3] ^ current_crc[4] ^ crc_in[4] ^
+ current_crc[6] ^ current_crc[0] ^ crc_in[0] ^
+ crc_in[6] ^ current_crc[7] ^ current_crc[1] ^
+ crc_in[1] ^ crc_in[7];
+ next_crc[27] = current_crc[3] ^ crc_in[3] ^ current_crc[4] ^
+ crc_in[4] ^ current_crc[5] ^ crc_in[5] ^
+ current_crc[7] ^ current_crc[1] ^ crc_in[1] ^
+ crc_in[7];
+ next_crc[28] = current_crc[4] ^crc_in[4] ^ current_crc[5] ^
+ crc_in[5] ^ current_crc[6] ^ current_crc[0] ^
+ crc_in[0] ^ crc_in[6];
+ next_crc[29] = current_crc[5] ^ crc_in[5] ^ current_crc[6] ^
+ current_crc[0] ^ crc_in[0] ^ crc_in[6] ^
+ current_crc[7] ^ current_crc[1] ^ crc_in[1] ^
+ crc_in[7];
+ next_crc[30] = current_crc[6] ^ current_crc[0] ^ crc_in[0] ^
+ crc_in[6] ^ current_crc[7] ^ current_crc[1] ^
+ crc_in[1] ^ crc_in[7];
+ next_crc[31] = current_crc[7] ^ current_crc[1] ^ crc_in[1] ^
+ crc_in[7];
+ end // always
+
+assign rx_fcs[0] = current_crc[31];
+assign rx_fcs[1] = current_crc[30];
+assign rx_fcs[2] = current_crc[29];
+assign rx_fcs[3] = current_crc[28];
+assign rx_fcs[4] = current_crc[27];
+assign rx_fcs[5] = current_crc[26];
+assign rx_fcs[6] = current_crc[25];
+assign rx_fcs[7] = current_crc[24];
+assign rx_fcs[8] = current_crc[23];
+assign rx_fcs[9] = current_crc[22];
+assign rx_fcs[10] = current_crc[21];
+assign rx_fcs[11] = current_crc[20];
+assign rx_fcs[12] = current_crc[19];
+assign rx_fcs[13] = current_crc[18];
+assign rx_fcs[14] = current_crc[17];
+assign rx_fcs[15] = current_crc[16];
+assign rx_fcs[16] = current_crc[15];
+assign rx_fcs[17] = current_crc[14];
+assign rx_fcs[18] = current_crc[13];
+assign rx_fcs[19] = current_crc[12];
+assign rx_fcs[20] = current_crc[11];
+assign rx_fcs[21] = current_crc[10];
+assign rx_fcs[22] = current_crc[9];
+assign rx_fcs[23] = current_crc[8];
+assign rx_fcs[24] = current_crc[7];
+assign rx_fcs[25] = current_crc[6];
+assign rx_fcs[26] = current_crc[5];
+assign rx_fcs[27] = current_crc[4];
+assign rx_fcs[28] = current_crc[3];
+assign rx_fcs[29] = current_crc[2];
+assign rx_fcs[30] = current_crc[1];
+assign rx_fcs[31] = current_crc[0];
+
+ always @(rx_fcs)
+ begin
+ if (rx_fcs == 32'hc704dd7b)
+ crc_ok_ul = 1;
+ else
+ crc_ok_ul = 0;
+ end // always
+
+
+ assign rc2rf_crc_ok = crc_ok_ul;
+
+
+endmodule
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/verilog/rtl/gmac/crc32/g_tx_crc32.v b/verilog/rtl/gmac/crc32/g_tx_crc32.v
new file mode 100755
index 0000000..c72d65a
--- /dev/null
+++ b/verilog/rtl/gmac/crc32/g_tx_crc32.v
@@ -0,0 +1,271 @@
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Tubo 8051 cores MAC Interface Module ////
+//// ////
+//// This file is part of the Turbo 8051 cores project ////
+//// http://www.opencores.org/cores/turbo8051/ ////
+//// ////
+//// Description ////
+//// Turbo 8051 definitions. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+/***************************************************************
+ Description:
+ crc_32.v: This block contains the tx_crc32 generator.
+ CRC is generated on the tx data when gen_tx_crc asserted.
+ The 32-bit crc shift register is reset to all 1's when either
+ tx_reset_crc asserted
+
+ *********************************************************************/
+module g_tx_crc32 (
+ // List of outputs.
+ tx_fcs,
+
+ // List of inputs
+ gen_tx_crc,
+ tx_reset_crc,
+ tx_data,
+ sclk,
+ reset_n);
+
+ // defx[ine inputs and outputs.
+
+ input gen_tx_crc; // when asserted, crc is generated on the
+ // tx_data[3:0].
+ input tx_reset_crc; // when asserted, crc shift register is
+ // reset to all 1's. from link_phy_intfc.
+ input [7:0] tx_data; // trasnmit data.
+ input sclk; // serial clock from phy.
+ input reset_n; // global asynchronous reset.
+
+
+ output [31:0] tx_fcs; // 32-bit crc for tx_data. to link_phy_intfc.
+
+
+ // reg/wire declarations for primary outputs.
+ wire [31:0] tx_fcs;
+
+ // define constants and parameters here.
+
+ // define local signals here.
+
+ wire [7:0] crc_in;
+ wire gen_crc;
+ wire[7:0] tx_data_in;
+ wire carry0,carry1,carry2,carry3;
+ wire carry4,carry5,carry6,carry7;
+ reg [31:0] current_crc, next_crc;
+
+ // code starts here.
+ assign tx_data_in = tx_data;
+ assign crc_in = tx_data_in;
+
+ assign gen_crc = gen_tx_crc;
+
+ // 32-bit crc shift register for crc calculation.
+
+ always @(posedge sclk or negedge reset_n)
+ begin
+ if (!reset_n)
+ begin
+ current_crc <= 32'hffffffff;
+ end
+ else
+ begin
+ if (tx_reset_crc )
+ begin
+ current_crc <= 32'hffffffff;
+ end
+ else if (gen_crc) // generate crc
+ begin
+ current_crc <= next_crc;
+ end // else: !if(tx_reset_crc )
+ end // else: !if(reset_n)
+ end // always @ (posedge sclk or negedge reset_n)
+
+ // combinational logic to generate next_crc
+
+ always @(current_crc or crc_in)
+ begin
+
+ next_crc[0] = current_crc[8] ^ current_crc[2] ^ crc_in[2];
+ next_crc[1] = current_crc[9] ^ current_crc[0] ^ crc_in[0] ^
+ current_crc[3] ^ crc_in[3];
+ next_crc[2] = current_crc[10] ^ current_crc[0] ^ crc_in[0] ^
+ current_crc[1] ^ crc_in[1] ^ current_crc[4] ^
+ crc_in[4];
+ next_crc[3] = current_crc[11] ^ current_crc[1] ^ crc_in[1] ^
+ current_crc[2] ^ crc_in[2] ^ current_crc[5] ^
+ crc_in[5];
+ next_crc[4] = current_crc[12] ^ current_crc[2] ^ crc_in[2] ^
+ current_crc[3] ^ crc_in[3] ^ current_crc[6] ^
+ current_crc[0] ^ crc_in[0] ^ crc_in[6];
+ next_crc[5] = current_crc[13] ^ current_crc[3] ^ crc_in[3] ^
+ current_crc[4] ^ crc_in[4] ^ current_crc[7] ^
+ current_crc[1] ^ crc_in[1] ^ crc_in[7];
+ next_crc[6] = current_crc[14] ^ current_crc[4] ^ crc_in[4] ^
+ current_crc[5] ^ crc_in[5];
+ next_crc[7] = current_crc[15] ^ current_crc[5] ^ crc_in[5] ^
+ current_crc[6] ^ current_crc[0] ^ crc_in[0] ^
+ crc_in[6];
+ next_crc[8] = current_crc[16] ^ current_crc[0] ^ crc_in[0] ^
+ current_crc[6] ^ current_crc[0] ^ crc_in[0] ^
+ crc_in[6] ^ current_crc[7] ^ current_crc[1] ^
+ crc_in[1] ^ crc_in[7];
+ next_crc[9] = current_crc[17] ^ current_crc[1] ^ crc_in[1] ^
+ current_crc[7] ^ current_crc[1] ^ crc_in[1] ^
+ crc_in[7];
+ next_crc[10] = current_crc[18] ^ current_crc[2] ^ crc_in[2];
+ next_crc[11] = current_crc[19] ^ current_crc[3] ^ crc_in[3];
+ next_crc[12] = current_crc[20] ^ current_crc[0] ^ crc_in[0] ^
+ current_crc[4] ^ crc_in[4];
+ next_crc[13] = current_crc[21] ^ current_crc[0] ^ crc_in[0] ^
+ current_crc[1] ^ crc_in[1] ^ current_crc[5] ^
+ crc_in[5];
+ next_crc[14] = current_crc[22] ^ current_crc[0] ^ crc_in[0] ^
+ current_crc[1] ^ crc_in[1] ^ current_crc[2] ^
+ crc_in[2] ^ current_crc[6] ^ current_crc[0] ^
+ crc_in[0] ^ crc_in[6];
+ next_crc[15] = current_crc[23] ^ current_crc[1] ^ crc_in[1] ^
+ current_crc[2] ^ crc_in[2] ^ current_crc[3] ^
+ crc_in[3] ^ current_crc[7] ^ current_crc[1] ^
+ crc_in[1] ^ crc_in[7];
+ next_crc[16] = current_crc[24] ^ current_crc[0] ^ crc_in[0] ^
+ current_crc[2] ^ crc_in[2] ^ current_crc[3] ^
+ crc_in[3] ^ current_crc[4] ^ crc_in[4];
+ next_crc[17] = current_crc[25] ^ current_crc[0] ^ crc_in[0] ^
+ current_crc[1] ^ crc_in[1] ^ current_crc[3] ^
+ crc_in[3] ^ current_crc[4] ^ crc_in[4] ^
+ current_crc[5] ^ crc_in[5];
+ next_crc[18] = current_crc[26] ^ current_crc[1] ^ crc_in[1] ^
+ current_crc[2] ^ crc_in[2] ^ current_crc[4] ^
+ crc_in[4] ^ current_crc[5] ^ crc_in[5] ^
+ current_crc[6] ^ current_crc[0] ^ crc_in[0] ^
+ crc_in[6];
+ next_crc[19] = current_crc[27] ^ current_crc[0] ^ crc_in[0] ^
+ current_crc[2] ^ crc_in[2] ^ current_crc[3] ^
+ crc_in[3] ^ current_crc[5] ^ crc_in[5] ^
+ current_crc[6] ^ current_crc[0] ^ crc_in[0] ^
+ crc_in[6] ^ current_crc[7] ^ current_crc[1] ^
+ crc_in[1] ^ crc_in[7];
+ next_crc[20] = current_crc[28] ^ current_crc[0] ^ crc_in[0] ^
+ current_crc[1] ^ crc_in[1] ^ current_crc[3] ^
+ crc_in[3] ^ current_crc[4] ^ crc_in[4] ^
+ current_crc[6] ^ current_crc[0] ^ crc_in[0] ^
+ crc_in[6] ^ current_crc[7] ^ current_crc[1] ^
+ crc_in[1] ^ crc_in[7];
+ next_crc[21] = current_crc[29] ^ current_crc[1] ^ crc_in[1] ^
+ current_crc[2] ^ crc_in[2] ^ current_crc[4] ^
+ crc_in[4] ^ current_crc[5] ^ crc_in[5] ^
+ current_crc[7] ^ current_crc[1] ^ crc_in[1] ^
+ crc_in[7];
+ next_crc[22] = current_crc[30] ^ current_crc[0] ^ crc_in[0] ^
+ current_crc[2] ^ crc_in[2] ^ current_crc[3] ^
+ crc_in[3] ^ current_crc[5] ^ crc_in[5] ^
+ current_crc[6] ^ current_crc[0] ^ crc_in[0] ^
+ crc_in[6];
+ next_crc[23] = current_crc[31] ^ current_crc[0] ^ crc_in[0] ^
+ current_crc[1] ^ crc_in[1] ^ current_crc[3] ^
+ crc_in[3] ^ current_crc[4] ^ crc_in[4] ^
+ current_crc[6] ^ current_crc[0] ^ crc_in[0] ^
+ crc_in[6] ^ current_crc[7] ^ current_crc[1] ^
+ crc_in[1] ^ crc_in[7];
+ next_crc[24] = current_crc[0] ^ crc_in[0] ^ current_crc[1] ^
+ crc_in[1] ^ current_crc[2] ^ crc_in[2] ^
+ current_crc[4] ^ crc_in[4] ^ current_crc[5] ^
+ crc_in[5] ^ current_crc[7] ^ current_crc[1] ^
+ crc_in[1] ^ crc_in[7];
+ next_crc[25] = current_crc[1] ^ crc_in[1] ^ current_crc[2] ^
+ crc_in[2] ^ current_crc[3] ^ crc_in[3] ^
+ current_crc[5] ^ crc_in[5] ^ current_crc[6] ^
+ current_crc[0] ^ crc_in[0] ^ crc_in[6];
+ next_crc[26] = current_crc[2] ^ crc_in[2] ^ current_crc[3] ^
+ crc_in[3] ^ current_crc[4] ^ crc_in[4] ^
+ current_crc[6] ^ current_crc[0] ^ crc_in[0] ^
+ crc_in[6] ^ current_crc[7] ^ current_crc[1] ^
+ crc_in[1] ^ crc_in[7];
+ next_crc[27] = current_crc[3] ^ crc_in[3] ^ current_crc[4] ^
+ crc_in[4] ^ current_crc[5] ^ crc_in[5] ^
+ current_crc[7] ^ current_crc[1] ^ crc_in[1] ^
+ crc_in[7];
+ next_crc[28] = current_crc[4] ^crc_in[4] ^ current_crc[5] ^
+ crc_in[5] ^ current_crc[6] ^ current_crc[0] ^
+ crc_in[0] ^ crc_in[6];
+ next_crc[29] = current_crc[5] ^ crc_in[5] ^ current_crc[6] ^
+ current_crc[0] ^ crc_in[0] ^ crc_in[6] ^
+ current_crc[7] ^ current_crc[1] ^ crc_in[1] ^
+ crc_in[7];
+ next_crc[30] = current_crc[6] ^ current_crc[0] ^ crc_in[0] ^
+ crc_in[6] ^ current_crc[7] ^ current_crc[1] ^
+ crc_in[1] ^ crc_in[7];
+ next_crc[31] = current_crc[7] ^ current_crc[1] ^ crc_in[1] ^
+ crc_in[7];
+ end // always
+
+// assign tx_fcs = ~current_crc;
+ assign tx_fcs[0] = !current_crc[0];
+ assign tx_fcs[1] = !current_crc[1];
+ assign tx_fcs[2] = !current_crc[2];
+ assign tx_fcs[3] = !current_crc[3];
+ assign tx_fcs[4] = !current_crc[4];
+ assign tx_fcs[5] = !current_crc[5];
+ assign tx_fcs[6] = !current_crc[6];
+ assign tx_fcs[7] = !current_crc[7];
+ assign tx_fcs[8] = !current_crc[8];
+ assign tx_fcs[9] = !current_crc[9];
+ assign tx_fcs[10] = !current_crc[10];
+ assign tx_fcs[11] = !current_crc[11];
+ assign tx_fcs[12] = !current_crc[12];
+ assign tx_fcs[13] = !current_crc[13];
+ assign tx_fcs[14] = !current_crc[14];
+ assign tx_fcs[15] = !current_crc[15];
+ assign tx_fcs[16] = !current_crc[16];
+ assign tx_fcs[17] = !current_crc[17];
+ assign tx_fcs[18] = !current_crc[18];
+ assign tx_fcs[19] = !current_crc[19];
+ assign tx_fcs[20] = !current_crc[20];
+ assign tx_fcs[21] = !current_crc[21];
+ assign tx_fcs[22] = !current_crc[22];
+ assign tx_fcs[23] = !current_crc[23];
+ assign tx_fcs[24] = !current_crc[24];
+ assign tx_fcs[25] = !current_crc[25];
+ assign tx_fcs[26] = !current_crc[26];
+ assign tx_fcs[27] = !current_crc[27];
+ assign tx_fcs[28] = !current_crc[28];
+ assign tx_fcs[29] = !current_crc[29];
+ assign tx_fcs[30] = !current_crc[30];
+ assign tx_fcs[31] = !current_crc[31];
+
+endmodule
diff --git a/verilog/rtl/gmac/ctrl/eth_parser.v b/verilog/rtl/gmac/ctrl/eth_parser.v
new file mode 100644
index 0000000..0361a61
--- /dev/null
+++ b/verilog/rtl/gmac/ctrl/eth_parser.v
@@ -0,0 +1,302 @@
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Tubo 8051 cores MAC Interface Module ////
+//// ////
+//// This file is part of the Turbo 8051 cores project ////
+//// http://www.opencores.org/cores/turbo8051/ ////
+//// ////
+//// Description ////
+//// Turbo 8051 definitions. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : Mar 2, 2011 ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+// ------------------------------------------------------------------------
+// Description :
+// This module instantiates the Eth/Arp/IP/TCP/UDP Packet Parser
+//
+// ------------------------------------------------------------------------
+module g_eth_parser (
+ s_reset_n,
+ app_clk,
+
+ // Configuration
+ cfg_filters,
+ cfg_mac_sa,
+ cfg_ip_sa,
+
+ // Input Control Information
+ eop,
+ dval,
+ data,
+
+ // output status
+ pkt_done,
+ pkt_len,
+ pkt_status,
+ pkt_drop_ind,
+ pkt_drop_reason
+ );
+
+//------------------------------
+// Global Input signal
+//------------------------------
+input s_reset_n; // Active low reset signal
+input app_clk ; // Application clock
+
+//------------------------------
+// Configuration
+//------------------------------
+input [31:0] cfg_filters; // Filter rules
+ // [0] - filtering enabled
+ // [1] - allow local mac-da only
+ // [2] - allow local mac-da only + IP4 local ip-da
+ // [3] - allow local mac-da only + IP4 local ip-da + TCP
+ // [4] - allow local mac-da only + IP4 local ip-da + UDP
+ // [5] - allow local mac-da only + IP4 local ip-da + ICMP
+ // [6] - allow local mac-da only + ARP
+
+input [47:0] cfg_mac_sa; // 48 bit mac DA
+input [31:0] cfg_ip_sa; // 32 bit IP DA
+
+//---------------------------
+// Input Control Information
+//---------------------------
+input eop;
+input dval;
+input [7:0] data;
+
+//-----------------------------
+// output status
+//-----------------------------
+output [11:0] pkt_len; // Packet Length
+output pkt_done; // Packet Processing done indication
+output [15:0] pkt_status; // packet processing status
+ // [1:0] - MAC-DA
+ // 2'b00 - Broadcast frame
+ // 2'b01 - Multicast frame
+ // 2'b10 - unicast frame, other than local DA
+ // 2'b11 - unicast local DA frame
+ // [3:2] - MAC-SA
+ // 2'b00 - Broadcast frame
+ // 2'b01 - Multicast frame
+ // 2'b10 - unicast frame, other than local DA
+ // 2'b11 - unicast local DA frame
+ // [6:4] - 3'b000 - Unknown Ethernet frame
+ // 3'b001 - IP4 Frame
+ // 3'b010 - IP4 Frame + TCP
+ // 3'b011 - IP4 Frame + UDP
+ // 3'b100 - IP4 Frame + ICMP
+ // 3'b101 - ARP frame
+output pkt_drop_ind; // Packet Drop Inidcation
+
+output [7:0] pkt_drop_reason; // Reason for Frame Drop
+ // [0] - Non Local DA
+ // [1] - Local DA == Remote SA
+ // [2] - Non Local IP-DA
+ // [3] - Local IP-DA == Remote IP-SA
+ // [4] - Not Valid IP4/TCP/UDP/ARP/ICMP Frame
+ // [5] - L2 Check sum error
+ // [6] - L3 Check Sum Error
+ // [7] - L4 Check Sum Error
+
+reg [11:0] bcnt ; // Byte counter
+reg [11:0] pkt_len ; // packet length
+reg pkt_done ; // packet complete indication + Packet Status Valid
+reg pkt_drop_ind ;
+
+
+always @(negedge s_reset_n or posedge app_clk) begin
+ if(s_reset_n == 1'b0) begin
+ bcnt <= 0;
+ pkt_len <= 0;
+ pkt_done <= 0;
+ pkt_drop_ind <= 0;
+ end
+ else begin
+ if(dval) begin
+ if(eop) begin
+ bcnt <= 0;
+ pkt_len <= bcnt +1;
+ pkt_done <= 1;
+ end else begin
+ bcnt <= bcnt +1;
+ pkt_done <= 0;
+ end
+ end else begin
+ pkt_done <= 0;
+ end
+ end
+end
+
+reg mac_da_bc ; // frame da is broad cast
+reg mac_da_mc ; // frame da is multicast
+reg mac_da_match ; // frame da match to local address
+reg mac_sa_bc ; // frame sa is broadcast
+reg mac_sa_mc ; // frame sa is multicast
+reg mac_sa_match ; // frame sa match to local address
+reg ipv4f ; // frame is ipv4
+reg arpf ; // frame is arp
+reg tcpf ; // frame is tcp
+reg udpf ; // frame is udp
+reg ip_sa_match ; // ip4 sa matches to local IP Address
+reg ip_da_match ; // ip4 da matches to local IP Address
+reg[15:0] pkt_status ; // Packet Status
+
+always @(negedge s_reset_n or posedge app_clk) begin
+ if(s_reset_n == 1'b0) begin
+ mac_da_bc <= 0;
+ mac_da_mc <= 0;
+ mac_da_match <= 0;
+ mac_sa_bc <= 0;
+ mac_sa_mc <= 0;
+ mac_sa_match <= 0;
+ ipv4f <= 0;
+ arpf <= 0;
+ tcpf <= 0;
+ udpf <= 0;
+ ip_sa_match <= 0;
+ ip_da_match <= 0;
+ pkt_status <= 0;
+ end
+ else begin
+ if(dval) begin
+ if(!eop) begin
+ // DA Analysis
+ // Broadcast Frame
+ mac_da_bc <= (bcnt == 0) ? (data == 8'hff) :
+ (bcnt == 1) ? (data == 8'hff) & mac_da_bc :
+ (bcnt == 2) ? (data == 8'hff) & mac_da_bc :
+ (bcnt == 3) ? (data == 8'hff) & mac_da_bc :
+ (bcnt == 4) ? (data == 8'hff) & mac_da_bc :
+ (bcnt == 5) ? (data == 8'hff) & mac_da_bc : mac_da_bc;
+ // multicast frame
+ mac_da_mc <= (bcnt == 0) ? (data[7] == 1'b1) : mac_da_mc & !mac_da_bc;
+
+ // local unicast frame
+ mac_da_match <= (bcnt == 0) ? (cfg_mac_sa[7:0] == data) :
+ (bcnt == 1) ? (cfg_mac_sa[15:8] == data) & mac_da_match :
+ (bcnt == 2) ? (cfg_mac_sa[23:16] == data) & mac_da_match :
+ (bcnt == 3) ? (cfg_mac_sa[31:24] == data) & mac_da_match :
+ (bcnt == 4) ? (cfg_mac_sa[39:32] == data) & mac_da_match :
+ (bcnt == 5) ? (cfg_mac_sa[47:40] == data) & mac_da_match :
+ mac_da_match;
+
+
+ // SA Analysis
+ mac_sa_bc <= (bcnt == 6) ? (data == 8'hff) :
+ (bcnt == 7) ? (data == 8'hff) & mac_sa_bc :
+ (bcnt == 8) ? (data == 8'hff) & mac_sa_bc :
+ (bcnt == 9) ? (data == 8'hff) & mac_sa_bc :
+ (bcnt == 10) ? (data == 8'hff) & mac_sa_bc :
+ (bcnt == 11) ? (data == 8'hff) & mac_sa_bc : mac_sa_bc;
+
+ mac_sa_mc <= (bcnt == 6) ? (data[7] == 1'b1) : mac_sa_mc & !mac_sa_bc;
+
+ mac_sa_match <= (bcnt == 6) ? (cfg_mac_sa[7:0] == data) :
+ (bcnt == 7) ? (cfg_mac_sa[15:8] == data) & mac_sa_match :
+ (bcnt == 8) ? (cfg_mac_sa[23:16] == data) & mac_sa_match :
+ (bcnt == 9) ? (cfg_mac_sa[31:24] == data) & mac_sa_match :
+ (bcnt == 10) ? (cfg_mac_sa[39:32] == data) & mac_sa_match :
+ (bcnt == 11) ? (cfg_mac_sa[47:40] == data) & mac_sa_match :
+ mac_sa_match;
+
+ // L3 Protocol Analysis
+ ipv4f <= (bcnt == 12) ? (data == 8'h08) :
+ (bcnt == 13) ? (data == 8'h00) & ipv4f : ipv4f;
+
+ arpf <= (bcnt == 12) ? (data == 8'h08) :
+ (bcnt == 13) ? (data == 8'h06) & arpf : arpf;
+ // L4 Protocol Analysis
+ tcpf <= (bcnt == 23) ? (data == 8'h06) & ipv4f: tcpf;
+ udpf <= (bcnt == 23) ? (data == 8'h11) & ipv4f: udpf;
+ // IP DA and SA Match
+ ip_sa_match <= (bcnt == 26) ? (data == cfg_ip_sa[7:0]) & ipv4f:
+ (bcnt == 27) ? (data == cfg_ip_sa[15:8]) & ipv4f & ip_sa_match:
+ (bcnt == 28) ? (data == cfg_ip_sa[23:16]) & ipv4f & ip_sa_match:
+ (bcnt == 29) ? (data == cfg_ip_sa[31:24]) & ipv4f & ip_sa_match:
+ ip_sa_match;
+ ip_da_match <= (bcnt == 26) ? (data == cfg_ip_sa[7:0]) & ipv4f:
+ (bcnt == 27) ? (data == cfg_ip_sa[15:8]) & ipv4f & ip_da_match:
+ (bcnt == 28) ? (data == cfg_ip_sa[23:16]) & ipv4f & ip_da_match:
+ (bcnt == 29) ? (data == cfg_ip_sa[31:24]) & ipv4f & ip_da_match:
+ ip_da_match;
+
+ end else begin // on EOP
+
+ if(&mac_da_match) begin
+ pkt_status[1:0] <= 2'b11; // Local DA
+ end else if(mac_da_bc) begin
+ pkt_status[1:0] <= 2'b00; // Broadcast frame
+ end else if(mac_da_mc) begin
+ pkt_status[1:0] <= 2'b01; // Multicase frame
+ end else
+ pkt_status[1:0] <= 2'b10; // Unknown Unicast frame
+
+ if(&mac_sa_match) begin
+ pkt_status[3:2] <= 2'b11; // Local DA
+ end else if(mac_sa_bc) begin
+ pkt_status[3:2] <= 2'b00; // Broadcast frame
+ end else if(mac_sa_mc) begin
+ pkt_status[3:2] <= 2'b01; // Multicast frame
+ end else
+ pkt_status[3:2] <= 2'b10; // Unknown Unicast frame
+
+ if(tcpf) begin
+ pkt_status[6:4] <= 3'b010; // IP4 Frame + TCP
+ end else if(udpf) begin
+ pkt_status[6:4] <= 3'b011; // IP4 Frame + UDP
+ end else if(arpf) begin
+ pkt_status[6:4] <= 3'b101; // ARP frame
+ end else
+ pkt_status[6:4] <= 2'b00; // UnKnown Ethernet frame
+
+ mac_da_match <= 0;
+ mac_sa_match <= 0;
+ mac_sa_bc <= 0;
+ mac_sa_mc <= 0;
+ mac_da_bc <= 0;
+ mac_da_mc <= 0;
+ tcpf <= 0;
+ udpf <= 0;
+ arpf <= 0;
+ ipv4f <= 0;
+ end
+ end
+ end
+end
+
+
+endmodule
diff --git a/verilog/rtl/gmac/mac/byte_reg.v b/verilog/rtl/gmac/mac/byte_reg.v
new file mode 100755
index 0000000..693fe0e
--- /dev/null
+++ b/verilog/rtl/gmac/mac/byte_reg.v
@@ -0,0 +1,81 @@
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Tubo 8051 cores MAC Interface Module ////
+//// ////
+//// This file is part of the Turbo 8051 cores project ////
+//// http://www.opencores.org/cores/turbo8051/ ////
+//// ////
+//// Description ////
+//// Turbo 8051 definitions. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : Mar 2, 2011 ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+/***************************************************************
+ Description:
+ byte_reg.v: instantiates 32 registers to make a quad
+ This enables maintaining timing on blocks
+ in check
+***********************************************************************/
+module half_dup_byte_reg(
+ //List of Inputs
+ we,
+ data_in,
+ reset_n,
+ clk,
+
+ //List of Outputs
+ data_out
+);
+
+ input [7:0] we;
+ input [7:0] data_in;
+ input reset_n;
+ input clk;
+ output [7:0] data_out;
+
+
+ generic_register #(8,0) u_reg (
+
+ .we (we),
+ .clk (clk),
+ .reset_n (reset_n),
+ .data_in (data_in),
+ .data_out (data_out)
+ );
+
+
+endmodule
+
diff --git a/verilog/rtl/gmac/mac/dble_reg.v b/verilog/rtl/gmac/mac/dble_reg.v
new file mode 100755
index 0000000..dcc6e36
--- /dev/null
+++ b/verilog/rtl/gmac/mac/dble_reg.v
@@ -0,0 +1,91 @@
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Tubo 8051 cores MAC Interface Module ////
+//// ////
+//// This file is part of the Turbo 8051 cores project ////
+//// http://www.opencores.org/cores/turbo8051/ ////
+//// ////
+//// Description ////
+//// Turbo 8051 definitions. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : Mar 2, 2011 ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+/***************************************************************
+ Description:
+ Synchronizes the pulse from one clock to another
+ * clock domain
+***********************************************************************/
+module half_dup_dble_reg (
+ //outputs
+ sync_out_pulse,
+ //inputs
+ in_pulse,
+ dest_clk,
+ reset_n);
+
+ output sync_out_pulse; //output synchronised to slow clock
+ input in_pulse; //input based on fast clock, pulse
+ input dest_clk; //slow clock
+ input reset_n;
+
+ reg s1_sync_out,d_sync_out,s2_sync_out;
+
+ //double register the data in the slow clock domain
+ always @(posedge dest_clk or negedge reset_n)
+ begin
+ if (!reset_n)
+ begin
+ s1_sync_out <= 0;
+ s2_sync_out <= 0;
+ d_sync_out <= 0;
+ end // if (reset_n)
+ else
+ begin
+ s1_sync_out <= in_pulse;
+ s2_sync_out <= s1_sync_out;
+ d_sync_out <= s2_sync_out;
+ end // else: !if(reset_n)
+ end // always @ (posedge dest_clk or negedge reset_n)
+
+ assign sync_out_pulse = d_sync_out;
+
+endmodule // dble_reg
+
+
+
+
+
+
diff --git a/verilog/rtl/gmac/mac/filelist_mac.f b/verilog/rtl/gmac/mac/filelist_mac.f
new file mode 100644
index 0000000..a7362ea
--- /dev/null
+++ b/verilog/rtl/gmac/mac/filelist_mac.f
@@ -0,0 +1,19 @@
+dble_reg.v
+g_tx_fsm.v
+g_deferral.v
+g_tx_top.v
+g_rx_fsm.v
+g_cfg_mgmt.v
+s2f_sync.v
+g_md_intf.v
+g_deferral_rx.v
+g_rx_top.v
+g_mii_intf.v
+g_mac_core.v
+../crc32/g_rx_crc32.v
+../crc32/g_tx_crc32.v
+-v ../../lib/registers.v
+-v ../../lib/toggle_sync.v
+-v ../../lib/stat_counter.v
++lint=all
++v2k
diff --git a/verilog/rtl/gmac/mac/g_cfg_mgmt.v b/verilog/rtl/gmac/mac/g_cfg_mgmt.v
new file mode 100755
index 0000000..3943cfc
--- /dev/null
+++ b/verilog/rtl/gmac/mac/g_cfg_mgmt.v
@@ -0,0 +1,981 @@
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Tubo 8051 cores MAC Interface Module ////
+//// ////
+//// This file is part of the Turbo 8051 cores project ////
+//// http://www.opencores.org/cores/turbo8051/ ////
+//// ////
+//// Description ////
+//// Turbo 8051 definitions. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : Mar 2, 2011 ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+/***************************************************************
+ Description:
+ cfg_mgmt.v: contains the configuration, register information, Application
+ read from any location. But can write to a limited set of locations,
+ Please refer to the design data sheets for register locations
+***********************************************************************/
+module g_cfg_mgmt (
+ //List of Inputs
+
+ // Reg Bus Interface Signal
+ reg_cs,
+ reg_wr,
+ reg_addr,
+ reg_wdata,
+ reg_be,
+
+ // Outputs
+ reg_rdata,
+ reg_ack,
+
+ // Rx Status
+ rx_sts_vld,
+ rx_sts,
+
+ // Rx Status
+ tx_sts_vld,
+ tx_sts,
+
+ // MDIO READ DATA FROM PHY
+ md2cf_cmd_done,
+ md2cf_status,
+ md2cf_data,
+
+ app_clk,
+ app_reset_n,
+
+ //List of Outputs
+ // MII Control
+ cf2mi_loopback_en,
+ cf_mac_mode,
+ cf_chk_rx_dfl,
+ cf2mi_rmii_en,
+
+ cfg_uni_mac_mode_change_i,
+
+ //CHANNEL enable
+ cf2tx_ch_en,
+ //CHANNEL CONTROL TX
+ cf_silent_mode,
+ cf2df_dfl_single,
+ cf2df_dfl_single_rx,
+ cf2tx_pad_enable,
+ cf2tx_append_fcs,
+ //CHANNEL CONTROL RX
+ cf2rx_ch_en,
+ cf2rx_strp_pad_en,
+ cf2rx_snd_crc,
+ cf2rx_runt_pkt_en,
+ cf_mac_sa,
+ cfg_ip_sa,
+ cfg_mac_filter,
+
+ cf2rx_max_pkt_sz,
+ cf2tx_force_bad_fcs,
+ //MDIO CONTROL & DATA
+ cf2md_datain,
+ cf2md_regad,
+ cf2md_phyad,
+ cf2md_op,
+ cf2md_go,
+
+ rx_buf_base_addr,
+ tx_buf_base_addr,
+ rx_buf_qbase_addr,
+ tx_buf_qbase_addr,
+
+ tx_qcnt_inc,
+ tx_qcnt_dec,
+ tx_qcnt,
+
+ rx_qcnt_inc,
+ rx_qcnt_dec,
+ rx_qcnt
+
+ );
+
+ parameter mac_mdio_en = 1'b1;
+
+
+ //pin out definations
+ //---------------------------------
+ // Reg Bus Interface Signal
+ //---------------------------------
+ input reg_cs ;
+ input reg_wr ;
+ input [3:0] reg_addr ;
+ input [31:0] reg_wdata ;
+ input [3:0] reg_be ;
+
+ // Outputs
+ output [31:0] reg_rdata ;
+ output reg_ack ;
+
+ input rx_sts_vld ; // rx status valid indication, sync w.r.t app clk
+ input [7:0] rx_sts ; // rx status bits
+
+ input tx_sts_vld ; // tx status valid indication, sync w.r.t app clk
+ input tx_sts ; // tx status bits
+
+ //List of Inputs
+
+ input app_clk ;
+ input app_reset_n ;
+ input md2cf_cmd_done ; // Read/Write MDIO completed
+ input md2cf_status ; // MDIO transfer error
+ input [15:0] md2cf_data ; // Data from PHY for a
+ // mdio read access
+
+
+ //List of Outputs
+ output cf2mi_rmii_en ; // Working in RMII when set to 1
+ output cf_mac_mode ; // mac mode set this to 1 for 100Mbs/10Mbs
+ output cf_chk_rx_dfl ; // Check for RX Deferal
+ output [47:0] cf_mac_sa ;
+ output [31:0] cfg_ip_sa ;
+ output [31:0] cfg_mac_filter ;
+ output cf2tx_ch_en ; //enable the TX channel
+ output cf_silent_mode ; //PHY Inactive
+ output [7:0] cf2df_dfl_single ; //number of clk ticks for dfl
+ output [7:0] cf2df_dfl_single_rx ; //number of clk ticks for dfl
+
+ output cf2tx_pad_enable ; //enable padding, < 64 bytes
+ output cf2tx_append_fcs ; //append CRC for TX frames
+ output cf2rx_ch_en ; //Enable RX channel
+ output cf2rx_strp_pad_en ; //strip the padded bytes on RX frame
+ output cf2rx_snd_crc ; //send FCS to application, else strip
+ //the FCS before sending to application
+ output cf2mi_loopback_en ; // TX to RX loop back enable
+ output cf2rx_runt_pkt_en ; //don't throw packets less than 64 bytes
+ output [15:0] cf2md_datain ;
+ output [4:0] cf2md_regad ;
+ output [4:0] cf2md_phyad ;
+ output cf2md_op ;
+ output cf2md_go ;
+
+ output [15:0] cf2rx_max_pkt_sz ; //max rx packet size
+ output cf2tx_force_bad_fcs ; //force bad fcs on tx
+
+ output cfg_uni_mac_mode_change_i;
+
+ output [3:0] rx_buf_base_addr; // Rx Data Buffer Base Address
+ output [3:0] tx_buf_base_addr; // Tx Data Buffer Base Address
+ output [9:0] rx_buf_qbase_addr; // Rx Q Base Address
+ output [9:0] tx_buf_qbase_addr; // Tx Q Base Address
+
+ input tx_qcnt_inc;
+ input tx_qcnt_dec;
+ output [3:0] tx_qcnt;
+
+ input rx_qcnt_inc;
+ input rx_qcnt_dec;
+ output [3:0] rx_qcnt;
+
+
+// Wire assignments for output signals
+ wire [15:0] cf2md_datain;
+ wire [4:0] cf2md_regad;
+ wire [4:0] cf2md_phyad;
+ wire cf2md_op;
+ wire cf2md_go;
+ wire mdio_cmd_done_sync;
+
+ wire int_mdio_cmd_done_sync;
+ assign mdio_cmd_done_sync = (mac_mdio_en) ? int_mdio_cmd_done_sync : 1'b0;
+
+ s2f_sync U1_s2f_sync ( .sync_out_pulse(int_mdio_cmd_done_sync),
+ .in_pulse(md2cf_cmd_done),
+ .dest_clk(app_clk),
+ .reset_n(app_reset_n));
+
+
+
+// Wire and Reg assignments for local signals
+ reg int_md2cf_status;
+ wire [7:0] mac_mode_out;
+ wire [7:0] mac_cntrl_out_1, mac_cntrl_out_2;
+ wire [7:0] dfl_params_rx_out;
+ wire [7:0] dfl_params1_out;
+ wire [7:0] slottime_out_1;
+ wire [7:0] slottime_out_2;
+ wire [31:0] mdio_cmd_out;
+ wire [7:0] mdio_stat_out_1;
+ wire [7:0] mdio_stat_out_2;
+ wire [7:0] mdio_stat_out_3;
+ wire [7:0] mdio_stat_out_4;
+ wire [7:0] mdio_cmd_out_1;
+ wire [7:0] mdio_cmd_out_2;
+ wire [7:0] mdio_cmd_out_3;
+ wire [7:0] mdio_cmd_out_4;
+ wire [7:0] mac_sa_out_1;
+ wire [7:0] mac_sa_out_2;
+ wire [7:0] mac_sa_out_3;
+ wire [7:0] mac_sa_out_4;
+ wire [7:0] mac_sa_out_5;
+ wire [7:0] mac_sa_out_6;
+ wire [47:0] cf_mac_sa;
+ wire [15:0] cf2rx_max_pkt_sz;
+ wire cf2tx_force_bad_fcs;
+ reg force_bad_fcs;
+ reg cont_force_bad_fcs;
+ wire [31:0] mdio_stat_out;
+ reg cf2tx_force_bad_fcs_en;
+ reg cf2tx_cont_force_bad_fcs_en;
+ reg [15:0] int_mdio_stat_out;
+
+//-----------------------------------------------------------------------
+// Internal Wire Declarations
+//-----------------------------------------------------------------------
+
+wire sw_rd_en;
+wire sw_wr_en;
+wire [3:0] sw_addr ; // addressing 16 registers
+wire [3:0] wr_be ;
+
+reg [31:0] reg_rdata ;
+reg reg_ack ;
+
+wire [31:0] reg_0; // Software_Reg_0
+wire [31:0] reg_1; // Software-Reg_1
+wire [31:0] reg_2; // Software-Reg_2
+wire [31:0] reg_3; // Software-Reg_3
+wire [31:0] reg_4; // Software-Reg_4
+wire [31:0] reg_5; // Software-Reg_5
+wire [31:0] reg_6; // Software-Reg_6
+wire [31:0] reg_7; // Software-Reg_7
+wire [31:0] reg_8; // Software-Reg_8
+wire [31:0] reg_9; // Software-Reg_9
+wire [31:0] reg_10; // Software-Reg_10
+wire [31:0] reg_11; // Software-Reg_11
+wire [31:0] reg_12; // Software-Reg_12
+wire [31:0] reg_13; // Software-Reg_13
+wire [31:0] reg_14; // Software-Reg_14
+wire [31:0] reg_15; // Software-Reg_15
+reg [31:0] reg_out;
+
+//-----------------------------------------------------------------------
+// Internal Logic Starts here
+//-----------------------------------------------------------------------
+ assign sw_addr = reg_addr [3:0];
+ assign sw_rd_en = reg_cs & !reg_wr;
+ assign sw_wr_en = reg_cs & reg_wr;
+ assign wr_be = reg_be;
+
+
+//-----------------------------------------------------------------------
+// Read path mux
+//-----------------------------------------------------------------------
+
+always @ (posedge app_clk or negedge app_reset_n)
+begin : preg_out_Seq
+ if (app_reset_n == 1'b0)
+ begin
+ reg_rdata [31:0] <= 32'h0000_0000;
+ reg_ack <= 1'b0;
+ end
+ else if (sw_rd_en && !reg_ack)
+ begin
+ reg_rdata [31:0] <= reg_out [31:0];
+ reg_ack <= 1'b1;
+ end
+ else if (sw_wr_en && !reg_ack)
+ reg_ack <= 1'b1;
+ else
+ begin
+ reg_ack <= 1'b0;
+ end
+end
+
+
+//-----------------------------------------------------------------------
+// register read enable and write enable decoding logic
+//-----------------------------------------------------------------------
+wire sw_wr_en_0 = sw_wr_en & (sw_addr == 4'h0);
+wire sw_rd_en_0 = sw_rd_en & (sw_addr == 4'h0);
+wire sw_wr_en_1 = sw_wr_en & (sw_addr == 4'h1);
+wire sw_rd_en_1 = sw_rd_en & (sw_addr == 4'h1);
+wire sw_wr_en_2 = sw_wr_en & (sw_addr == 4'h2);
+wire sw_rd_en_2 = sw_rd_en & (sw_addr == 4'h2);
+wire sw_wr_en_3 = sw_wr_en & (sw_addr == 4'h3);
+wire sw_rd_en_3 = sw_rd_en & (sw_addr == 4'h3);
+wire sw_wr_en_4 = sw_wr_en & (sw_addr == 4'h4);
+wire sw_rd_en_4 = sw_rd_en & (sw_addr == 4'h4);
+wire sw_wr_en_5 = sw_wr_en & (sw_addr == 4'h5);
+wire sw_rd_en_5 = sw_rd_en & (sw_addr == 4'h5);
+wire sw_wr_en_6 = sw_wr_en & (sw_addr == 4'h6);
+wire sw_rd_en_6 = sw_rd_en & (sw_addr == 4'h6);
+wire sw_wr_en_7 = sw_wr_en & (sw_addr == 4'h7);
+wire sw_rd_en_7 = sw_rd_en & (sw_addr == 4'h7);
+wire sw_wr_en_8 = sw_wr_en & (sw_addr == 4'h8);
+wire sw_rd_en_8 = sw_rd_en & (sw_addr == 4'h8);
+wire sw_wr_en_9 = sw_wr_en & (sw_addr == 4'h9);
+wire sw_rd_en_9 = sw_rd_en & (sw_addr == 4'h9);
+wire sw_wr_en_10 = sw_wr_en & (sw_addr == 4'hA);
+wire sw_rd_en_10 = sw_rd_en & (sw_addr == 4'hA);
+wire sw_wr_en_11 = sw_wr_en & (sw_addr == 4'hB);
+wire sw_rd_en_11 = sw_rd_en & (sw_addr == 4'hB);
+wire sw_wr_en_12 = sw_wr_en & (sw_addr == 4'hC);
+wire sw_rd_en_12 = sw_rd_en & (sw_addr == 4'hC);
+wire sw_wr_en_13 = sw_wr_en & (sw_addr == 4'hD);
+wire sw_rd_en_13 = sw_rd_en & (sw_addr == 4'hD);
+wire sw_wr_en_14 = sw_wr_en & (sw_addr == 4'hE);
+wire sw_rd_en_14 = sw_rd_en & (sw_addr == 4'hE);
+wire sw_wr_en_15 = sw_wr_en & (sw_addr == 4'hF);
+wire sw_rd_en_15 = sw_rd_en & (sw_addr == 4'hF);
+
+
+always @( *)
+begin : preg_sel_Com
+
+ reg_out [31:0] = 32'd0;
+
+ case (sw_addr [3:0])
+ 4'b0000 : reg_out [31:0] = reg_0 [31:0];
+ 4'b0001 : reg_out [31:0] = reg_1 [31:0];
+ 4'b0010 : reg_out [31:0] = reg_2 [31:0];
+ 4'b0011 : reg_out [31:0] = reg_3 [31:0];
+ 4'b0100 : reg_out [31:0] = reg_4 [31:0];
+ 4'b0101 : reg_out [31:0] = reg_5 [31:0];
+ 4'b0110 : reg_out [31:0] = reg_6 [31:0];
+ 4'b0111 : reg_out [31:0] = reg_7 [31:0];
+ 4'b1000 : reg_out [31:0] = reg_8 [31:0];
+ 4'b1001 : reg_out [31:0] = reg_9 [31:0];
+ 4'b1010 : reg_out [31:0] = reg_10 [31:0];
+ 4'b1011 : reg_out [31:0] = reg_11 [31:0];
+ 4'b1100 : reg_out [31:0] = reg_12 [31:0];
+ 4'b1101 : reg_out [31:0] = reg_13 [31:0];
+ 4'b1110 : reg_out [31:0] = reg_14 [31:0];
+ 4'b1111 : reg_out [31:0] = reg_15 [31:0];
+ endcase
+end
+
+
+ //instantiate all the registers
+
+ //========================================================================//
+ // TX_CNTRL_REGISTER : Address value 00H
+ // BIT[0] = Transmit Channel Enable
+ // BIT[1] = DONT CARE
+ // BIT[2] = Retry Packet in case of Collisions
+ // BIT[3] = Enable padding
+ // BIT[4] = Append CRC
+ // BIT[5] = Perform a Two Part Deferral
+ // BIT[6] = RMII Enable bit
+ // BIT[7] = Force TX FCS Error
+
+
+generic_register #(8,0 ) u_mac_cntrl_reg_1 (
+ .we ({8{sw_wr_en_0 &
+ wr_be[0] }}),
+ .data_in (reg_wdata[7:0] ),
+ .reset_n (app_reset_n ),
+ .clk (app_clk ),
+
+ //List of Outs
+ .data_out (mac_cntrl_out_1[7:0] )
+ );
+
+generic_register #(8,0 ) u_mac_cntrl_reg_2 (
+ .we ({8{sw_wr_en_0 &
+ wr_be[1]}} ),
+ .data_in (reg_wdata[15:8] ),
+ .reset_n (app_reset_n ),
+ .clk (app_clk ),
+
+ //List of Outs
+ .data_out (mac_cntrl_out_2[7:0] )
+ );
+
+ generic_register #(8,0 ) u_mac_cntrl_reg_3 (
+ .we ({8{sw_wr_en_0 & wr_be[2] }}),
+ .data_in (reg_wdata[23:16] ),
+ .reset_n (app_reset_n ),
+ .clk (app_clk ),
+
+ //List of Outs
+ .data_out ({tx_buf_base_addr[3:0],
+ rx_buf_base_addr[3:0]} )
+ );
+
+
+ // TX Control Register
+ assign cf2tx_ch_en = mac_cntrl_out_1[0];
+ assign cf2tx_pad_enable = mac_cntrl_out_1[3];
+ assign cf2tx_append_fcs = mac_cntrl_out_1[4];
+ assign cf2tx_force_bad_fcs = mac_cntrl_out_1[7];
+
+ // RX_CNTRL_REGISTER
+ // BIT[0] = Receive Channel Enable
+ // BIT[1] = Strip Padding from the Receive data
+ // BIT[2] = Send CRC along with data to the host
+ // BIT[4] = Check RX Deferral
+ // BIT[6] = Receive Runt Packet
+ assign cf2rx_ch_en = mac_cntrl_out_2[0];
+ assign cf2rx_strp_pad_en = mac_cntrl_out_2[1];
+ assign cf2rx_snd_crc = mac_cntrl_out_2[2];
+ assign cf_chk_rx_dfl = mac_cntrl_out_2[4];
+ assign cf2rx_runt_pkt_en = mac_cntrl_out_2[6];
+
+assign reg_0[31:0] = {8'h0,tx_buf_base_addr[3:0],
+ rx_buf_base_addr[3:0],
+ mac_cntrl_out_2[7:0],
+ mac_cntrl_out_1[7:0]};
+
+
+// reg1 free
+assign reg_1[31:0] = 32'h0;
+
+//========================================================================//
+ //TRANSMIT DEFFERAL CONTROL REGISTER: Address value 08H
+ //BIT[7:0] = Defferal TX
+ //BIT[15:8] = Defferal RX
+
+ generic_register #(8,0 ) dfl_params1_en_reg (
+ .we ({8{sw_wr_en_2 &
+ wr_be[0] }} ),
+ .data_in (reg_wdata[7:0] ),
+ .reset_n (app_reset_n ),
+ .clk (app_clk ),
+
+ //List of Outs
+ .data_out (dfl_params1_out[7:0] )
+ );
+
+ assign cf2df_dfl_single = dfl_params1_out[7:0];
+
+ generic_register #(8,0 ) dfl_params_rx_en_reg (
+ .we ({8{sw_wr_en_2 &
+ wr_be[1] }} ),
+ .data_in (reg_wdata[15:8] ),
+ .reset_n (app_reset_n ),
+ .clk (app_clk ),
+
+ //List of Outs
+ .data_out (dfl_params_rx_out[7:0] )
+ );
+ assign cf2df_dfl_single_rx = dfl_params_rx_out[7:0];
+
+assign reg_2[15:0] = {16'h0,dfl_params_rx_out,dfl_params1_out};
+
+ //========================================================================//
+ // MAC_MODE REGISTER: Address value 0CH
+ // BIT[0] = 10/100 or 1000 1 1000, 0 is 10/100 Channel Enable
+ // BIT[1] = Mii/Rmii Default is Mii
+ // BIT[2] = MAC used in Loop back Mode
+ // BIT[3] = Burst Enable
+ // BIT[4] = Half Duplex
+ // BIT[5] = Silent Mode (During Loopback the Tx --> RX and NOT to PHY)
+ // BIT[6] = crs based flow control enable
+ // BIT[7] = Mac Mode Change
+
+ generic_register #(8,0 ) mac_mode_reg (
+ .we ({8{sw_wr_en_3 & wr_be[0]}}),
+ .data_in (reg_wdata[7:0] ),
+ .reset_n (app_reset_n ),
+ .clk (app_clk ),
+
+ //List of Outs
+ .data_out (mac_mode_out[7:0] )
+ );
+
+ assign cf_mac_mode = mac_mode_out[0];
+ assign cf2mi_rmii_en = mac_mode_out[1];
+ assign cf2mi_loopback_en = mac_mode_out[2];
+ assign cf_silent_mode = mac_mode_out[5];
+ assign cfg_uni_mac_mode_change_i = mac_mode_out[7];
+
+
+assign reg_3[31:0] = {24'h0,mac_mode_out};
+ //========================================================================//
+ //MDIO COMMAND REGISTER: ADDRESS 10H
+ //BIT[15:0] = MDIO DATA TO PHY
+ //BIT[20:16] = MDIO REGISTER ADDR
+ //BIT[25:21] = MDIO PHY ADDR
+ //BIT[26] = MDIO COMMAND OPCODE READ/WRITE(0:read,1:write)
+ //BIT[31] = GO MDIO
+
+ generic_register #(8,0 ) mdio_cmd_reg_1 (
+ .we ({8{sw_wr_en_4 &
+ wr_be[0]}} ),
+ .data_in (reg_wdata[7:0] ),
+ .reset_n (app_reset_n ),
+ .clk (app_clk ),
+
+ //List of Outs
+ .data_out (mdio_cmd_out_1[7:0] )
+ );
+
+ generic_register #(8,0 ) mdio_cmd_reg_2 (
+ .we ({8{sw_wr_en_4 &
+ wr_be[1]}} ),
+ .data_in (reg_wdata[15:8] ),
+ .reset_n (app_reset_n ),
+ .clk (app_clk ),
+
+ //List of Outs
+ .data_out (mdio_cmd_out_2[7:0] )
+ );
+
+ generic_register #(8,0 ) mdio_cmd_reg_3 (
+ .we ({8{sw_wr_en_4 &
+ wr_be[2]}} ),
+ .data_in (reg_wdata[23:16] ),
+ .reset_n (app_reset_n ),
+ .clk (app_clk ),
+
+ //List of Outs
+ .data_out (mdio_cmd_out_3[7:0] )
+ );
+
+
+
+ //byte_reg mdio_cmd_reg_4 (.we({8{mdio_cmd_en_4 && cfg_rw}}), .data_in(reg_wdata),
+ // .reset_n(app_reset_n), .clk(app_clk), .data_out(mdio_cmd_out_4));
+
+
+ generic_register #(7,0 ) mdio_cmd_reg_4 (
+ .we ({7{sw_wr_en_4 &
+ wr_be[3]}} ),
+ .data_in (reg_wdata[30:24] ),
+ .reset_n (app_reset_n ),
+ .clk (app_clk ),
+
+ //List of Outs
+ .data_out (mdio_cmd_out_4[6:0] )
+ );
+
+req_register #(0 ) u_mdio_req (
+ .cpu_we ({sw_wr_en_4 &
+ wr_be[3] } ),
+ .cpu_req (reg_wdata[31] ),
+ .hware_ack (mdio_cmd_done_sync ),
+ .reset_n (app_reset_n ),
+ .clk (app_clk ),
+
+ //List of Outs
+ .data_out (mdio_cmd_out_4[7] )
+ );
+
+
+ assign mdio_cmd_out = {mdio_cmd_out_4, mdio_cmd_out_3,mdio_cmd_out_2,mdio_cmd_out_1};
+
+ assign reg_4 = {mdio_cmd_out};
+
+ assign cf2md_datain = mdio_cmd_out[15:0];
+ assign cf2md_regad = mdio_cmd_out[20:16];
+ assign cf2md_phyad = mdio_cmd_out[25:21];
+ assign cf2md_op = mdio_cmd_out[26];
+ assign cf2md_go = mdio_cmd_out[31];
+
+
+ //========================================================================//
+ //MDIO STATUS REGISTER: ADDRESS 14H
+ //BIT[15:0] = MDIO DATA FROM PHY
+ //BIT[31] = STATUS OF MDIO TRANSFER
+
+ always @(posedge app_clk
+ or negedge app_reset_n)
+ begin
+ if(!app_reset_n) begin
+ int_mdio_stat_out <= 16'b0;
+ int_md2cf_status <= 1'b0;
+ end
+ else
+ if(mdio_cmd_done_sync)
+ begin
+ int_mdio_stat_out[15:0] <= md2cf_data;
+ // int_mdio_stat_out[30:16] <= int_mdio_stat_out[30:16];
+ int_md2cf_status <= md2cf_status;
+ end // else: !if(reset)
+ end // always @ (posedge app_clk...
+
+ assign mdio_stat_out = (mac_mdio_en == 1'b1) ? {int_md2cf_status, 15'b0, int_mdio_stat_out} : 32'b0;
+
+
+ assign reg_5 = {mdio_stat_out};
+
+ //========================================================================//
+ //MAC Source Address Register 18-1C
+
+ generic_register #(8,0 ) mac_sa_reg_1 (
+ .we ({8{sw_wr_en_6 & wr_be[0] }}),
+ .data_in (reg_wdata[7:0] ),
+ .reset_n (app_reset_n ),
+ .clk (app_clk ),
+
+ //List of Outs
+ .data_out (mac_sa_out_1[7:0] )
+ );
+ generic_register #(8,0 ) mac_sa_reg_2 (
+ .we ({8{sw_wr_en_6 & wr_be[1] }}),
+ .data_in (reg_wdata[15:8] ),
+ .reset_n (app_reset_n ),
+ .clk (app_clk ),
+
+ //List of Outs
+ .data_out (mac_sa_out_2[7:0] )
+ );
+
+ generic_register #(8,0 ) mac_sa_reg_3 (
+ .we ({8{sw_wr_en_6 & wr_be[2] }}),
+ .data_in (reg_wdata[23:16] ),
+ .reset_n (app_reset_n ),
+ .clk (app_clk ),
+
+ //List of Outs
+ .data_out (mac_sa_out_3[7:0] )
+ );
+
+ generic_register #(8,0 ) mac_sa_reg_4 (
+ .we ({8{sw_wr_en_6 & wr_be[3] }}),
+ .data_in (reg_wdata[31:24] ),
+ .reset_n (app_reset_n ),
+ .clk (app_clk ),
+
+ //List of Outs
+ .data_out (mac_sa_out_4[7:0] )
+ );
+
+ generic_register #(8,0 ) mac_sa_reg_5 (
+ .we ({8{sw_wr_en_7 & wr_be[0] }}),
+ .data_in (reg_wdata[7:0] ),
+ .reset_n (app_reset_n ),
+ .clk (app_clk ),
+
+ //List of Outs
+ .data_out (mac_sa_out_5[7:0] )
+ );
+
+ generic_register #(8,0 ) mac_sa_reg_6 (
+ .we ({8{sw_wr_en_7 & wr_be[1] }}),
+ .data_in (reg_wdata[15:8] ),
+ .reset_n (app_reset_n ),
+ .clk (app_clk ),
+
+ //List of Outs
+ .data_out (mac_sa_out_6[7:0] )
+ );
+
+// assign cf_mac_sa = { mac_sa_out_1, mac_sa_out_2, mac_sa_out_3,
+// mac_sa_out_4, mac_sa_out_5, mac_sa_out_6};
+ assign cf_mac_sa = { mac_sa_out_6, mac_sa_out_5, mac_sa_out_4,
+ mac_sa_out_3, mac_sa_out_2, mac_sa_out_1};
+
+ assign reg_6[31:0] = cf_mac_sa[31:0];
+ assign reg_7[31:0] = {16'h0,cf_mac_sa[47:32]};
+//========================================================================//
+//MAC max packet size Register 20
+
+ generic_register #(8,0 ) max_pkt_sz_reg0 (
+ .we ({8{sw_wr_en_8 & wr_be[0] }}),
+ .data_in (reg_wdata[7:0] ),
+ .reset_n (app_reset_n ),
+ .clk (app_clk ),
+
+ //List of Outs
+ .data_out (cf2rx_max_pkt_sz[7:0] )
+ );
+
+ generic_register #(8,0 ) max_pkt_sz_reg1 (
+ .we ({8{sw_wr_en_8 & wr_be[1] }}),
+ .data_in (reg_wdata[15:8] ),
+ .reset_n (app_reset_n ),
+ .clk (app_clk ),
+
+ //List of Outs
+ .data_out (cf2rx_max_pkt_sz[15:8] )
+ );
+
+ assign reg_8[31:0] = {16'h0,cf2rx_max_pkt_sz[15:0]};
+
+
+//========================================================================//
+//MAC max packet size Register 20
+
+ generic_register #(2,0 ) m_rx_qbase_addr_1 (
+ .we ({2{sw_wr_en_9 & wr_be[0] }}),
+ .data_in (reg_wdata[7:6] ),
+ .reset_n (app_reset_n ),
+ .clk (app_clk ),
+
+ //List of Outs
+ .data_out (rx_buf_qbase_addr[1:0] )
+ );
+
+ generic_register #(8,0 ) m_rx_qbase_addr_2 (
+ .we ({8{sw_wr_en_9 & wr_be[1] }}),
+ .data_in (reg_wdata[15:8] ),
+ .reset_n (app_reset_n ),
+ .clk (app_clk ),
+
+ //List of Outs
+ .data_out (rx_buf_qbase_addr[9:2] )
+ );
+
+
+ generic_register #(2,0 ) m_tx_qbase_addr_1 (
+ .we ({2{sw_wr_en_9 & wr_be[2] }}),
+ .data_in (reg_wdata[23:22] ),
+ .reset_n (app_reset_n ),
+ .clk (app_clk ),
+
+ //List of Outs
+ .data_out (tx_buf_qbase_addr[1:0] )
+ );
+
+ generic_register #(8,0 ) m_tx_qbase_addr_2 (
+ .we ({8{sw_wr_en_9 & wr_be[3] }}),
+ .data_in (reg_wdata[31:24] ),
+ .reset_n (app_reset_n ),
+ .clk (app_clk ),
+
+ //List of Outs
+ .data_out (tx_buf_qbase_addr[9:2] )
+ );
+
+
+ assign reg_9[15:0] = {rx_buf_qbase_addr[9:0],6'h0};
+ assign reg_9[31:16] = {tx_buf_qbase_addr[9:0],6'h0};
+
+
+
+//-----------------------------------------------------------------------
+// RX-Clock Static Counter Status Signal
+//-----------------------------------------------------------------------
+// Note: rx_sts_vld signal is only synchronised w.r.t application clock, and
+// assumption is rx_sts is stable untill next packet received
+ assign rx_good_frm_trig = rx_sts_vld && (rx_sts[7:0] == 'h0);
+ assign rx_bad_frm_trig = rx_sts_vld && (rx_sts[7:0] != 'h0);
+
+
+stat_counter #(16) u_stat_rx_good_frm (
+ // Clock and Reset Signals
+ . sys_clk (app_clk ),
+ . s_reset_n (app_reset_n ),
+
+ . count_inc (rx_good_frm_trig),
+ . count_dec (1'b0 ),
+
+ . reg_sel (sw_wr_en_10 ),
+ . reg_wr_data (reg_wdata[15:0] ),
+ . reg_wr (wr_be[0] ), // Byte write not supported for cntr
+
+ . cntr_intr ( ),
+ . cntrout (reg_10[15:0] )
+ );
+
+stat_counter #(16) u_stat_rx_bad_frm (
+ // Clock and Reset Signals
+ . sys_clk (app_clk ),
+ . s_reset_n (app_reset_n ),
+
+ . count_inc (rx_bad_frm_trig ),
+ . count_dec (1'b0 ),
+
+ . reg_sel (sw_wr_en_10 ),
+ . reg_wr_data (reg_wdata[31:16] ),
+ . reg_wr (wr_be[0] ), // Byte write not supported for cntr
+
+ . cntr_intr ( ),
+ . cntrout (reg_10[31:16] )
+ );
+
+
+ wire tx_good_frm_trig = tx_sts_vld ;
+
+stat_counter #(16) u_stat_tx_good_frm (
+ // Clock and Reset Signals
+ . sys_clk (app_clk ),
+ . s_reset_n (app_reset_n ),
+
+ . count_inc (tx_good_frm_trig ),
+ . count_dec (1'b0 ),
+
+ . reg_sel (sw_wr_en_11 ),
+ . reg_wr_data (reg_wdata[15:0] ),
+ . reg_wr (wr_be[0] ), // Byte write not supported for cntr
+
+ . cntr_intr ( ),
+ . cntrout (reg_11[15:0] )
+ );
+
+assign reg_11[31:16] = 16'h0;
+
+// reg_12 & reg_13
+
+stat_counter #(4) u_rx_qcnt (
+ // Clock and Reset Signals
+ . sys_clk (app_clk ),
+ . s_reset_n (app_reset_n ),
+
+ . count_inc (rx_qcnt_inc ),
+ . count_dec (rx_qcnt_dec ),
+
+ . reg_sel (sw_wr_en_12 ),
+ . reg_wr_data (reg_wdata[3:0] ),
+ . reg_wr (wr_be[0] ), // Byte write not supported for cntr
+
+ . cntr_intr ( ),
+ . cntrout (rx_qcnt )
+ );
+
+stat_counter #(4) u_tx_qcnt (
+ // Clock and Reset Signals
+ . sys_clk (app_clk ),
+ . s_reset_n (app_reset_n ),
+
+ . count_inc (tx_qcnt_inc ),
+ . count_dec (tx_qcnt_dec ),
+
+ . reg_sel (sw_wr_en_12 ),
+ . reg_wr_data (reg_wdata[11:8] ),
+ . reg_wr (wr_be[2] ), // Byte write not supported for cntr
+
+ . cntr_intr ( ),
+ . cntrout (tx_qcnt )
+ );
+
+assign reg_12[7:0] = {4'h0,rx_qcnt[3:0]};
+assign reg_12[15:8] = {4'h0,tx_qcnt[3:0]};
+assign reg_12[31:16] = {16'h0};
+
+generic_intr_stat_reg #(9) u_intr_stat (
+ //inputs
+ . clk (app_clk ),
+ . reset_n (app_reset_n ),
+ . reg_we ({{1{sw_wr_en_13 & wr_be[1]}},
+ {8{sw_wr_en_13 & wr_be[0]}}} ),
+ . reg_din (reg_wdata[8:0] ),
+ . hware_req ({tx_sts,rx_sts[7:0]} ),
+
+ //outputs
+ . data_out (reg_13[8:0] )
+ );
+
+assign reg_13[31:9] = 23'h0;
+
+// IP SA [31:0]
+
+ generic_register #(8,0 ) u_ip_sa_0 (
+ .we ({8{sw_wr_en_14 & wr_be[0] }}),
+ .data_in (reg_wdata[7:0] ),
+ .reset_n (app_reset_n ),
+ .clk (app_clk ),
+
+ //List of Outs
+ .data_out (cfg_ip_sa[7:0] )
+ );
+
+ generic_register #(8,0 ) u_ip_sa_1 (
+ .we ({8{sw_wr_en_14 & wr_be[1] }}),
+ .data_in (reg_wdata[15:8] ),
+ .reset_n (app_reset_n ),
+ .clk (app_clk ),
+
+ //List of Outs
+ .data_out (cfg_ip_sa[15:8] )
+ );
+
+
+ generic_register #(8,0 ) u_ip_sa_2 (
+ .we ({8{sw_wr_en_14 & wr_be[2] }}),
+ .data_in (reg_wdata[23:16] ),
+ .reset_n (app_reset_n ),
+ .clk (app_clk ),
+
+ //List of Outs
+ .data_out (cfg_ip_sa[23:16] )
+ );
+
+ generic_register #(8,0 ) u_ip_sa_3 (
+ .we ({8{sw_wr_en_14 & wr_be[3] }}),
+ .data_in (reg_wdata[31:24] ),
+ .reset_n (app_reset_n ),
+ .clk (app_clk ),
+
+ //List of Outs
+ .data_out (cfg_ip_sa[31:24] )
+ );
+
+assign reg_14 = cfg_ip_sa[31:0];
+
+// Mac filter
+
+ generic_register #(8,0 ) u_mac_filter_0 (
+ .we ({8{sw_wr_en_15 & wr_be[0] }}),
+ .data_in (reg_wdata[7:0] ),
+ .reset_n (app_reset_n ),
+ .clk (app_clk ),
+
+ //List of Outs
+ .data_out (cfg_mac_filter[7:0] )
+ );
+
+ generic_register #(8,0 ) u_mac_filter_1 (
+ .we ({8{sw_wr_en_14 & wr_be[1] }}),
+ .data_in (reg_wdata[15:8] ),
+ .reset_n (app_reset_n ),
+ .clk (app_clk ),
+
+ //List of Outs
+ .data_out (cfg_mac_filter[15:8] )
+ );
+
+
+ generic_register #(8,0 ) u_mac_filter_2 (
+ .we ({8{sw_wr_en_14 & wr_be[2] }}),
+ .data_in (reg_wdata[23:16] ),
+ .reset_n (app_reset_n ),
+ .clk (app_clk ),
+
+ //List of Outs
+ .data_out (cfg_mac_filter[23:16] )
+ );
+
+ generic_register #(8,0 ) u_mac_filter_3 (
+ .we ({8{sw_wr_en_14 & wr_be[3] }}),
+ .data_in (reg_wdata[31:24] ),
+ .reset_n (app_reset_n ),
+ .clk (app_clk ),
+
+ //List of Outs
+ .data_out (cfg_mac_filter[31:24] )
+ );
+
+assign reg_15 = cfg_mac_filter[31:0];
+endmodule
+
diff --git a/verilog/rtl/gmac/mac/g_deferral.v b/verilog/rtl/gmac/mac/g_deferral.v
new file mode 100755
index 0000000..6f0ec0b
--- /dev/null
+++ b/verilog/rtl/gmac/mac/g_deferral.v
@@ -0,0 +1,197 @@
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Tubo 8051 cores MAC Interface Module ////
+//// ////
+//// This file is part of the Turbo 8051 cores project ////
+//// http://www.opencores.org/cores/turbo8051/ ////
+//// ////
+//// Description ////
+//// Turbo 8051 definitions. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : Mar 2, 2011 ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+/***************************************************************
+ Description:
+ deferral.v : This block performs the deferral algorithm for
+ half duplex mode, as per the IEEE 802.3 section 4.2.3.2.2
+ This block also implements the optional two part deferral
+ mechanism.
+***********************************************************************/
+
+module g_deferral (
+ df2tx_dfl_dn,
+ cf2df_dfl_single,
+ phy_tx_en,
+ phy_tx_er,
+ tx_clk,
+ app_reset_n);
+
+
+ input [7:0] cf2df_dfl_single; //program with 9.6 ms
+ input phy_tx_en; //TX frame is done, wait for IPG
+ //used in FULL duplex
+ input phy_tx_er; //TX Error
+ input tx_clk; //MII provided tx_clk
+ input app_reset_n;
+
+ output df2tx_dfl_dn; //when active hold the TX, else
+ //TX can send preamble
+
+ wire df2tx_dfl_dn;
+
+ parameter dfl_idle_st = 6'b000000;
+ parameter dfl_dfl_st = 6'b000010;
+ parameter dfl_full_tx_dn_st = 6'b010000;
+ parameter dfl_wipg_st = 6'b100000;
+
+ reg [5:0] curr_dfl_st, nxt_dfl_st;
+ reg dfl_dn;
+ reg strt_dfl;
+ reg [7:0] dfl_cntr;
+
+ reg phy_tx_en_d;
+
+ wire was_xmitted;
+
+ assign df2tx_dfl_dn = dfl_dn;
+ /*****************************************************************
+ * Synchronous process for the FSM to enable and disable TX on
+ * receive activity
+ *****************************************************************/
+ always @(posedge tx_clk or negedge app_reset_n)
+ begin
+ if (!app_reset_n)
+ curr_dfl_st <= dfl_idle_st;
+ else
+ curr_dfl_st <= nxt_dfl_st;
+ end // always @ (posedge tx_clk or negedge app_reset_n)
+
+ /*****************************************************************
+ * comb process for the FSM to enable and disable TX on
+ * receive activity
+ *****************************************************************/
+ always @(curr_dfl_st or dfl_cntr
+ or phy_tx_en or phy_tx_er or was_xmitted)
+ begin
+ strt_dfl = 0;
+ dfl_dn = 0;
+ nxt_dfl_st = curr_dfl_st;
+
+ case (curr_dfl_st)
+ dfl_idle_st :
+ begin
+ dfl_dn = 1;
+ if (phy_tx_en)
+ begin
+ dfl_dn = 0;
+ nxt_dfl_st = dfl_full_tx_dn_st;
+ end // if (phy_tx_en)
+ else
+ nxt_dfl_st = dfl_idle_st;
+ end // case: dfl_idle_st
+
+ dfl_full_tx_dn_st :
+ begin
+ // full duplex mode, wait till the current tx
+ // frame is transmitted and wait for IPG time,
+ // no need to wait for two part defferal
+ if (!phy_tx_en && !phy_tx_er)
+ begin
+ strt_dfl = 1;
+ nxt_dfl_st = dfl_wipg_st;
+ end // if (!phy_tx_en)
+ else
+ nxt_dfl_st = dfl_full_tx_dn_st;
+ end // case: dfl_full_tx_dn_st
+
+ dfl_wipg_st :
+ begin
+ // This state is reached when there is no transmit
+ // in progress. In this state IPG counter should checked
+ // and upon its expiry indicate deferral done
+ // to tx_fsm block
+ if (dfl_cntr == 8'd0)
+ begin
+ dfl_dn = 1;
+ nxt_dfl_st = dfl_idle_st;
+ end
+ else
+ nxt_dfl_st = dfl_wipg_st;
+ end // case: dfl_wipg_st
+
+ default :
+ begin
+ nxt_dfl_st = dfl_idle_st;
+ end
+ endcase // case (curr_dfl_st)
+ end // always @ (curr_dfl_st )
+
+ //counter for the single phase deferral scheme
+ always @(posedge tx_clk or negedge app_reset_n)
+ begin
+ if (!app_reset_n)
+ dfl_cntr <= 8'd0;
+ else
+ begin
+ if (strt_dfl)
+ begin
+ dfl_cntr <= cf2df_dfl_single;
+ end
+ else
+ dfl_cntr <= dfl_cntr - 1;
+ end // else: !if(app_reset_n)
+ end // always @ (posedge tx_clk or negedge app_reset_n)
+
+
+ // Detect Packet end
+ assign was_xmitted = (phy_tx_en_d == 1'b1 && phy_tx_en == 1'b0) ? 1'b1 : 1'b0;
+
+
+ always @(posedge tx_clk or negedge app_reset_n)
+ begin
+ if (!app_reset_n)
+ phy_tx_en_d <= 1'b0;
+ else
+ phy_tx_en_d <= phy_tx_en;
+ end // always @ (posedge tx_clk or negedge app_reset_n)
+
+
+
+endmodule // deferral
+
+
+
+
diff --git a/verilog/rtl/gmac/mac/g_deferral_rx.v b/verilog/rtl/gmac/mac/g_deferral_rx.v
new file mode 100755
index 0000000..2368581
--- /dev/null
+++ b/verilog/rtl/gmac/mac/g_deferral_rx.v
@@ -0,0 +1,191 @@
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Tubo 8051 cores MAC Interface Module ////
+//// ////
+//// This file is part of the Turbo 8051 cores project ////
+//// http://www.opencores.org/cores/turbo8051/ ////
+//// ////
+//// Description ////
+//// Turbo 8051 definitions. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : Mar 2, 2011 ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+/***************************************************************
+ Description:
+ deferral.v : This block performs the deferral algorithm for
+ half duplex mode, as per the IEEE 802.3 section 4.2.3.2.2
+ This block also implements the optional two part deferral
+ mechanism.
+***********************************************************************/
+
+module g_deferral_rx (
+ rx_dfl_dn,
+ dfl_single,
+ rx_dv,
+ rx_clk,
+ reset_n);
+
+
+ input [7:0] dfl_single; //program with 9.6 ms
+ input rx_dv; //TX frame is done, wait for IPG
+ //used in FULL duplex
+ input rx_clk; //MII provided rx_clk
+ input reset_n;
+
+ output rx_dfl_dn; //when active hold the TX, else
+ //TX can send preamble
+
+ parameter dfl_idle_st = 6'b000000;
+ parameter dfl_dfl_st = 6'b000010;
+ parameter dfl_full_tx_dn_st = 6'b010000;
+ parameter dfl_wipg_st = 6'b100000;
+
+ reg [5:0] curr_dfl_st, nxt_dfl_st;
+ reg rx_dfl_dn;
+ reg strt_dfl;
+ reg [8:0] fst_dfl_cntr;
+ reg [8:0] dfl_cntr;
+ reg [8:0] scnd_dfl_cntr;
+
+ /*****************************************************************
+ * Synchronous process for the FSM to enable and disable TX on
+ * receive activity
+ *****************************************************************/
+ always @(posedge rx_clk or negedge reset_n)
+ begin
+ if (!reset_n)
+ curr_dfl_st <= dfl_idle_st;
+ else
+ curr_dfl_st <= nxt_dfl_st;
+ end // always @ (posedge rx_clk or negedge reset_n)
+
+ /*****************************************************************
+ * comb process for the FSM to enable and disable TX on
+ * receive activity
+ *****************************************************************/
+ always @(curr_dfl_st or dfl_cntr or rx_dv)
+ begin
+ strt_dfl = 0;
+ rx_dfl_dn = 0;
+ nxt_dfl_st = curr_dfl_st;
+
+ case (curr_dfl_st)
+ dfl_idle_st :
+ begin
+ rx_dfl_dn = 1;
+ if (rx_dv)
+ begin
+ rx_dfl_dn = 0;
+ nxt_dfl_st = dfl_full_tx_dn_st;
+ end // if (rx_dv)
+ else
+ nxt_dfl_st = dfl_idle_st;
+ end // case: dfl_idle_st
+
+ dfl_full_tx_dn_st :
+ begin
+ // full duplex mode, wait till the current tx
+ // frame is transmitted and wait for IPG time,
+ // no need to wait for two part defferal
+ if (!rx_dv)
+ begin
+ strt_dfl = 1;
+ nxt_dfl_st = dfl_wipg_st;
+ end // if (!rx_dv)
+ else
+ nxt_dfl_st = dfl_full_tx_dn_st;
+ end // case: dfl_full_tx_dn_st
+
+ dfl_wipg_st :
+ begin
+ // This state is reached when there is no transmit
+ // in progress. In this state IPG counter should checked
+ // and upon its expiry indicate deferral done
+ // to tx_fsm block
+ if (dfl_cntr == 9'd0)
+ begin
+ rx_dfl_dn = 1;
+ nxt_dfl_st = dfl_idle_st;
+ end
+ else
+ nxt_dfl_st = dfl_wipg_st;
+ end // case: dfl_wipg_st
+
+ dfl_dfl_st :
+ //wait in this state till deferral time is done
+ //if CRS is active before the deferral time
+ //restart the deferral process again
+ begin
+ begin
+ if (dfl_cntr == 9'd0)
+ begin
+ rx_dfl_dn = 1;
+ nxt_dfl_st = dfl_idle_st;
+ end
+ else
+ nxt_dfl_st = dfl_dfl_st;
+ end //
+ end // case: dfl_dfl_st
+
+ default :
+ begin
+ nxt_dfl_st = dfl_idle_st;
+ end
+ endcase // case (curr_dfl_st)
+ end // always @ (curr_dfl_st )
+
+ //counter for the single phase deferral scheme
+ always @(posedge rx_clk or negedge reset_n)
+ begin
+ if (!reset_n)
+ dfl_cntr <= 9'd0;
+ else
+ begin
+ if (strt_dfl)
+ begin
+ dfl_cntr[7:0] <= dfl_single;
+ dfl_cntr[8] <= 0;
+ end
+ else
+ dfl_cntr <= dfl_cntr - 1;
+ end // else: !if(reset_n)
+ end // always @ (posedge rx_clk or negedge reset_n)
+
+endmodule // deferral
+
+
+
+
diff --git a/verilog/rtl/gmac/mac/g_mac_core.v b/verilog/rtl/gmac/mac/g_mac_core.v
new file mode 100755
index 0000000..ac82d16
--- /dev/null
+++ b/verilog/rtl/gmac/mac/g_mac_core.v
@@ -0,0 +1,609 @@
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Tubo 8051 cores MAC Interface Module ////
+//// ////
+//// This file is part of the Turbo 8051 cores project ////
+//// http://www.opencores.org/cores/turbo8051/ ////
+//// ////
+//// Description ////
+//// Turbo 8051 definitions. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : Mar 2, 2011 ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+ module g_mac_core (
+ scan_mode,
+ s_reset_n,
+ tx_reset_n,
+ rx_reset_n,
+ reset_mdio_clk_n,
+ app_reset_n,
+
+ app_clk,
+
+ // Reg Bus Interface Signal
+ reg_cs,
+ reg_wr,
+ reg_addr,
+ reg_wdata,
+ reg_be,
+
+ // Outputs
+ reg_rdata,
+ reg_ack,
+
+
+ // RX FIFO Interface Signal
+ rx_fifo_full_i,
+ rx_fifo_wr_o,
+ rx_fifo_data_o,
+ rx_commit_wr_o,
+ rx_rewind_wr_o,
+ rx_commit_write_done_o,
+ clr_rx_error_from_rx_fsm_o,
+ rx_fifo_error_i,
+
+ // TX FIFO Interface Signal
+ tx_fifo_data_i,
+ tx_fifo_empty_i,
+ tx_fifo_rdy_i,
+ tx_fifo_rd_o,
+ tx_commit_read_o,
+
+ // Phy Signals
+
+ // Line Side Interface TX Path
+ phy_tx_en,
+ phy_tx_er,
+ phy_txd,
+ phy_tx_clk,
+
+ // Line Side Interface RX Path
+ phy_rx_clk,
+ phy_rx_er,
+ phy_rx_dv,
+ phy_rxd,
+ phy_crs,
+
+ //MDIO interface
+ mdio_clk,
+ mdio_in,
+ mdio_out_en,
+ mdio_out,
+
+ // configuration output
+ cf_mac_sa,
+ cfg_ip_sa,
+ cfg_mac_filter,
+ rx_buf_base_addr,
+ tx_buf_base_addr,
+
+ rx_buf_qbase_addr,
+ tx_buf_qbase_addr,
+
+ tx_qcnt_inc,
+ tx_qcnt_dec,
+ tx_qcnt,
+
+ rx_qcnt_inc,
+ rx_qcnt_dec,
+ rx_qcnt
+
+ );
+
+parameter mac_mdio_en = 1'b1;
+
+//-----------------------------------------------------------------------
+// INPUT/OUTPUT DECLARATIONS
+//-----------------------------------------------------------------------
+input scan_mode;
+input s_reset_n;
+input tx_reset_n;
+input rx_reset_n;
+input reset_mdio_clk_n;
+input app_reset_n;
+
+//-----------------------------------------------------------------------
+// Application Clock Related Declaration
+//-----------------------------------------------------------------------
+input app_clk;
+
+// Conntrol Bus Sync with Application Clock
+//---------------------------------
+// Reg Bus Interface Signal
+//---------------------------------
+ input reg_cs ;
+ input reg_wr ;
+ input [3:0] reg_addr ;
+ input [31:0] reg_wdata ;
+ input [3:0] reg_be ;
+
+ // Outputs
+ output [31:0] reg_rdata ;
+ output reg_ack ;
+
+
+
+// RX FIFO Interface Signal
+output clr_rx_error_from_rx_fsm_o;
+input rx_fifo_full_i;
+output rx_fifo_wr_o;
+output [8:0] rx_fifo_data_o;
+output rx_commit_wr_o;
+output rx_commit_write_done_o;
+output rx_rewind_wr_o;
+input rx_fifo_error_i;
+
+//-----------------------------------------------------------------------
+// TX-Clock Domain Status Signal
+//-----------------------------------------------------------------------
+output tx_commit_read_o;
+output tx_fifo_rd_o;
+
+input [8:0] tx_fifo_data_i;
+input tx_fifo_empty_i;
+input tx_fifo_rdy_i;
+
+
+//-----------------------------------------------------------------------
+// Line-Tx Signal
+//-----------------------------------------------------------------------
+output phy_tx_en;
+output phy_tx_er;
+output [7:0] phy_txd;
+input phy_tx_clk;
+
+//-----------------------------------------------------------------------
+// Line-Rx Signal
+//-----------------------------------------------------------------------
+input phy_rx_clk;
+input phy_rx_er;
+input phy_rx_dv;
+input [7:0] phy_rxd;
+input phy_crs;
+
+
+//-----------------------------------------------------------------------
+// MDIO Signal
+//-----------------------------------------------------------------------
+input mdio_clk;
+input mdio_in;
+output mdio_out_en;
+output mdio_out;
+
+output [47:0] cf_mac_sa;
+output [31:0] cfg_ip_sa;
+output [31:0] cfg_mac_filter;
+output [3:0] rx_buf_base_addr;
+output [3:0] tx_buf_base_addr;
+
+output [9:0] rx_buf_qbase_addr; // Rx Q Base Address
+output [9:0] tx_buf_qbase_addr; // Tx Q Base Address
+
+input tx_qcnt_inc;
+input tx_qcnt_dec;
+output [3:0] tx_qcnt;
+
+input rx_qcnt_inc;
+input rx_qcnt_dec;
+output [3:0] rx_qcnt;
+
+//-----------------------------------------------------------------------
+// RX-Clock Domain Status Signal
+//-----------------------------------------------------------------------
+wire rx_sts_vld_o;
+wire [15:0] rx_sts_bytes_rcvd_o;
+wire rx_sts_large_pkt_o;
+wire rx_sts_lengthfield_err_o;
+wire rx_sts_len_mismatch_o;
+wire rx_sts_crc_err_o;
+wire rx_sts_runt_pkt_rcvd_o;
+wire rx_sts_rx_overrun_o;
+wire rx_sts_frm_length_err_o;
+wire rx_sts_rx_er_o;
+
+
+//-----------------------------------------------------------------------
+// TX-Clock Domain Status Signal
+//-----------------------------------------------------------------------
+wire tx_sts_vld_o ;
+wire [15:0]tx_sts_byte_cntr_o ;
+wire tx_sts_fifo_underrun_o;
+// TX Interface Status Signal
+wire tx_set_fifo_undrn_o ;
+
+wire[7:0] mi2rx_rx_byte,tx2mi_tx_byte;
+wire [7:0] cf2df_dfl_single_rx;
+wire [15:0] cf2rx_max_pkt_sz;
+
+ g_rx_top u_rx_top(
+ //application
+ .app_clk (app_clk),
+ .app_reset_n (s_reset_n),
+ .rx_reset_n (rx_reset_n),
+ .scan_mode (scan_mode),
+
+ .rx_sts_vld (rx_sts_vld_o),
+ .rx_sts_bytes_rcvd (rx_sts_bytes_rcvd_o),
+ .rx_sts_large_pkt (rx_sts_large_pkt_o),
+ .rx_sts_lengthfield_err (rx_sts_lengthfield_err_o),
+ .rx_sts_len_mismatch (rx_sts_len_mismatch_o),
+ .rx_sts_crc_err (rx_sts_crc_err_o),
+ .rx_sts_runt_pkt_rcvd (rx_sts_runt_pkt_rcvd_o),
+ .rx_sts_rx_overrun (rx_sts_rx_overrun_o),
+ .rx_sts_frm_length_err (rx_sts_frm_length_err_o),
+ .clr_rx_error_from_rx_fsm (clr_rx_error_from_rx_fsm_o),
+ .rx_fifo_full (rx_fifo_full_i),
+ .rx_dt_wrt (rx_fifo_wr_o),
+ .rx_dt_out (rx_fifo_data_o),
+ .rx_commit_wr (rx_commit_wr_o),
+ .commit_write_done (rx_commit_write_done_o),
+ .rx_rewind_wr (rx_rewind_wr_o),
+ //mii interface
+ .phy_rx_clk (phy_rx_clk),
+ .mi2rx_strt_rcv (mi2rx_strt_rcv),
+ .mi2rx_rcv_vld (mi2rx_rcv_vld),
+ .mi2rx_rx_byte (mi2rx_rx_byte),
+ .mi2rx_end_rcv (mi2rx_end_rcv),
+ .mi2rx_extend (mi2rx_extend),
+ .mi2rx_frame_err (mi2rx_frame_err),
+ .mi2rx_end_frame (mi2rx_end_frame),
+ .mi2rx_crs (mi2rx_crs),
+ .df2rx_dfl_dn (df2rx_dfl_dn),
+ //PHY Signals
+ .phy_rx_dv (phy_rx_dv),
+ //Config interface
+ .cf2rx_max_pkt_sz (cf2rx_max_pkt_sz),
+ .cf2rx_rx_ch_en (cf2rx_ch_en),
+ .cf2rx_strp_pad_en (cf2rx_strp_pad_en),
+ .cf2rx_snd_crc (cf2rx_snd_crc),
+ .cf2rx_rcv_runt_pkt_en (cf2rx_runt_pkt_en),
+ .cf_macmode (cf_mac_mode_o),
+ .cf2df_dfl_single_rx (cf2df_dfl_single_rx),
+ .ap2rx_rx_fifo_err (rx_fifo_error_i),
+ //for crs based flow control
+ .phy_crs (phy_crs)
+ );
+
+ wire [4:0] cf2md_regad,cf2md_phyad;
+ wire [15:0] cf2md_datain,md2cf_data;
+
+
+
+ wire md2cf_status;
+ wire md2cf_cmd_done;
+ wire cf2md_op;
+ wire cf2md_go;
+ wire mdc;
+
+ wire int_s_reset_n;
+ wire [4:0] int_cf2md_regad;
+ wire [4:0] int_cf2md_phyad;
+ wire int_cf2md_op;
+ wire int_cf2md_go;
+ wire [15:0] int_cf2md_datain;
+
+ wire int_md2cf_status;
+ wire [15:0] int_md2cf_data;
+ wire int_md2cf_cmd_done;
+
+ wire int_mdio_clk;
+ wire int_mdio_out_en;
+ wire int_mdio_out;
+ wire int_mdc;
+ wire int_mdio_in;
+
+// ------------------------------------------------------------------------
+// MDIO Enable/disable Mux
+// MDIO is used only in the WAN MAC block. The MDIO block has to be disabled
+// in all other places. When MDIO is enabled the MDIO block signals will be
+// connected to core module appriprotately. If MDIO is disabled, all inputs
+// to the MDIO module is made zero and all outputs from this module to other
+// modules is made zero. The enable/disable is controlled by the parameter
+// mac_mdio_en.
+// ------------------------------------------------------------------------
+
+// ------------------------------------------------------------------------
+// Inputs to the MDIO module
+// ------------------------------------------------------------------------
+
+assign int_s_reset_n = (mac_mdio_en == 1'b1) ? reset_mdio_clk_n : 1'b1;
+assign int_cf2md_regad = (mac_mdio_en == 1'b1) ? cf2md_regad : 5'b0;
+assign int_cf2md_phyad = (mac_mdio_en == 1'b1) ? cf2md_phyad : 5'b0;
+assign int_cf2md_op = (mac_mdio_en == 1'b1) ? cf2md_op : 1'b0;
+assign int_cf2md_go = (mac_mdio_en == 1'b1) ? cf2md_go : 1'b0;
+assign int_cf2md_datain = (mac_mdio_en == 1'b1) ? cf2md_datain : 16'b0;
+
+// ------------------------------------------------------------------------
+// Outputs from the MDIO module used locally
+// ------------------------------------------------------------------------
+
+assign md2cf_status = (mac_mdio_en == 1'b1) ? int_md2cf_status : 1'b0;
+assign md2cf_data = (mac_mdio_en == 1'b1) ? int_md2cf_data : 16'b0;
+//assign md2cf_cmd_done = (mac_mdio_en == 1'b1) ? int_md2cf_cmd_done : 1'b0;
+
+// ------------------------------------------------------------------------
+// Outputs from the MDIO module driven out of this module
+// ------------------------------------------------------------------------
+
+assign mdio_out_en = (mac_mdio_en == 1'b1) ? int_mdio_out_en : 1'b0;
+assign mdio_out = (mac_mdio_en == 1'b1) ? int_mdio_out : 1'b0;
+assign mdc = (mac_mdio_en == 1'b1) ? int_mdc : 1'b0;
+
+assign int_mdio_clk = (mac_mdio_en == 1'b1) ? mdio_clk : 1'b0;
+assign int_mdio_in = (mac_mdio_en == 1'b1) ? mdio_in : 1'b0;
+
+// ------------------------------------------------------------------------
+// MDIO module connected with 'int_' signals
+// ------------------------------------------------------------------------
+
+
+ g_md_intf u_md_intf(
+ //apllication interface
+ .scan_mode (scan_mode),
+ .reset_n (int_s_reset_n),
+
+ .mdio_clk (int_mdio_clk),
+ .mdio_in (int_mdio_in),
+ .mdio_outen_reg (int_mdio_out_en),
+ .mdio_out_reg (int_mdio_out),
+ //Config interface
+ .mdio_regad (int_cf2md_regad),
+ .mdio_phyad (int_cf2md_phyad),
+ .mdio_op (int_cf2md_op),
+ .go_mdio (int_cf2md_go),
+ .mdio_datain (int_cf2md_datain),
+ .mdio_dataout (int_md2cf_data),
+ .mdio_cmd_done (md2cf_cmd_done),
+ .mdio_stat (int_md2cf_status),
+ .mdc (int_mdc)
+ );
+
+
+ wire [7:0] cf2df_dfl_single;
+ wire [47:0] cf_mac_sa;
+ wire cf2tx_force_bad_fcs;
+ wire set_fifo_undrn;
+
+ g_tx_top U_tx_top (
+ .app_clk (app_clk) ,
+ .set_fifo_undrn (tx_set_fifo_undrn_o),
+
+ //Outputs
+ //TX FIFO management
+ .tx_commit_read (tx_commit_read_o),
+ .tx_dt_rd (tx_fifo_rd_o),
+
+ //MII interface
+ .tx2mi_strt_preamble (tx2mi_strt_preamble),
+ .tx2mi_byte_valid (tx2mi_byte_valid),
+ .tx2mi_byte (tx2mi_tx_byte),
+ .tx2mi_end_transmit (tx2mi_end_transmit),
+ .tx_ch_en (tx_ch_en),
+
+ //Status to application
+ .tx_sts_vld (tx_sts_vld_o),
+ .tx_sts_byte_cntr (tx_sts_byte_cntr_o),
+ .tx_sts_fifo_underrun (tx_sts_fifo_underrun_o),
+
+ //Inputs
+ //MII interface
+ .phy_tx_en (phy_tx_en),
+ .phy_tx_er (phy_tx_er),
+
+
+ //configuration
+ .cf2tx_ch_en (cf2tx_ch_en),
+ .cf2df_dfl_single (cf2df_dfl_single),
+ .cf2tx_pad_enable (cf2tx_pad_enable),
+ .cf2tx_append_fcs (cf2tx_append_fcs),
+ .cf_mac_mode (cf_mac_mode_o),
+ .cf_mac_sa (cf_mac_sa),
+ .cf2tx_force_bad_fcs (cf2tx_force_bad_fcs),
+
+ //FIFO data
+ .app_tx_dt_in (tx_fifo_data_i),
+ .app_tx_fifo_empty (tx_fifo_empty_i),
+ .app_tx_rdy (tx_fifo_rdy_i),
+
+ //MII
+ .mi2tx_byte_ack (mi2tx_byte_ack),
+
+ .app_reset_n (s_reset_n),
+ .tx_reset_n (tx_reset_n),
+ .tx_clk (phy_tx_clk)
+ );
+
+ toggle_sync u_rx_sts_sync (
+ . in_clk (phy_rx_clk ),
+ . in_rst_n (rx_reset_n ),
+ . in (rx_sts_vld_o ),
+ . out_clk (app_clk ),
+ . out_rst_n (app_reset_n ),
+ . out_req (rx_sts_vld_ss ),
+ . out_ack (rx_sts_vld_ss )
+ );
+
+
+ toggle_sync u_tx_sts_sync (
+ . in_clk (phy_tx_clk ),
+ . in_rst_n (tx_reset_n ),
+ . in (tx_sts_vld_o ),
+ . out_clk (app_clk ),
+ . out_rst_n (app_reset_n ),
+ . out_req (tx_sts_vld_ss ),
+ . out_ack (tx_sts_vld_ss )
+ );
+
+
+
+ g_cfg_mgmt #(mac_mdio_en) u_cfg_mgmt (
+
+ // Reg Bus Interface Signal
+ . reg_cs (reg_cs),
+ . reg_wr (reg_wr),
+ . reg_addr (reg_addr),
+ . reg_wdata (reg_wdata),
+ . reg_be (reg_be),
+
+ // Outputs
+ . reg_rdata (reg_rdata),
+ . reg_ack (reg_ack),
+
+ // Rx Status
+ . rx_sts_vld(rx_sts_vld_ss),
+ . rx_sts ({rx_sts_large_pkt_o,
+ rx_sts_lengthfield_err_o,
+ rx_sts_len_mismatch_o,
+ rx_sts_crc_err_o,
+ rx_sts_runt_pkt_rcvd_o,
+ rx_sts_rx_overrun_o,
+ rx_sts_frm_length_err_o,
+ rx_sts_rx_er_o
+ }),
+
+ // Tx Status
+ . tx_sts_vld(tx_sts_vld_ss),
+ . tx_sts (tx_sts_fifo_underrun_o),
+
+ // MDIO READ DATA FROM PHY
+ // Since MDIO is not required for the half duplex
+ // MACs the done is always tied to 1'b1
+ .md2cf_cmd_done (md2cf_cmd_done),
+ .md2cf_status (md2cf_status),
+ .md2cf_data (md2cf_data),
+
+ .app_clk (app_clk),
+ .app_reset_n (app_reset_n),
+
+ //List of Outputs
+ // MII Control
+ .cf2mi_loopback_en (cf2mi_loopback_en),
+ .cf_mac_mode (cf_mac_mode_o),
+ .cf_chk_rx_dfl (cf_chk_rx_dfl),
+ .cf_silent_mode (cf_silent_mode),
+ .cf2mi_rmii_en (cf2mi_rmii_en_o),
+
+ // Config In
+ .cfg_uni_mac_mode_change_i (cfg_uni_mac_mode_change_i),
+
+ //CHANNEL enable
+ .cf2tx_ch_en (cf2tx_ch_en),
+ .cf2df_dfl_single (cf2df_dfl_single),
+ .cf2df_dfl_single_rx (cf2df_dfl_single_rx),
+ .cf2tx_pad_enable (cf2tx_pad_enable),
+ .cf2tx_append_fcs (cf2tx_append_fcs),
+ //CHANNEL CONTROL RX
+ .cf2rx_max_pkt_sz (cf2rx_max_pkt_sz),
+ .cf2rx_ch_en (cf2rx_ch_en),
+ .cf2rx_strp_pad_en (cf2rx_strp_pad_en),
+ .cf2rx_snd_crc (cf2rx_snd_crc),
+ .cf2rx_runt_pkt_en (cf2rx_runt_pkt_en),
+ .cf_mac_sa (cf_mac_sa),
+ .cfg_ip_sa (cfg_ip_sa),
+ .cfg_mac_filter (cfg_mac_filter),
+ .cf2tx_force_bad_fcs (cf2tx_force_bad_fcs),
+ //MDIO CONTROL & DATA
+ .cf2md_datain (cf2md_datain),
+ .cf2md_regad (cf2md_regad),
+ .cf2md_phyad (cf2md_phyad),
+ .cf2md_op (cf2md_op),
+ .cf2md_go (cf2md_go),
+
+ .rx_buf_base_addr (rx_buf_base_addr),
+ .tx_buf_base_addr (tx_buf_base_addr),
+
+ .rx_buf_qbase_addr (rx_buf_qbase_addr),
+ .tx_buf_qbase_addr (tx_buf_qbase_addr),
+
+ .tx_qcnt_inc (tx_qcnt_inc),
+ .tx_qcnt_dec (tx_qcnt_dec),
+ .tx_qcnt (tx_qcnt),
+
+ .rx_qcnt_inc (rx_qcnt_inc),
+ .rx_qcnt_dec (rx_qcnt_dec),
+ .rx_qcnt (rx_qcnt)
+
+
+ );
+
+ g_mii_intf u_mii_intf(
+ // Data and Control Signals to tx_fsm and rx_fsm
+ .mi2rx_strt_rcv (mi2rx_strt_rcv),
+ .mi2rx_rcv_vld (mi2rx_rcv_vld),
+ .mi2rx_rx_byte (mi2rx_rx_byte),
+ .mi2rx_end_rcv (mi2rx_end_rcv),
+ .mi2rx_extend (mi2rx_extend),
+ .mi2rx_frame_err (mi2rx_frame_err),
+ .mi2rx_end_frame (mi2rx_end_frame),
+ .mi2rx_crs (mi2rx_crs),
+ .mi2tx_byte_ack (mi2tx_byte_ack),
+ .cfg_uni_mac_mode_change (cfg_uni_mac_mode_change_i),
+
+ // Phy Signals
+ .phy_tx_en (phy_tx_en),
+ .phy_tx_er (phy_tx_er),
+ .phy_txd (phy_txd),
+ .phy_tx_clk (phy_tx_clk),
+ .phy_rx_clk (phy_rx_clk),
+ .tx_reset_n (tx_reset_n),
+ .rx_reset_n (rx_reset_n),
+ .phy_rx_er (phy_rx_er),
+ .phy_rx_dv (phy_rx_dv),
+ .phy_rxd (phy_rxd),
+ .phy_crs (phy_crs),
+
+ // Reset signal
+ // .app_reset (app_reset),
+ .rx_sts_rx_er_reg (rx_sts_rx_er),
+ .app_reset_n (s_reset_n),
+
+ // Signals from Config Management
+ .cf2mi_loopback_en (cf2mi_loopback_en),
+ .cf2mi_rmii_en (cf2mi_rmii_en_o),
+ .cf_mac_mode (cf_mac_mode_o),
+ .cf_chk_rx_dfl (cf_chk_rx_dfl),
+ .cf_silent_mode (cf_silent_mode),
+
+ // Signal from Application to transmit JAM
+ .df2rx_dfl_dn (df2rx_dfl_dn),
+
+ // Inputs from Transmit FSM
+ .tx2mi_strt_preamble (tx2mi_strt_preamble),
+ .tx2mi_end_transmit (tx2mi_end_transmit),
+ .tx2mi_tx_byte (tx2mi_tx_byte),
+ .tx_ch_en (tx_ch_en),
+ .mi2tx_slot_vld ()
+ );
+endmodule
diff --git a/verilog/rtl/gmac/mac/g_md_intf.v b/verilog/rtl/gmac/mac/g_md_intf.v
new file mode 100755
index 0000000..03e56b6
--- /dev/null
+++ b/verilog/rtl/gmac/mac/g_md_intf.v
@@ -0,0 +1,547 @@
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Tubo 8051 cores MAC Interface Module ////
+//// ////
+//// This file is part of the Turbo 8051 cores project ////
+//// http://www.opencores.org/cores/turbo8051/ ////
+//// ////
+//// Description ////
+//// Turbo 8051 definitions. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : Mar 2, 2011 ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+/***************************************************************
+ Description:
+
+ md_intf.v: This verilog file is for the mdio interface of the mac
+ This block enables the station to communicate with the
+ PHYs. This interface is kicked of by a go command from
+ the application. This intiates the read and write operation
+ to the PHY. Upon completion of the operation it returns
+ a indication called command done with the status of such
+ operation.
+
+***************************************************************/
+/************** MODULE DECLARATION ****************************/
+
+module g_md_intf(
+ scan_mode,
+ reset_n,
+ mdio_clk,
+ mdio_in,
+ mdio_outen_reg,
+ mdio_out_reg,
+ mdio_regad,
+ mdio_phyad,
+ mdio_op,
+ go_mdio,
+ mdio_datain,
+ mdio_dataout,
+ mdio_cmd_done,
+ mdio_stat,
+ mdc
+ );
+
+
+parameter FIVE = 5'h5;
+parameter SIXTEEN = 5'd16;
+parameter THIRTY_TWO = 5'd31;
+parameter WRITE = 1;
+
+/******* INPUT & OUTPUT DECLARATIONS *************************/
+
+ input scan_mode ; // scan_mode = 1
+ input reset_n; // reset from mac application interface
+ input mdio_in; // Input signal used to read data from PHY
+ input mdio_clk; // Input signal used to read data from PHY
+ input[4:0] mdio_regad; // register address for the current PHY operation
+ input[4:0] mdio_phyad; // Phy address to which the current operation is intended
+ input mdio_op; // 1 = READ 0 = WRITE
+ input go_mdio; // This is go command from the application for a MDIO
+ // transfer
+ input[15:0] mdio_datain; // 16 bit Write value from application to MDIO block
+ output[15:0] mdio_dataout; // 16 bit Read value for a MDIO transfer
+ output mdio_cmd_done; // This is from MDIO to indicate mdio command completion
+ output mdio_stat; // Status of completion. 0 = No error 1= Error
+ output mdio_out_reg; // Output signal used to write data to PHY
+ output mdio_outen_reg; // Enable signal 1= Output mode on 0 = Input mode
+ output mdc; // This is the MDIO clock
+
+/******* WIRE & REG DECLARATION FOR INPUT AND OUTPUTS ********/
+ wire mdc;
+ wire [15:0] mdio_dataout;
+ wire go_mdio_sync;
+ reg mdio_stat;
+ reg mdio_cmd_done;
+ reg mdio_out_en;
+ reg mdio_out;
+
+ half_dup_dble_reg U_dble_reg1 (
+ //outputs
+ .sync_out_pulse(go_mdio_sync),
+ //inputs
+ .in_pulse(go_mdio),
+ .dest_clk(mdio_clk),
+ .reset_n(reset_n)
+ );
+
+
+
+
+/*** REG & WIRE DECLARATIONS FOR LOCAL SIGNALS ***************/
+ reg[3:0] mdio_cur_st;
+ reg[3:0] mdio_nxt_st;
+ parameter mdio_idle_st= 4'd0,
+ mdio_idle1_st = 4'd1,
+ mdio_sfd1_st= 4'd2,
+ mdio_sfd2_st= 4'd3,
+ mdio_op1_st= 4'd4,
+ mdio_op2_st= 4'd5,
+ mdio_phyaddr_st= 4'd6,
+ mdio_regaddr_st= 4'd7,
+ mdio_turnar_st= 4'd8,
+ mdio_wrturn_st= 4'd9,
+ mdio_rdturn_st= 4'd10,
+ mdio_read_st= 4'd11,
+ mdio_write_st= 4'd12,
+ mdio_complete_st= 4'd13,
+ mdio_preamble_st= 4'd14;
+
+ reg operation;
+ reg phyaddr_mux_sel;
+ reg regaddr_mux_sel;
+ reg write_data_mux_sel;
+ reg read_data_mux_sel;
+ wire[4:0] inc_temp_count;
+ reg[4:0] temp_count;
+ reg reset_temp_count;
+ reg inc_count;
+ reg[4:0] phy_addr;
+ reg[4:0] reg_addr;
+ reg[15:0] transmit_data;
+ reg[15:0] receive_data;
+ reg set_mdio_stat,clr_mdio_stat;
+
+/***************** WIRE ASSIGNMENTS *************************/
+ assign mdc = mdio_clk;
+ assign mdio_dataout = receive_data;
+
+/******** SEQUENTIAL LOGIC **********************************/
+
+ always @(mdio_cur_st or go_mdio_sync or inc_temp_count or
+ transmit_data or operation or phy_addr or reg_addr or temp_count or mdio_in)
+ begin
+ mdio_nxt_st = mdio_cur_st;
+ inc_count = 1'b0;
+ //mdio_cmd_done = 1'b0;
+ mdio_out = 1'b0;
+ mdio_out_en = 1'b0;
+ set_mdio_stat = 1'b0;
+ clr_mdio_stat = 1'b0;
+ phyaddr_mux_sel = 1'b0;
+ read_data_mux_sel = 1'b0;
+ regaddr_mux_sel = 1'b0;
+ reset_temp_count = 1'b0;
+ write_data_mux_sel = 1'b0;
+
+ casex(mdio_cur_st ) // synopsys parallel_case full_case
+
+ mdio_idle_st:
+ // This state waits for signal go_mdio
+ // upon this command from config block
+ // mdio state machine starts to send
+ // SOF delimter
+ begin
+ if(~go_mdio_sync)
+ mdio_nxt_st = mdio_idle1_st; //mdio_sfd1_st;
+ else
+ mdio_nxt_st = mdio_idle_st;
+ end
+
+ mdio_idle1_st:
+ begin
+ if (go_mdio_sync)
+ mdio_nxt_st = mdio_preamble_st;
+ else
+ mdio_nxt_st = mdio_idle1_st;
+ end
+
+ mdio_preamble_st:
+ begin
+ clr_mdio_stat = 1'b1;
+ mdio_out_en = 1'b1;
+ mdio_out = 1'b1;
+ if (temp_count == THIRTY_TWO)
+ begin
+ mdio_nxt_st = mdio_sfd1_st;
+ reset_temp_count = 1'b1;
+ end
+ else
+ begin
+ inc_count = 1'b1;
+ mdio_nxt_st = mdio_preamble_st;
+ end
+ end
+
+ mdio_sfd1_st:
+ // This state shifts the first bit
+ // of Start of Frame De-limiter
+ begin
+ mdio_out_en = 1'b1;
+ mdio_out = 1'b0;
+ mdio_nxt_st = mdio_sfd2_st;
+ end
+
+ mdio_sfd2_st:
+ // This state shifts the second bit
+ // of Start of Frame De-limiter
+ begin
+ mdio_out_en = 1'b1;
+ mdio_out = 1'b1;
+ mdio_nxt_st = mdio_op1_st;
+ end
+
+ mdio_op1_st:
+ // This state shifts the first bit
+ // of type of operation read/write
+ begin
+ mdio_out_en = 1'b1;
+ if(operation)
+ mdio_out = 1'b0;
+ else
+ mdio_out = 1'b1;
+ mdio_nxt_st = mdio_op2_st;
+ end
+
+ mdio_op2_st:
+ // This state shifts the second bit
+ // of type of operation read/write and
+ // determines the appropriate next state
+ // needed for such operation
+ begin
+ mdio_out_en = 1'b1;
+ mdio_nxt_st = mdio_phyaddr_st;
+ if(operation)
+ mdio_out = 1'b1;
+ else
+ mdio_out = 1'b0;
+ end
+
+ mdio_phyaddr_st:
+ // This state shifts the phy-address on the mdio
+ begin
+ mdio_out_en = 1'b1;
+ phyaddr_mux_sel = 1'b1;
+ if(inc_temp_count == FIVE)
+ begin
+ reset_temp_count = 1'b1;
+ mdio_out = phy_addr[4];
+ mdio_nxt_st = mdio_regaddr_st;
+ end
+ else
+ begin
+ inc_count = 1'b1;
+ mdio_out = phy_addr[4];
+ mdio_nxt_st = mdio_phyaddr_st;
+ end
+ end
+
+ mdio_regaddr_st:
+ // This state shifts the register in the phy to which
+ // this operation is intended
+ begin
+ mdio_out_en = 1'b1;
+ regaddr_mux_sel = 1'b1;
+ if(inc_temp_count == FIVE)
+ begin
+ reset_temp_count = 1'b1;
+ mdio_out = reg_addr[4];
+ mdio_nxt_st = mdio_turnar_st;
+ end
+ else
+ begin
+ inc_count = 1'b1;
+ mdio_out = reg_addr[4];
+ mdio_nxt_st = mdio_regaddr_st;
+ end
+ end
+
+ mdio_turnar_st:
+ // This state determines whether the output enable
+ // needs to on or of based on the type of command
+ begin
+ mdio_out = 1'b1;
+ if(operation)
+ begin
+ mdio_out_en = 1'b1;
+ mdio_nxt_st = mdio_wrturn_st;
+ end
+ else
+ begin
+ mdio_out_en = 1'b0;
+ mdio_nxt_st = mdio_rdturn_st;
+ end
+ end
+
+ mdio_wrturn_st:
+ // This state is used for write turn around
+ begin
+ mdio_out_en = 1'b1;
+ mdio_out = 1'b0;
+ mdio_nxt_st = mdio_write_st;
+ end
+
+ mdio_rdturn_st:
+ // This state is used to read turn around state
+ // the output enable is switched off
+ begin
+ if (mdio_in)
+ set_mdio_stat = 1'b1;
+ mdio_out_en = 1'b0;
+ mdio_nxt_st = mdio_read_st;
+ end
+
+ mdio_write_st:
+ // This state transfers the 16 bits of data to the
+ // PHY
+ begin
+ mdio_out_en = 1'b1;
+ write_data_mux_sel = 1'b1;
+ if(inc_temp_count == SIXTEEN)
+ begin
+ reset_temp_count = 1'b1;
+ mdio_out = transmit_data[15];
+ mdio_nxt_st = mdio_complete_st;
+ end
+ else
+ begin
+ inc_count = 1'b1;
+ mdio_out = transmit_data[15];
+ mdio_nxt_st = mdio_write_st;
+ end
+ end
+
+ mdio_read_st:
+ // This state receives the 16 bits of data from the
+ // PHY
+ begin
+ mdio_out_en = 1'b0;
+ read_data_mux_sel = 1'b1;
+ if(inc_temp_count == SIXTEEN)
+ begin
+ reset_temp_count = 1'b1;
+ mdio_nxt_st = mdio_complete_st;
+ end
+ else
+ begin
+ inc_count = 1'b1;
+ mdio_nxt_st = mdio_read_st;
+ end
+ end
+
+ mdio_complete_st:
+ // This completes the mdio transfers indicates to the
+ // application of such complete
+ begin
+ mdio_nxt_st = mdio_idle_st;
+ mdio_out_en = 1'b0;
+ read_data_mux_sel = 1'b0;
+ //mdio_cmd_done = 1'b1;
+// mdio_stat = 1'b0;
+ end
+ endcase
+ end
+always @(mdio_cur_st)
+ mdio_cmd_done = (mdio_cur_st == 4'd13);
+
+
+always @(posedge mdio_clk or negedge reset_n)
+begin
+ if (!reset_n)
+ mdio_stat <= 1'b0;
+ else if (set_mdio_stat)
+ mdio_stat <= 1'b1;
+ else if (clr_mdio_stat)
+ mdio_stat <= 1'b0;
+end
+
+
+// This latches the PHY address, Register address and the
+// Transmit data and the type of operation
+//
+ always @(posedge mdio_clk or negedge reset_n)
+ begin
+ if(!reset_n)
+ begin
+ phy_addr <= 5'd0;
+ reg_addr <= 5'd0;
+ transmit_data <= 16'd0;
+ operation <= 1'b0;
+ receive_data <= 16'd0;
+ end
+ else
+ begin
+ if(go_mdio_sync)
+ begin
+ phy_addr <= mdio_phyad;
+ reg_addr <= mdio_regad;
+ if(mdio_op == WRITE)
+ begin
+ operation <= 1'b1;
+ transmit_data <= mdio_datain;
+ end
+ end
+ else
+ begin
+ operation <= 1'b0;
+ phy_addr <= phy_addr;
+ transmit_data <= transmit_data;
+ reg_addr <= reg_addr;
+ end // else: !if(go_mdio)
+
+ if(phyaddr_mux_sel)
+ begin
+ /*
+ phy_addr[0] <= phy_addr[1];
+ phy_addr[1] <= phy_addr[2];
+ phy_addr[2] <= phy_addr[3];
+ phy_addr[3] <= phy_addr[4];
+ */
+ phy_addr[4] <= phy_addr[3];
+ phy_addr[3] <= phy_addr[2];
+ phy_addr[2] <= phy_addr[1];
+ phy_addr[1] <= phy_addr[0];
+ end
+ if(regaddr_mux_sel)
+ begin
+ reg_addr[4] <= reg_addr[3];
+ reg_addr[3] <= reg_addr[2];
+ reg_addr[2] <= reg_addr[1];
+ reg_addr[1] <= reg_addr[0];
+ end
+ if(write_data_mux_sel)
+ begin
+ transmit_data[15] <= transmit_data[14];
+ transmit_data[14] <= transmit_data[13];
+ transmit_data[13] <= transmit_data[12];
+ transmit_data[12] <= transmit_data[11];
+ transmit_data[11] <= transmit_data[10];
+ transmit_data[10] <= transmit_data[9];
+ transmit_data[9] <= transmit_data[8];
+ transmit_data[8] <= transmit_data[7];
+ transmit_data[7] <= transmit_data[6];
+ transmit_data[6] <= transmit_data[5];
+ transmit_data[5] <= transmit_data[4];
+ transmit_data[4] <= transmit_data[3];
+ transmit_data[3] <= transmit_data[2];
+ transmit_data[2] <= transmit_data[1];
+ transmit_data[1] <= transmit_data[0];
+ end
+ if(read_data_mux_sel)
+ begin
+ receive_data[0] <= mdio_in;
+ receive_data[1] <= receive_data[0];
+ receive_data[2] <= receive_data[1];
+ receive_data[3] <= receive_data[2];
+ receive_data[4] <= receive_data[3];
+ receive_data[5] <= receive_data[4];
+ receive_data[6] <= receive_data[5];
+ receive_data[7] <= receive_data[6];
+ receive_data[8] <= receive_data[7];
+ receive_data[9] <= receive_data[8];
+ receive_data[10] <= receive_data[9];
+ receive_data[11] <= receive_data[10];
+ receive_data[12] <= receive_data[11];
+ receive_data[13] <= receive_data[12];
+ receive_data[14] <= receive_data[13];
+ receive_data[15] <= receive_data[14];
+ end
+ end // else: !if(!reset_n)
+ end // always @ (posedge mdio_clk or negedge reset_n)
+
+ // Temporary counter used to shift the data on the mdio line
+ // This is also used to receive data on the line
+ assign inc_temp_count = temp_count + 5'h1;
+
+ always @(posedge mdio_clk or negedge reset_n)
+ begin
+ if(!reset_n)
+ mdio_cur_st <= mdio_idle_st;
+ else
+ mdio_cur_st <= mdio_nxt_st;
+ end // always @ (posedge mdio_clk or negedge reset_n)
+
+ reg mdio_outen_reg, mdio_out_reg;
+
+ //----------------------------------------------
+ // Note: Druring Scan Mode inverted mdio_clk used for
+ // mdio_outen_reg & mdio_out_reg
+ //-----------------------------------------------
+ wire mdio_clk_scan = (scan_mode) ? !mdio_clk : mdio_clk;
+
+ always @(negedge mdio_clk_scan or negedge reset_n)
+ begin
+ if(!reset_n)
+ begin
+ mdio_outen_reg <= 1'b0;
+ mdio_out_reg <= 1'b0;
+ end
+ else
+ begin
+ mdio_outen_reg <= mdio_out_en;
+ mdio_out_reg <= mdio_out;
+ end
+
+ end // always @ (posedge mdio_clk or negedge reset_n)
+
+ always @(posedge mdio_clk or negedge reset_n)
+ begin
+ if(!reset_n)
+ temp_count <= 5'b0;
+ else
+ begin
+ if(reset_temp_count)
+ temp_count <= 5'b0;
+ else if(inc_count)
+ temp_count <= inc_temp_count;
+ end // else: !if(reset_n)
+ end // always @ (posedge mdio_clk or negedge reset_n)
+
+
+
+endmodule
+
+
diff --git a/verilog/rtl/gmac/mac/g_mii_intf.v b/verilog/rtl/gmac/mac/g_mii_intf.v
new file mode 100755
index 0000000..afbdf8f
--- /dev/null
+++ b/verilog/rtl/gmac/mac/g_mii_intf.v
@@ -0,0 +1,1077 @@
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Tubo 8051 cores MAC Interface Module ////
+//// ////
+//// This file is part of the Turbo 8051 cores project ////
+//// http://www.opencores.org/cores/turbo8051/ ////
+//// ////
+//// Description ////
+//// Turbo 8051 definitions. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : Mar 2, 2011 ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+/***************************************************************
+ Description:
+
+ mii_intf.v: This verilog file is reduced mii interface for ethenet
+ The transmit state machine generates a condition to indicate
+ start transmit. This is done using strt_preamble. The transmit
+ state machine upon detecting strt_preamble generates pre-amble
+ and start of frame de-limiter and then starts accepting the data
+ from the transmit block by asserting the transmit nibble ack.
+
+ ***************************************************************/
+/************** MODULE DECLARATION ****************************/
+module g_mii_intf(
+ // Data and Control Signals to tx_fsm and rx_fsm
+ mi2rx_strt_rcv,
+ mi2rx_rcv_vld,
+ mi2rx_rx_byte,
+ mi2rx_end_rcv,
+ mi2rx_extend,
+ mi2rx_frame_err,
+ mi2rx_end_frame,
+ mi2rx_crs,
+ mi2tx_byte_ack,
+ mi2tx_slot_vld,
+ cfg_uni_mac_mode_change,
+
+ // Phy Signals
+ phy_tx_en,
+ phy_tx_er,
+ phy_txd,
+ phy_tx_clk,
+ phy_rx_clk,
+ tx_reset_n,
+ rx_reset_n,
+ phy_rx_er,
+ phy_rx_dv,
+ phy_rxd,
+ phy_crs,
+ rx_sts_rx_er_reg,
+
+ // Reset signal
+ app_reset_n,
+
+ // Signals from Config Management
+ cf2mi_loopback_en,
+ cf2mi_rmii_en,
+ cf_mac_mode,
+ cf_chk_rx_dfl,
+ cf_silent_mode,
+
+ // Signal from Application to transmit JAM
+ df2rx_dfl_dn,
+
+ // Inputs from Transmit FSM
+ tx2mi_strt_preamble,
+ tx2mi_end_transmit,
+ tx2mi_tx_byte,
+ tx_ch_en
+ );
+
+
+parameter NO_GMII_PREAMBLE = 5'b00111;
+parameter NO_MII_PREAMBLE = 5'b01111;
+parameter NO_RMII_PREAMBLE = 5'b11111;
+parameter GMII_JAM_COUNT = 5'b0011;
+parameter MII_JAM_COUNT = 5'b0111;
+parameter RMII_JAM_COUNT = 5'b1111;
+
+ /******* INPUT & OUTPUT DECLARATIONS *************************/
+
+ output mi2rx_strt_rcv; // This is generated by the MII block to indicate start
+ // of receive data.
+ output mi2rx_rcv_vld; // This signal is asserted by MII on reception of valid
+ // bytes to indicate to the RX block to accept data from PHY
+ output[7:0] mi2rx_rx_byte; // This the receive data from the PHY gathered as bytes
+ output mi2rx_end_rcv; // This signal is asserted with the last data assembled
+ output mi2rx_extend; // This signal is asserted during carrier extension (Receive)
+ output mi2rx_frame_err; // This signal is asserted during Dibit Error (In RMII Mode)
+ // or Nibble Error in (MII Mode)
+ output mi2rx_end_frame; // End of Frame
+ output mi2rx_crs; // CRS signal in rx_clk domain
+ output mi2tx_byte_ack; // MII block acknowledges a byte during transmit
+ output mi2tx_slot_vld; // MII block acknowledges valid slot during transmit // mfilardo
+
+ output phy_tx_en; // Enable data on TX
+ output phy_tx_er; // Transmit Error (Used in Carrier Extension in 1000 Mode)
+ output[7:0] phy_txd; // Transmit data on the line
+
+ input phy_tx_clk; // Transmit Clock in 10/100 Mb/s
+
+ output rx_sts_rx_er_reg;
+ input app_reset_n; // reset from the application interface
+
+ input phy_rx_clk; // Receive Clock in 10/100/1000 Mb/s
+ input phy_rx_er; // Receive Error. Used in Carrier Extension in 1000 Mode
+ input phy_rx_dv; // Receive Data Valid from the PHY
+ input[7:0] phy_rxd; // Receive Data
+ input phy_crs; // Carrier Sense from the line
+
+ input tx_reset_n;
+ input rx_reset_n;
+
+
+ input cf2mi_loopback_en; // loop back enable
+ input cf2mi_rmii_en; // RMII Mode
+ input cf_mac_mode; // Mac Mode 0--> 10/100 Mode, 1--> 1000 Mode
+ input cf_chk_rx_dfl; // Check for Deferal
+ input cf_silent_mode; // PHY Inactive
+ input df2rx_dfl_dn; // Deferal Done in Rx Clock Domain
+ input tx2mi_strt_preamble; // Tx FSM indicates to MII to generate
+ // preamble on the line
+ input tx2mi_end_transmit; // This is provided by the TX block to
+ // indicate end of transmit
+ input[7:0] tx2mi_tx_byte; // 8 bits of data from Tx block
+ input tx_ch_en; // Transmitt Enable
+ input cfg_uni_mac_mode_change;
+
+ /******* WIRE & REG DECLARATION FOR INPUT AND OUTPUTS ********/
+ reg phy_tx_en;
+ reg mi2tx_byte_ack;
+ reg mi2tx_slot_vld;
+ reg [7:0] phy_txd;
+ wire [7:0] mi2rx_rx_byte;
+ reg [7:0] mi2rx_rx_byte_in;
+ reg mi2rx_extend;
+ reg mi2rx_extend_err;
+ reg mi2rx_strt_rcv;
+ reg mi2rx_end_rcv;
+ reg mi2rx_rcv_vld;
+ reg mi2rx_frame_err;
+
+ /*** REG & WIRE DECLARATIONS FOR LOCAL SIGNALS ***************/
+
+ reg [4:0] tx_preamble_cnt_val;
+
+
+ reg strt_rcv_in;
+ reg end_rcv_in;
+ reg rx_dv_in;
+ reg rx_er_in;
+ reg rcv_valid_in;
+
+
+
+ reg [7:0] rxd_in;
+
+ parameter mii_rx_idle_st = 3'd0, mii_rx_pre_st = 3'd1,
+ mii_rx_byte_st = 3'd2, mii_rx_end_st = 3'd3,
+ mii_rx_dibit_st = 3'd4, mii_rx_nibble_st = 3'd5;
+
+ reg [2:0] mii_rx_nxt_st;
+ reg [2:0] mii_rx_cur_st;
+
+ parameter mii_tx_idle_st = 4'd0, mii_tx_pre_st = 4'd1,
+ mii_tx_byte_st = 4'd2, mii_tx_end_st = 4'd3,
+ mii_tx_nibble_st = 4'd5,
+ mii_tx_nibble_end_st = 4'd6, mii_tx_dibit_st = 4'd7,
+ mii_tx_dibit_end_st = 4'd8;
+
+ reg [3:0] mii_tx_cur_st;
+ reg [3:0] mii_tx_nxt_st;
+
+ wire receive_detect;
+ wire pre_condition;
+ wire sfd_condition;
+ wire tx_en;
+ wire tx_er;
+ wire [7:0] txd;
+ wire byte_boundary_rx, byte_boundary_tx;
+
+ reg tx_en_in;
+ reg tx_err_in;
+ reg tx_ext_in;
+ reg tx_pre_in;
+ reg tx_sfd_in;
+ reg tx_xfr_ack_in;
+ reg inc_preamble_cntr;
+ reg rst_preamble_cntr;
+ reg [1:0] tx_xfr_cnt, rx_xfr_cnt, tx_slot_xfr_cnt;
+ reg rx_dv;
+ reg rx_er;
+ reg rcv_err_in;
+ reg mi2rx_end_frame_in;
+
+ reg [1:0] tx_dibit_in;
+ reg mi2rx_extend_in, mi2rx_extend_err_in, mi2rx_end_frame;
+ reg crs_in;
+ reg phy_tx_er;
+
+ wire dibit_check_rx, dibit_check_tx;
+ wire nibble_check_rx, nibble_check_tx;
+ wire pre_condition_gmii, pre_condition_mii, pre_condition_rmii;
+ wire sfd_condition_gmii, sfd_condition_mii, sfd_condition_rmii;
+ wire [3:0] tx_nibble_in;
+ reg [7:0] rxd;
+ wire receive_detect_pulse;
+ reg d_receive_detect;
+
+
+ reg lb_tx_en, lb_tx_er;
+ reg rx_dv_del;
+ reg [1:0] rxd_del;
+ reg rx_dfl_dn;
+ reg rx_dfl_dn_reg;
+
+
+ /******** SEQUENTIAL LOGIC **********************************/
+
+ // This logic generates appropriate receive data valid
+ // in case of loop back
+ always @(tx_en or phy_rxd or txd or phy_rx_dv or tx_er or phy_crs
+ or cf2mi_loopback_en or phy_tx_en or phy_rx_er or
+ cf2mi_rmii_en or cf_mac_mode)
+ begin
+ if(cf2mi_loopback_en)
+ begin
+ rx_dv_in = tx_en;
+ rx_er_in = tx_er;
+ rxd_in = txd;
+ crs_in = (tx_en | tx_er) && cf_mac_mode;
+ end // if (mii_loopback_en)
+ else
+ begin
+ rx_dv_in = phy_rx_dv ;
+ rx_er_in = phy_rx_er;
+ rxd_in = phy_rxd;
+ // *** NOTE ****
+ // phy_crs should be a combination of crs and tx_en
+ // In Full Duplex tx_en determines deferral in half duplex
+ // crs determines deferral
+ crs_in = (tx_en | tx_er);
+ end // else: !if(mii_loopback_en)
+ end
+
+
+ // Following state machine is to detect start preamble and
+ // transmit preamble and sfd and then the data.
+ // This state machine also generates acknowledge to TX block
+ // to allow the TX block to update its byte pointers
+ always @(posedge phy_tx_clk or negedge tx_reset_n)
+ begin
+ if(!tx_reset_n)
+ begin
+ mii_tx_cur_st <= mii_tx_idle_st;
+ end
+ else if (tx_ch_en)
+ begin
+ mii_tx_cur_st <= mii_tx_nxt_st;
+ end
+ else
+ begin
+ mii_tx_cur_st <= mii_tx_idle_st;
+ end
+ end
+
+ always @(mii_tx_cur_st or tx2mi_strt_preamble or tx2mi_end_transmit or cf_mac_mode
+ or cf2mi_rmii_en or tx_preamble_cnt_val or byte_boundary_tx
+ or tx_xfr_cnt or receive_detect
+ or receive_detect_pulse or cfg_uni_mac_mode_change)
+ begin
+
+ mii_tx_nxt_st = mii_tx_cur_st;
+ tx_en_in = 1'b0;
+ tx_pre_in = 1'b0;
+ tx_sfd_in = 1'b0;
+ tx_err_in = 1'b0;
+ tx_ext_in = 1'b0;
+ inc_preamble_cntr = 1'b0;
+ rst_preamble_cntr = 1'b0;
+ tx_xfr_ack_in = 1'b0;
+
+ casex(mii_tx_cur_st) // synopsys parallel_case full_case
+
+ mii_tx_idle_st:
+ // wait from start from transmit state machine
+ begin
+ if(tx2mi_strt_preamble)
+ begin
+ inc_preamble_cntr = 1'b1;
+ tx_en_in = 1'b1;
+ tx_pre_in = 1'b1;
+ mii_tx_nxt_st = mii_tx_pre_st;
+ end
+ else
+ mii_tx_nxt_st = mii_tx_idle_st;
+ end
+
+ mii_tx_pre_st:
+ // This state generates the preamble to be transmitted and
+ // generates SFD before transitioning the data state
+ begin
+ if((tx_preamble_cnt_val == NO_GMII_PREAMBLE) && cf_mac_mode)
+ begin
+ tx_en_in = 1'b1;
+ tx_sfd_in = 1'b1;
+ tx_xfr_ack_in = 1'b1;
+ rst_preamble_cntr = 1'b1;
+ mii_tx_nxt_st = mii_tx_byte_st;
+ end
+ else if((tx_preamble_cnt_val == NO_MII_PREAMBLE) && !cf_mac_mode &&
+ !cf2mi_rmii_en)
+ begin
+ tx_en_in = 1'b1;
+ tx_sfd_in = 1'b1;
+ tx_xfr_ack_in = 1'b1;
+ rst_preamble_cntr = 1'b1;
+ mii_tx_nxt_st = mii_tx_nibble_st;
+ end
+ else if((tx_preamble_cnt_val == NO_RMII_PREAMBLE) && !cf_mac_mode &&
+ cf2mi_rmii_en)
+ begin
+ tx_en_in = 1'b1;
+ tx_sfd_in = 1'b1;
+ tx_xfr_ack_in = 1'b1;
+ rst_preamble_cntr = 1'b1;
+ mii_tx_nxt_st = mii_tx_dibit_st;
+ end
+ else
+ begin
+ inc_preamble_cntr = 1'b1;
+ tx_en_in = 1'b1;
+ tx_pre_in = 1'b1;
+ mii_tx_nxt_st = mii_tx_pre_st;
+ end
+ end
+
+ mii_tx_byte_st:
+ // This state picks up a byte from the transmit block
+ // before transmitting on the line
+ begin
+ if(tx2mi_end_transmit && byte_boundary_tx )
+ begin
+ tx_en_in = 1'b1;
+ tx_xfr_ack_in = 1'b0;
+ mii_tx_nxt_st = mii_tx_end_st;
+ end
+ else if (!cf_mac_mode & cfg_uni_mac_mode_change)
+ begin
+ tx_en_in = 1'b1;
+ tx_xfr_ack_in = 1'b1;
+ mii_tx_nxt_st = mii_tx_nibble_st;
+ end
+ else
+ begin
+ tx_en_in = 1'b1;
+ tx_xfr_ack_in = 1'b1;
+ mii_tx_nxt_st = mii_tx_byte_st;
+ end
+ end
+
+ /*mii_tx_byte_st:
+ // This state picks up a byte from the transmit block
+ // before transmitting on the line
+ begin
+ if(tx2mi_end_transmit && byte_boundary_tx )
+ begin
+ tx_en_in = 1'b1;
+ tx_xfr_ack_in = 1'b0;
+ mii_tx_nxt_st = mii_tx_end_st;
+ end
+ else
+ begin
+ tx_en_in = 1'b1;
+ tx_xfr_ack_in = 1'b1;
+ mii_tx_nxt_st = mii_tx_byte_st;
+ end
+ end*/
+
+ mii_tx_end_st:
+ // This state checks for the end of transfer
+ // and extend for carrier extension
+ begin
+ if(tx2mi_strt_preamble)
+ begin
+ tx_en_in = 1'b1;
+ tx_pre_in = 1'b1;
+ mii_tx_nxt_st = mii_tx_pre_st;
+ end
+ else
+ begin
+ tx_en_in = 1'b0;
+ mii_tx_nxt_st = mii_tx_idle_st;
+ end
+ end
+
+ /*mii_tx_nibble_st:
+ // This state picks up a byte from the transmit block
+ // before transmitting on the line
+ begin
+ if(tx2mi_end_transmit && !byte_boundary_tx )
+ begin
+ tx_en_in = 1'b1;
+ tx_xfr_ack_in = 1'b1;
+ mii_tx_nxt_st = mii_tx_nibble_end_st;
+ end
+ else
+ begin
+ tx_en_in = 1'b1;
+ tx_xfr_ack_in = 1'b1;
+ mii_tx_nxt_st = mii_tx_nibble_st;
+ end
+ end*/
+
+ mii_tx_nibble_st:
+ // This state picks up a byte from the transmit block
+ // before transmitting on the line
+ begin
+ if(tx2mi_end_transmit && !byte_boundary_tx )
+ begin
+ tx_en_in = 1'b1;
+ tx_xfr_ack_in = 1'b1;
+ mii_tx_nxt_st = mii_tx_nibble_end_st;
+ end
+ else if (cf_mac_mode & cfg_uni_mac_mode_change)
+ begin
+ tx_en_in = 1'b1;
+ tx_xfr_ack_in = 1'b1;
+ mii_tx_nxt_st = mii_tx_byte_st;
+ end
+ else
+ begin
+ tx_en_in = 1'b1;
+ tx_xfr_ack_in = 1'b1;
+ mii_tx_nxt_st = mii_tx_nibble_st;
+ end
+ end
+
+ mii_tx_nibble_end_st:
+ // This state checks for the end of transfer
+ // and extend for carrier extension
+ begin
+ if(tx2mi_strt_preamble)
+ begin
+ tx_en_in = 1'b1;
+ tx_pre_in = 1'b1;
+ mii_tx_nxt_st = mii_tx_pre_st;
+ end
+ else
+ begin
+ tx_en_in = 1'b0;
+ mii_tx_nxt_st = mii_tx_idle_st;
+ end
+ end
+
+ mii_tx_dibit_st:
+ // This state picks up a byte from the transmit block
+ // before transmitting on the line
+ begin
+ if(tx2mi_end_transmit && (tx_xfr_cnt[0]) && (tx_xfr_cnt[1]) )
+ begin
+ tx_en_in = 1'b1;
+ tx_xfr_ack_in = 1'b1;
+ mii_tx_nxt_st = mii_tx_dibit_end_st;
+ end
+ else
+ begin
+ tx_en_in = 1'b1;
+ tx_xfr_ack_in = 1'b1;
+ mii_tx_nxt_st = mii_tx_dibit_st;
+ end
+ end
+
+ mii_tx_dibit_end_st:
+ // This state checks for the end of transfer
+ // and extend for carrier extension
+ begin
+ if(tx2mi_strt_preamble)
+ begin
+ tx_en_in = 1'b1;
+ tx_pre_in = 1'b1;
+ mii_tx_nxt_st = mii_tx_pre_st;
+ end
+ else
+ begin
+ tx_en_in = 1'b1;
+ mii_tx_nxt_st = mii_tx_idle_st;
+ end
+ end
+ endcase
+ end // end always
+
+ // All the data, enable and ack signals leaving this blocks are
+ // registered tx_data and tx_en are outputs going to PHY tx_nibble_ack
+ // is indicating to the TX block of acceptance of data nibble
+ always @(posedge phy_tx_clk or negedge tx_reset_n)
+ begin
+ if(!tx_reset_n)
+ begin
+ lb_tx_en <= 1'b0;
+ lb_tx_er <= 1'b0;
+ phy_tx_en <= 1'b0;
+ phy_tx_er <= 1'b0;
+ mi2tx_byte_ack <= 1'b0;
+ mi2tx_slot_vld <= 1'b0;
+ end
+ else
+ begin
+ lb_tx_en <= tx_en_in;
+ lb_tx_er <= tx_err_in;
+ phy_tx_en <= (cf_silent_mode) ? 1'b0 : tx_en_in;
+ phy_tx_er <= (cf_silent_mode) ? 1'b0 : tx_err_in;
+ mi2tx_byte_ack <= (cf_mac_mode || (cf2mi_rmii_en && tx_xfr_cnt[1] && !tx_xfr_cnt[0]) ||
+ (!cf2mi_rmii_en && nibble_check_tx)) ? tx_xfr_ack_in : 1'b0;
+ mi2tx_slot_vld <= (cf_mac_mode || (cf2mi_rmii_en && tx_slot_xfr_cnt[1] && !tx_slot_xfr_cnt[0]) ||
+ (!cf2mi_rmii_en && tx_slot_xfr_cnt[0] )) ? (tx_xfr_ack_in || inc_preamble_cntr) : 1'b0;
+ end
+ end
+
+ always @(posedge phy_tx_clk or negedge tx_reset_n)
+ begin
+ if(!tx_reset_n)
+ begin
+ phy_txd[7:0] <= 8'b00000000;
+ end
+ else
+ begin
+ if (cf_mac_mode)
+ phy_txd[7:0] <= (tx_pre_in) ? 8'b01010101 : ((tx_sfd_in) ?
+ 8'b11010101 : ((tx_ext_in) ? 8'b00001111: tx2mi_tx_byte));
+ else if (!cf_mac_mode && !cf2mi_rmii_en)
+ phy_txd[3:0] <= (tx_pre_in) ? 4'b0101 : ((tx_sfd_in) ?
+ 4'b1101 : tx_nibble_in) ;
+ else if (!cf_mac_mode && cf2mi_rmii_en)
+ phy_txd[1:0] <= (tx_pre_in) ? 2'b01 : ((tx_sfd_in) ?
+ 2'b11 : tx_dibit_in) ;
+ end
+ end
+ assign receive_detect_pulse = receive_detect && !d_receive_detect;
+
+
+ always @(posedge phy_tx_clk or negedge tx_reset_n)
+ begin
+ if(!tx_reset_n)
+ d_receive_detect <= 0;
+ else
+ d_receive_detect <= receive_detect;
+ end
+ // counter for the number transfers
+ always @(posedge phy_tx_clk or negedge tx_reset_n)
+ begin
+ if(!tx_reset_n)
+ tx_xfr_cnt <= 2'd0;
+ else if(tx2mi_strt_preamble)
+ tx_xfr_cnt <= 2'd0;
+ else if(tx_xfr_ack_in)
+ tx_xfr_cnt <= tx_xfr_cnt + 1;
+ end
+
+ // phy_tx_en_dly
+ reg phy_tx_en_dly;
+ always @(posedge phy_tx_clk or negedge tx_reset_n)
+ begin
+ if(!tx_reset_n)
+ phy_tx_en_dly <= 1'd0;
+ else
+ phy_tx_en_dly <= phy_tx_en;
+ end
+
+ wire phy_tx_en_fall;
+ assign phy_tx_en_fall = phy_tx_en_dly && !phy_tx_en;
+
+ // counter for the number transfers ...
+ always @(posedge phy_tx_clk or negedge tx_reset_n)
+ begin
+ if(!tx_reset_n)
+ tx_slot_xfr_cnt <= 2'd0;
+ else if(phy_tx_en_fall)
+ tx_slot_xfr_cnt <= 2'd0;
+ else if(inc_preamble_cntr || tx_xfr_ack_in)
+ tx_slot_xfr_cnt <= tx_slot_xfr_cnt + 1;
+ end
+
+ assign nibble_check_tx = tx_xfr_cnt[0];
+ assign dibit_check_tx= tx_xfr_cnt[0] && tx_xfr_cnt[1];
+ assign byte_boundary_tx = (cf_mac_mode) ? 1'b1:
+ ((!cf_mac_mode && !cf2mi_rmii_en) ? nibble_check_tx : dibit_check_tx);
+
+ assign tx_nibble_in = (tx_xfr_cnt[0]) ? tx2mi_tx_byte[3:0] : tx2mi_tx_byte[7:4];
+
+/* always @(tx_xfr_cnt or tx2mi_tx_byte or phy_tx_clk)
+ begin
+ if (!tx_xfr_cnt[1] && !tx_xfr_cnt[0])
+ tx_dibit_in <= tx2mi_tx_byte[1:0];
+ else if (!tx_xfr_cnt[1] && tx_xfr_cnt[0])
+ tx_dibit_in <= tx2mi_tx_byte[3:2];
+ else if (tx_xfr_cnt[1] && !tx_xfr_cnt[0])
+ tx_dibit_in <= tx2mi_tx_byte[5:4];
+ else if (tx_xfr_cnt[1] && tx_xfr_cnt[0])
+ tx_dibit_in <= tx2mi_tx_byte[7:6];
+ else
+ tx_dibit_in <= tx2mi_tx_byte[1:0];
+ end
+*/
+ always @(posedge phy_tx_clk or negedge tx_reset_n)
+ begin
+ if(!tx_reset_n)
+ tx_dibit_in <= 2'b0;
+ else if(tx2mi_strt_preamble)
+ tx_dibit_in <= 2'b0;
+ else
+ begin
+ if (!tx_xfr_cnt[1] && !tx_xfr_cnt[0])
+ tx_dibit_in <= tx2mi_tx_byte[1:0];
+ else if (!tx_xfr_cnt[1] && tx_xfr_cnt[0])
+ tx_dibit_in <= tx2mi_tx_byte[3:2];
+ else if (tx_xfr_cnt[1] && !tx_xfr_cnt[0])
+ tx_dibit_in <= tx2mi_tx_byte[5:4];
+ else if (tx_xfr_cnt[1] && tx_xfr_cnt[0])
+ tx_dibit_in <= tx2mi_tx_byte[7:6];
+ end
+ end
+
+ // counter for the number of preamble to be sent
+ // before transmitting the sfd
+ always @(posedge phy_tx_clk or negedge tx_reset_n)
+ begin
+ if(!tx_reset_n)
+ tx_preamble_cnt_val <= 5'd0;
+ else if(rst_preamble_cntr)
+ tx_preamble_cnt_val <= 5'd0;
+ else if(inc_preamble_cntr)
+ tx_preamble_cnt_val <= tx_preamble_cnt_val + 1;
+ end
+
+
+
+ always @(posedge phy_rx_clk or negedge rx_reset_n)
+ begin
+ if(!rx_reset_n)
+ rx_dfl_dn_reg <= 1'b0;
+ else if (df2rx_dfl_dn)
+ rx_dfl_dn_reg <= 1'b1;
+ else
+ begin
+ if (!phy_rx_dv && !phy_rx_er)
+ rx_dfl_dn_reg <= 1'b0;
+ end
+ end
+
+ assign mi2rx_rx_byte = mi2rx_rx_byte_in;
+ //assign rxd = (!cf_mac_mode && cf2mi_rmii_en)? mi2rx_rx_byte : mi2rx_rx_byte_in;
+
+ assign pre_condition_gmii = (!rxd[7] && rxd[6] && !rxd[5] && rxd[4]
+ && !rxd[3] && rxd[2] && !rxd[1] && rxd[0] && rx_dv
+ && !(!rx_dfl_dn_reg && cf_chk_rx_dfl));
+
+ assign pre_condition_mii = (!rxd[3] && rxd[2] && !rxd[1] && rxd[0] && rx_dv
+ && !(!rx_dfl_dn_reg && cf_chk_rx_dfl));
+
+ assign pre_condition_rmii = (!rxd[1] && rxd[0] && rx_dv
+ && !rxd_del[1] && rxd_del[0] && rx_dv_del
+ && !(!rx_dfl_dn_reg && cf_chk_rx_dfl));
+
+ assign sfd_condition_gmii = (rxd[7] && rxd[6] && !rxd[5] && rxd[4]
+ && !rxd[3] && rxd[2] && !rxd[1] && rxd[0] && rx_dv
+ && !(!rx_dfl_dn_reg && cf_chk_rx_dfl));
+
+ assign sfd_condition_mii = (rxd[3] && rxd[2] && !rxd[1] && rxd[0] && rx_dv
+ && !(!rx_dfl_dn_reg && cf_chk_rx_dfl));
+
+ assign sfd_condition_rmii = (rxd[1] && rxd[0] && rx_dv
+ && !rxd_del[1] && rxd_del[0] && rx_dv_del
+ && !(!rx_dfl_dn_reg && cf_chk_rx_dfl));
+
+
+
+ assign pre_condition = (cf_mac_mode) ? pre_condition_gmii :
+ ((cf2mi_rmii_en) ? pre_condition_rmii : pre_condition_mii);
+
+ assign sfd_condition = (cf_mac_mode) ? sfd_condition_gmii :
+ ((cf2mi_rmii_en) ? sfd_condition_rmii : sfd_condition_mii);
+
+ // Following state machine is to detect strt preamble and
+ // receive preamble and sfd and then the data.
+ always @(posedge phy_rx_clk or negedge rx_reset_n)
+ begin
+ if(!rx_reset_n)
+ begin
+ mii_rx_cur_st <= mii_rx_idle_st;
+ end
+ else
+ begin
+ mii_rx_cur_st <= mii_rx_nxt_st;
+ end
+ end
+
+ always @(mii_rx_cur_st or rx_dv or rx_er or pre_condition or sfd_condition
+ or byte_boundary_rx or rxd or rx_xfr_cnt or cf2mi_rmii_en or cf_mac_mode)
+ begin
+ mii_rx_nxt_st = mii_rx_cur_st;
+ strt_rcv_in = 1'b0;
+ end_rcv_in = 1'b0;
+ rcv_valid_in = 1'b0;
+ rcv_err_in = 1'b0;
+ mi2rx_extend_in = 1'b0;
+ mi2rx_extend_err_in = 1'b0;
+ mi2rx_end_frame_in = 1'b0;
+
+ casex(mii_rx_cur_st) // synopsys parallel_case full_case
+
+ mii_rx_idle_st:
+ // This state is waiting for pre-amble to
+ // appear on the line in Receive mode
+ begin
+ if(pre_condition)
+ mii_rx_nxt_st = mii_rx_pre_st;
+ else
+ mii_rx_nxt_st = mii_rx_idle_st;
+ end
+
+ mii_rx_pre_st:
+ // This state checks the pre-amble and Waits for SFD on the line
+ begin
+ if(sfd_condition)
+ begin
+ strt_rcv_in = 1'b1;
+ if(cf_mac_mode)
+ mii_rx_nxt_st = mii_rx_byte_st;
+ else if(!cf_mac_mode && !cf2mi_rmii_en)
+ mii_rx_nxt_st = mii_rx_nibble_st;
+ else if(!cf_mac_mode && cf2mi_rmii_en)
+ mii_rx_nxt_st = mii_rx_dibit_st;
+ end
+ else if(pre_condition)
+ begin
+ mii_rx_nxt_st = mii_rx_pre_st;
+ end
+ else if(!rx_dv && rx_er && cf_mac_mode)
+ begin
+ mi2rx_extend_in = (rxd == 8'h0F) ? 1'b1: 1'b0;
+ mi2rx_extend_err_in = (rxd == 8'h1F) ? 1'b1: 1'b0;
+ mii_rx_nxt_st = mii_rx_pre_st;
+ end
+ else
+ begin
+ mi2rx_end_frame_in = 1'b1;
+ mii_rx_nxt_st = mii_rx_idle_st;
+ end
+ end
+
+ mii_rx_byte_st:
+ // This state looks for data validity and latches di-bit2 and
+ // sends it to the receiver
+ begin
+ if(rx_dv)
+ begin
+ rcv_valid_in = 1'b1;
+ mii_rx_nxt_st = mii_rx_byte_st;
+ end
+ else if (!rx_dv && rx_er && cf_mac_mode)
+ begin
+ mi2rx_extend_in = (rxd == 8'h0F) ? 1'b1: 1'b0;
+ mi2rx_extend_err_in = (rxd == 8'h1F) ? 1'b1: 1'b0;
+ end_rcv_in = 1'b1;
+ mii_rx_nxt_st = mii_rx_pre_st;
+ end
+ else
+ begin
+ end_rcv_in = 1'b1;
+ mii_rx_nxt_st = mii_rx_end_st;
+ end
+ end
+
+ mii_rx_end_st:
+ // This state looks for data validity and latches di-bit2 and
+ // sends it to the receiver
+ mii_rx_nxt_st = mii_rx_idle_st;
+
+ mii_rx_nibble_st:
+ begin
+ if(rx_dv)
+ begin
+ rcv_valid_in = 1'b1;
+ mii_rx_nxt_st = mii_rx_nibble_st;
+ end
+ else
+ begin
+ end_rcv_in = 1'b1;
+ mii_rx_nxt_st = mii_rx_end_st;
+ if(rx_xfr_cnt[0])
+ rcv_err_in = 1'b1;
+ end
+ end
+
+ mii_rx_dibit_st:
+ begin
+ if(rx_dv)
+ begin
+ rcv_valid_in = 1'b1;
+ mii_rx_nxt_st = mii_rx_dibit_st;
+ end
+ else
+ begin
+ end_rcv_in = 1'b1;
+ mii_rx_nxt_st = mii_rx_end_st;
+ if(!(!rx_xfr_cnt[0] && !rx_xfr_cnt[1]))
+ rcv_err_in = 1'b1;
+ end
+ end
+
+ endcase
+ end // always @ (mii_rx_cur_st...
+
+ // counter for the number receives
+ always @(posedge phy_rx_clk or negedge rx_reset_n)
+ begin
+ if(!rx_reset_n)
+ rx_xfr_cnt <= 2'd0;
+ else if(mi2rx_end_rcv)
+ rx_xfr_cnt <= 2'd0;
+ else if(rcv_valid_in)
+ rx_xfr_cnt <= rx_xfr_cnt + 1;
+ end
+
+ always @(posedge phy_rx_clk or negedge rx_reset_n)
+ begin
+ if(!rx_reset_n)
+ begin
+ mi2rx_rx_byte_in <= 8'b0;
+ rxd <= 8'b0;
+ rxd_del <= 2'b0;
+ end
+ else
+ begin
+ rxd <= rxd_in;
+// rxd_del <= rxd_in[1:0];
+ rxd_del <= rxd[1:0];
+
+ if (cf_mac_mode)
+ mi2rx_rx_byte_in <= rxd;
+ else if (!cf_mac_mode && !cf2mi_rmii_en)
+ begin
+ if(!rx_xfr_cnt[0])
+ mi2rx_rx_byte_in[3:0] <= rxd[3:0];
+ else
+ mi2rx_rx_byte_in[7:4] <= rxd[3:0];
+ end
+ else if(!cf_mac_mode && cf2mi_rmii_en)
+ begin
+ if(!rx_xfr_cnt[1] && !rx_xfr_cnt[0])
+ mi2rx_rx_byte_in[1:0] <= rxd[1:0];
+ else if(!rx_xfr_cnt[1] && rx_xfr_cnt[0])
+ mi2rx_rx_byte_in[3:2] <= rxd[1:0];
+ else if(rx_xfr_cnt[1] && !rx_xfr_cnt[0])
+ mi2rx_rx_byte_in[5:4] <= rxd[1:0];
+ else if(rx_xfr_cnt[1] && rx_xfr_cnt[0])
+ mi2rx_rx_byte_in[7:6] <= rxd[1:0];
+ end
+ end
+ end
+
+ reg rx_sts_rx_er_reg;
+ always @(posedge phy_rx_clk or negedge rx_reset_n) begin
+ if(!rx_reset_n) begin
+ rx_sts_rx_er_reg <= 1'b0;
+ end
+ else if (mi2rx_strt_rcv) begin
+ rx_sts_rx_er_reg <= 1'b0;
+ end
+ else if(phy_rx_dv && phy_rx_er) begin
+ rx_sts_rx_er_reg <= 1'b1;
+ end
+ end
+
+ always @(posedge phy_rx_clk
+ or negedge rx_reset_n)
+ begin
+ if(!rx_reset_n)
+ begin
+ mi2rx_rcv_vld <= 1'b0;
+ end
+ else if(cf_mac_mode)
+ mi2rx_rcv_vld <= rcv_valid_in;
+ else if(!cf_mac_mode && cf2mi_rmii_en && rx_xfr_cnt[0] && rx_xfr_cnt[1])
+ mi2rx_rcv_vld <= rcv_valid_in;
+ else if(!cf_mac_mode && !cf2mi_rmii_en && rx_xfr_cnt[0])
+ mi2rx_rcv_vld <= rcv_valid_in;
+ else
+ mi2rx_rcv_vld <= 1'b0;
+ end
+ // All the data, enable and ack signals out of RX block are
+ // registered
+ always @(posedge phy_rx_clk or negedge rx_reset_n)
+ begin
+ if(!rx_reset_n)
+ begin
+ mi2rx_strt_rcv <= 1'b0;
+ mi2rx_end_rcv <= 1'b0;
+ //mi2rx_rcv_vld <= 1'b0;
+ mi2rx_frame_err <= 1'b0;
+ mi2rx_extend <= 1'b0;
+ mi2rx_extend_err <= 1'b0;
+ mi2rx_end_frame <= 1'b0;
+ rx_dv <= 1'b0;
+ rx_er <= 1'b0;
+ rx_dv_del <= 1'b0;
+ end
+ else
+ begin
+ mi2rx_strt_rcv <= strt_rcv_in;
+ mi2rx_end_rcv <= end_rcv_in;
+ //mi2rx_rcv_vld <= rcv_valid_in;
+ mi2rx_frame_err <= rcv_err_in;
+ mi2rx_extend <= mi2rx_extend_in;
+ mi2rx_extend_err <= mi2rx_extend_err_in;
+ mi2rx_end_frame <= mi2rx_end_frame_in;
+ rx_dv <= rx_dv_in;
+ rx_er <= rx_er_in;
+ rx_dv_del <= rx_dv;
+ end
+ end
+
+
+
+ half_dup_dble_reg U_dble_reg1 (
+ //outputs
+ .sync_out_pulse(receive_detect),
+ //inputs
+ .in_pulse(rx_dv_in),
+ .dest_clk(phy_tx_clk),
+ .reset_n(tx_reset_n)
+ );
+
+
+wire test;
+
+ half_dup_dble_reg U_dble_reg5 (
+ //outputs
+ .sync_out_pulse(tx_en),
+ //inputs
+ .in_pulse(lb_tx_en),
+ .dest_clk(phy_rx_clk),
+ .reset_n(rx_reset_n)
+ );
+
+ half_dup_dble_reg U_dble_reg6 (
+ //outputs
+ .sync_out_pulse(txd[0]),
+ //inputs
+ .in_pulse(phy_txd[0]),
+ .dest_clk(phy_rx_clk),
+ .reset_n(rx_reset_n)
+ );
+
+ half_dup_dble_reg U_dble_reg7 (
+ //outputs
+ .sync_out_pulse(txd[1]),
+ //inputs
+ .in_pulse(phy_txd[1]),
+ .dest_clk(phy_rx_clk),
+ .reset_n(rx_reset_n)
+ );
+
+ half_dup_dble_reg U_dble_reg8 (
+ //outputs
+ .sync_out_pulse(txd[2]),
+ //inputs
+ .in_pulse(phy_txd[2]),
+ .dest_clk(phy_rx_clk),
+ .reset_n(rx_reset_n)
+ );
+
+ half_dup_dble_reg U_dble_reg9 (
+ //outputs
+ .sync_out_pulse(txd[3]),
+ //inputs
+ .in_pulse(phy_txd[3]),
+ .dest_clk(phy_rx_clk),
+ .reset_n(rx_reset_n)
+ );
+
+ half_dup_dble_reg U_dble_reg10 (
+ //outputs
+ .sync_out_pulse(txd[4]),
+ //inputs
+ .in_pulse(phy_txd[4]),
+ .dest_clk(phy_rx_clk),
+ .reset_n(rx_reset_n)
+ );
+
+
+ half_dup_dble_reg U_dble_reg11 (
+ //outputs
+ .sync_out_pulse(txd[5]),
+ //inputs
+ .in_pulse(phy_txd[5]),
+ .dest_clk(phy_rx_clk),
+ .reset_n(rx_reset_n)
+ );
+
+
+ half_dup_dble_reg U_dble_reg12 (
+ //outputs
+ .sync_out_pulse(txd[6]),
+ //inputs
+ .in_pulse(phy_txd[6]),
+ .dest_clk(phy_rx_clk),
+ .reset_n(rx_reset_n)
+ );
+
+
+ half_dup_dble_reg U_dble_reg13 (
+ //outputs
+ .sync_out_pulse(txd[7]),
+ //inputs
+ .in_pulse(phy_txd[7]),
+ .dest_clk(phy_rx_clk),
+ .reset_n(rx_reset_n)
+ );
+
+
+ half_dup_dble_reg U_dble_reg14 (
+ //outputs
+ .sync_out_pulse(tx_er),
+ //inputs
+ .in_pulse(lb_tx_er),
+ .dest_clk(phy_rx_clk),
+ .reset_n(rx_reset_n)
+ );
+
+
+ half_dup_dble_reg U_dble_reg15 (
+ //outputs
+ .sync_out_pulse(mi2rx_crs),
+ //inputs
+ .in_pulse(crs_in),
+ .dest_clk(phy_rx_clk),
+ .reset_n(rx_reset_n)
+ );
+
+endmodule
+
diff --git a/verilog/rtl/gmac/mac/g_rx_fsm.v b/verilog/rtl/gmac/mac/g_rx_fsm.v
new file mode 100755
index 0000000..97df8dd
--- /dev/null
+++ b/verilog/rtl/gmac/mac/g_rx_fsm.v
@@ -0,0 +1,1109 @@
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Tubo 8051 cores MAC Interface Module ////
+//// ////
+//// This file is part of the Turbo 8051 cores project ////
+//// http://www.opencores.org/cores/turbo8051/ ////
+//// ////
+//// Description ////
+//// Turbo 8051 definitions. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : Mar 2, 2011 ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+/***************************************************************
+ Description:
+
+ rx_fsm.v: This verilog file is the receive state machine for the MAC
+ block. It receives nibbles from rmii block. It assembles
+ double words from bytes. Generates writes to Receive FIFO
+ Removes padding and generates appropriate signals to the
+ CRC and Address Filtering block. It also generates the necessary
+ signals to generate status for every frame.
+
+ ***************************************************************/
+/************** MODULE DECLARATION ****************************/
+module g_rx_fsm(
+ // Status information to Applications
+ rx_sts_vld,
+ rx_sts_bytes_rcvd,
+ rx_sts_large_pkt,
+ rx_sts_lengthfield_err,
+ rx_sts_crc_err,
+ rx_sts_runt_pkt_rcvd,
+ rx_sts_rx_overrun,
+ rx_sts_frm_length_err,
+ rx_sts_len_mismatch,
+ // Data Signals to Fifo Management Block
+ clr_rx_error_from_rx_fsm,
+ rx2ap_rx_fsm_wrt,
+ rx2ap_rx_fsm_dt,
+ // Fifo Control Signal to Fifo Management Block
+ rx2ap_commit_write,
+ rx2ap_rewind_write,
+ // To address filtering block
+ //commit
+ commit_write_done,
+
+ // Global Signals
+ reset_n,
+ phy_rx_clk,
+ // Signals from Mii/Rmii block for Receive data
+ mi2rx_strt_rcv,
+ mi2rx_rcv_vld,
+ mi2rx_rx_byte,
+ mi2rx_end_rcv,
+ mi2rx_extend,
+ mi2rx_frame_err,
+ mi2rx_end_frame,
+ // Rx fifo management signal to indicate overrun
+ rx_fifo_full,
+ ap2rx_rx_fifo_err,
+ // Signal from CRC check block
+ rc2rx_crc_ok,
+ // Signals from Config Management Block
+ cf2rx_max_pkt_sz,
+ cf2rx_rx_ch_en,
+ cf2rx_strp_pad_en,
+ cf2rx_snd_crc,
+ cf2rx_rcv_runt_pkt_en,
+ cf2rx_gigabit_xfr,
+ //for crs based flow control
+ phy_crs
+
+ );
+
+
+parameter MIN_FRM_SIZE = 6'h2e ;
+ /******* INPUT & OUTPUT DECLARATIONS *************************/
+ output rx_sts_vld; // Receive status is available for the application
+ output [15:0] rx_sts_bytes_rcvd;
+ output rx_sts_large_pkt;
+ output rx_sts_lengthfield_err;
+ output rx_sts_crc_err;
+ output rx_sts_runt_pkt_rcvd;
+ output rx_sts_rx_overrun;
+ output rx_sts_frm_length_err;
+ output rx_sts_len_mismatch;
+
+ output rx2ap_rx_fsm_wrt; // Receive Fifo Write
+ output [8:0] rx2ap_rx_fsm_dt; // This is 32 bit assembled receive data
+ // with EOP and valid bytes information in it.
+ output rx2ap_commit_write; // This is to RX fifo MGMT to indicate
+ // that the current packet
+ // has to be sent to application
+ output rx2ap_rewind_write; // This indicates the previous packet
+ // in the FIFO has a error
+ // Ignore the packet and restart from the
+ // end of previous packet
+ output clr_rx_error_from_rx_fsm;
+ output commit_write_done;
+
+ input reset_n; // reset from mac application interface
+ input phy_rx_clk; // Reference clock used for RX
+
+ input mi2rx_strt_rcv; // Receive data from the PHY
+ input mi2rx_rcv_vld; // Received nibble is valid
+ input [7:0] mi2rx_rx_byte; // Rx nibble from the RMII/MII block
+ input mi2rx_end_rcv; // This is provided by the RMII/MII
+ // block to indicate
+ // end of receieve
+ input mi2rx_frame_err;
+ input mi2rx_end_frame;
+ input rx_fifo_full;
+ input ap2rx_rx_fifo_err; // Receive error generated by the
+ // RX FIFO MGMT block
+
+ input rc2rx_crc_ok; // CRC of the receiving packet is OK.
+ // Generated by CRC block
+
+ input [15:0] cf2rx_max_pkt_sz; // max packet size
+
+ input cf2rx_rx_ch_en; // Receive Enabled
+ input cf2rx_strp_pad_en; // Do not Append padding after the data
+ input cf2rx_snd_crc; // Append CRC to the data
+ // ( This automatically means padding
+ // will be enabled)
+ input cf2rx_rcv_runt_pkt_en; // Receive needs to receive
+ input cf2rx_gigabit_xfr;
+ input mi2rx_extend;
+
+ //for crs based flow control
+ input phy_crs;
+
+
+ /******* WIRE & REG DECLARATION FOR INPUT AND OUTPUTS ********/
+ reg rx2ap_commit_write;
+ reg rx2ap_rewind_write;
+ reg [8:0] rx2ap_rx_fsm_dt;
+ reg rx2ap_rx_fsm_wrt;
+ wire [31:0] rx_sts_dt;
+ reg [31:0] rx_sts;
+
+ /*** REG & WIRE DECLARATIONS FOR LOCAL SIGNALS ***************/
+ reg commit_write;
+ reg rewind_write;
+ wire look_at_length_field;
+ reg send_crc;
+ reg rcv_pad_data;
+ reg first_dword;
+ wire [15:0] inc_rcv_byte_count;
+ reg [15:0] rcv_byte_count;
+ reg reset_tmp_count;
+ reg ld_length_byte_1,ld_length_byte_2;
+ reg set_crc_error;
+ reg set_byte_allgn_error;
+ reg rx_sts_vld,e_rx_sts_vld;
+ reg padding_needed;
+ reg dec_data_len;
+ reg dec_pad_len;
+ reg gen_eop;
+ reg set_frm_lngth_error;
+ reg set_incomplete_frm;
+ reg byte_boundary;
+ reg error;
+ reg error_seen;
+ reg commit_write_done;
+ reg check_padding;
+ reg check_padding_in;
+ reg [2:0] padding_len_reg;
+ reg [15:0] rcv_length_reg;
+ reg [15:0] length_counter;
+
+ reg [18:0] rx_fsm_cur_st;
+ reg [18:0] rx_fsm_nxt_st;
+ reg crc_stat_reg;
+ reg rx_runt_pkt_reg;
+ reg large_pkt_reg;
+ reg rx_fifo_overrun_reg;
+ reg frm_length_err_reg;
+ reg [2:0] crc_count;
+ reg inc_shift_counter;
+ reg send_data_to_fifo;
+ wire send_runt_packet;
+ reg [2:0] shift_counter;
+ reg [2:0] bytes_to_fifo;
+ reg [7:0] buf_latch4,buf_latch3,buf_latch2,buf_latch1,buf_latch0;
+ wire ld_buf,ld_buf1,ld_buf2,ld_buf3,ld_buf4;
+ reg lengthfield_error;
+ reg lengthfield_err_reg;
+ reg addr_stat_chk;
+ reg clr_rx_error_from_rx_fsm;
+
+ wire [15:0] adj_rcv_length_reg;
+ wire [15:0] adj_rcv_byte_count;
+ wire [15:0] adj_cf2rx_max_pkt_sz;
+ reg set_tag1_flag, set_tag2_flag;
+
+ parameter rx_fsm_idle_st= 19'b0000000000000000000,
+ rx_fsm_chkdestad_nib1_st = 19'b0000000000000000001,
+ rx_fsm_lk4srcad_nib1_st = 19'b0000000000000000010,
+ rx_fsm_lk4len_byte1_st = 19'b0000000000000000100,
+ rx_fsm_lk4len_byte2_st = 19'b0000000000000001000,
+ rx_fsm_getdt_nib1_st = 19'b0000000000000010000,
+ rx_fsm_getpaddt_nib1_st = 19'b0000000000000100000,
+ rx_fsm_updstat_st = 19'b0000000000001000000,
+ rx_fsm_chkval_st = 19'b0000000000010000000,
+ rx_fsm_extend_st = 19'b0000000100000000000;
+
+ /***************** WIRE ASSIGNMENTS *************************/
+ wire [6:0] dec_pad_length;
+ wire [15:0] inc_length_counter;
+ wire rx_overrun_error;
+ wire commit_condition;
+
+//COMMIT_WRITE CONDITION
+assign commit_condition = ((inc_rcv_byte_count[14:0] == 15'd65)&& !commit_write_done );
+
+
+
+ /******** SEQUENTIAL LOGIC **********************************/
+ half_dup_dble_reg U_dble_reg1 (
+ //outputs
+ .sync_out_pulse(rx_ch_en),
+ //inputs
+ .in_pulse(cf2rx_rx_ch_en),
+ .dest_clk(phy_rx_clk),
+ .reset_n(reset_n)
+ );
+
+ // ap2rx_rx_fifo_err signal is generated in rx_clk domain
+ assign rx_overrun_error = ap2rx_rx_fifo_err;
+
+ reg rx_sts_vld_delayed;
+ always @(posedge phy_rx_clk
+ or negedge reset_n)
+ begin
+ if(!reset_n)
+ begin
+ rx_sts <= 32'b0;
+ rx_sts_vld <= 1'b0;
+ rx_sts_vld_delayed <= 1'b0;
+ end
+ else
+ begin
+ rx_sts_vld <= rx_sts_vld_delayed;
+ rx_sts_vld_delayed <= e_rx_sts_vld;
+ if (e_rx_sts_vld)
+ rx_sts <= rx_sts_dt;
+ end
+ end
+
+ always @(posedge phy_rx_clk
+ or negedge reset_n)
+ begin
+ if(!reset_n)
+ begin
+ rx_fsm_cur_st <= rx_fsm_idle_st;
+ check_padding <= 1'b0;
+ end
+ else
+ begin
+ rx_fsm_cur_st <= rx_fsm_nxt_st;
+ check_padding <= check_padding_in;
+ end
+ end
+ reg first_byte_seen;
+
+
+ always @(posedge phy_rx_clk
+ or negedge reset_n)
+ if(!reset_n)
+ first_byte_seen <= 1'b0;
+ else if(mi2rx_strt_rcv)
+ first_byte_seen <= 1'b1;
+ else if(mi2rx_rcv_vld)
+ first_byte_seen <= 1'b0;
+
+
+
+// adjust rcv_length reg for packet sizes < 64 bytes
+assign adj_rcv_length_reg = (rcv_length_reg < 8'h2E) ? 8'h2E : rcv_length_reg;
+
+// subtr 18 bytes (sa + da + fcs + t/l)
+assign adj_rcv_byte_count = rcv_byte_count - 8'd18;
+
+// configured max packet size should be 16'd1518.
+assign adj_cf2rx_max_pkt_sz = cf2rx_max_pkt_sz;
+
+
+
+ // Following state machine is to receive nibbles from the RMII/MII
+ // block and packetize them to 32 bits with information of EOP and
+ // valid bytes. It also discards packets which are less than minimum
+ // frame size. It performs Address validity and Data validity.
+ always @(rx_fsm_cur_st or mi2rx_strt_rcv or rx_ch_en or cf2rx_strp_pad_en
+ or cf2rx_snd_crc or look_at_length_field
+ or mi2rx_rcv_vld or first_dword or rc2rx_crc_ok
+ or mi2rx_end_rcv or mi2rx_rx_byte or mi2rx_extend
+ or inc_length_counter or rcv_length_reg or commit_write_done
+ or crc_count or shift_counter or bytes_to_fifo
+ or cf2rx_rcv_runt_pkt_en
+ or inc_rcv_byte_count or send_runt_packet
+ or rcv_byte_count or first_dword
+ or commit_condition or rx_fifo_full or ap2rx_rx_fifo_err )
+ begin
+ rx_fsm_nxt_st = rx_fsm_cur_st;
+ set_tag1_flag = 1'b0;
+ set_tag2_flag = 1'b0;
+ reset_tmp_count = 1'b0;
+ ld_length_byte_1 = 1'b0;
+ ld_length_byte_2 = 1'b0;
+ dec_data_len = 1'b0;
+ dec_pad_len = 1'b0;
+ commit_write = 1'b0;
+ rewind_write = 1'b0;
+ e_rx_sts_vld = 1'b0;
+ set_crc_error = 1'b0;
+ check_padding_in = 1'b0;
+ set_byte_allgn_error = 1'b0;
+ set_incomplete_frm = 1'b0;
+ set_frm_lngth_error = 1'b0;
+ gen_eop = 1'b0;
+ error = 1'b0;
+ byte_boundary= 1'b0;
+ send_crc = 1'b0;
+ rcv_pad_data = 1'b0;
+ inc_shift_counter = 1'b0;
+ send_data_to_fifo = 1'b0;
+ lengthfield_error = 1'b0;
+ addr_stat_chk = 1'b0;
+ clr_rx_error_from_rx_fsm = 1'b0;
+
+
+ case(rx_fsm_cur_st)
+ rx_fsm_idle_st:
+ // Waiting for packet from mii block
+ // Continues accepting data only if
+ // receive has been enabled
+ begin
+ if(ap2rx_rx_fifo_err)
+ begin
+ clr_rx_error_from_rx_fsm = 1'b1;
+ rx_fsm_nxt_st = rx_fsm_idle_st;
+ end
+ else if (rx_fifo_full)
+ rx_fsm_nxt_st = rx_fsm_idle_st;
+ else if(mi2rx_strt_rcv && rx_ch_en )
+ rx_fsm_nxt_st = rx_fsm_chkdestad_nib1_st;
+ else
+ rx_fsm_nxt_st = rx_fsm_idle_st;
+ end
+
+ rx_fsm_chkdestad_nib1_st:
+ begin
+ // collecting the nibbles of destination
+ // address
+ if(ap2rx_rx_fifo_err)
+ begin
+ rewind_write = 1'b1;
+ rx_fsm_nxt_st = rx_fsm_idle_st;
+ end
+ else if(mi2rx_end_rcv)
+ begin
+ if(cf2rx_rcv_runt_pkt_en)
+ begin
+ rx_fsm_nxt_st = rx_fsm_chkval_st;
+ commit_write = 1'b1;
+ end
+ else
+ begin
+ rx_fsm_nxt_st = rx_fsm_idle_st;
+ if (rcv_byte_count[2:0] > 5)
+ rewind_write = 1'b1;
+ end
+ end // if (mi2rx_end_rcv)
+
+ else if(mi2rx_rcv_vld && inc_rcv_byte_count[14:0] == 15'd6)
+ begin
+ rx_fsm_nxt_st = rx_fsm_lk4srcad_nib1_st;
+ end
+ else
+ begin
+ rx_fsm_nxt_st = rx_fsm_chkdestad_nib1_st;
+ end
+ end
+
+ rx_fsm_lk4srcad_nib1_st:
+ // collecting nibbles of source address
+ // in case of termination of packet
+ // or carrier sense error then generate eop
+ // and generate status
+ begin
+ if(ap2rx_rx_fifo_err )
+ begin
+ rewind_write = 1;
+ rx_fsm_nxt_st = rx_fsm_idle_st;
+ end // else: !if(mi2rx_end_rcv)
+ else if(mi2rx_end_rcv)
+ begin
+ if(cf2rx_rcv_runt_pkt_en)
+ begin
+ rx_fsm_nxt_st = rx_fsm_chkval_st;
+ commit_write = 1'b1;
+ end
+ else
+ begin
+ rx_fsm_nxt_st = rx_fsm_idle_st;
+ rewind_write = 1'b1;
+ end
+ end
+ else if(mi2rx_rcv_vld && inc_rcv_byte_count[14:0] == 15'd12)
+ begin
+ rx_fsm_nxt_st = rx_fsm_lk4len_byte1_st;
+ end
+ else
+ begin
+ rx_fsm_nxt_st = rx_fsm_lk4srcad_nib1_st;
+ end
+ end
+
+ rx_fsm_lk4len_byte1_st:
+ // this state collects the odd nibbles of the length
+ // field.
+ begin
+ if(ap2rx_rx_fifo_err)
+ begin
+ rewind_write = 1;
+ rx_fsm_nxt_st = rx_fsm_idle_st;
+ end // else: !if(mi2rx_end_rcv)
+ else if(mi2rx_end_rcv)
+ begin
+ if(cf2rx_rcv_runt_pkt_en)
+ begin
+ rx_fsm_nxt_st = rx_fsm_chkval_st;
+ commit_write = 1'b1;
+ end
+ else
+ begin
+ rx_fsm_nxt_st = rx_fsm_idle_st;
+ rewind_write = 1'b1;
+ end
+ end
+ else if(mi2rx_rcv_vld)
+ begin
+ ld_length_byte_1 = 1'b1;
+ rx_fsm_nxt_st = rx_fsm_lk4len_byte2_st;
+ end
+ else
+ rx_fsm_nxt_st = rx_fsm_lk4len_byte1_st;
+ end
+
+ rx_fsm_lk4len_byte2_st:
+ // This state generates the even nibbles of the length
+ // field
+ begin
+ if(ap2rx_rx_fifo_err )
+ begin
+ rewind_write = 1;
+ rx_fsm_nxt_st = rx_fsm_idle_st;
+ end // else: !if(mi2rx_end_rcv)
+ else if(mi2rx_end_rcv)
+ begin
+ if(cf2rx_rcv_runt_pkt_en)
+ begin
+ rx_fsm_nxt_st = rx_fsm_chkval_st;
+ commit_write = 1'b1;
+ end
+ else
+ begin
+ rx_fsm_nxt_st = rx_fsm_idle_st;
+ rewind_write = 1'b1;
+ end
+ end
+ else if(mi2rx_rcv_vld )
+ begin
+ ld_length_byte_2 = 1'b1;
+ check_padding_in = 1'b1;
+ rx_fsm_nxt_st = rx_fsm_getdt_nib1_st;
+ end
+ else
+ rx_fsm_nxt_st = rx_fsm_lk4len_byte2_st;
+ end // rx_fsm_lk4len_byte2_st
+
+ rx_fsm_getdt_nib1_st: //state number 7
+ // This state collects the nibbles of the receive data
+ // This state makes a determination to remove padding
+ // only if strip padding is enabled and the length field
+ // detected is less than 64
+ begin
+ if (commit_condition)
+ commit_write = 1'b1;
+
+ if((ap2rx_rx_fifo_err) && !commit_write_done)
+ begin
+ rewind_write = 1;
+ rx_fsm_nxt_st = rx_fsm_idle_st;
+ end // else: !if(mi2rx_end_rcv)
+ else if (ap2rx_rx_fifo_err)
+ begin
+ rx_fsm_nxt_st = rx_fsm_updstat_st;
+ end
+ else if(mi2rx_end_rcv)
+ begin
+ if(cf2rx_rcv_runt_pkt_en && !(commit_write_done | commit_condition))
+ begin
+ commit_write = 1'b1;
+ rx_fsm_nxt_st = rx_fsm_chkval_st;
+ end
+ else if(!(commit_write_done | commit_condition) && !cf2rx_rcv_runt_pkt_en)
+ begin
+ rewind_write = 1'b1;
+ rx_fsm_nxt_st = rx_fsm_idle_st;
+ end
+ else
+ rx_fsm_nxt_st = rx_fsm_chkval_st;
+ end
+ else if(mi2rx_rcv_vld && (inc_length_counter == rcv_length_reg) &&
+ look_at_length_field)
+ begin
+ dec_data_len = 1'b1;
+ rx_fsm_nxt_st = rx_fsm_getpaddt_nib1_st;
+ end
+ else if(mi2rx_rcv_vld && look_at_length_field)
+ begin
+ dec_data_len = 1'b1;
+ rx_fsm_nxt_st = rx_fsm_getdt_nib1_st;
+ end
+ else
+ rx_fsm_nxt_st = rx_fsm_getdt_nib1_st;
+ end
+
+ rx_fsm_getpaddt_nib1_st:
+ // This state handles the padded data in case of less than 64
+ // byte packets This handles the odd nibbles
+ begin
+ if(ap2rx_rx_fifo_err)
+ begin
+ if(rcv_byte_count[14:0] <= 15'd64) // mfilardo
+ //if(inc_rcv_byte_count[14:0] <= 15'd64)
+ begin
+ rewind_write = 1'b1;
+ rx_fsm_nxt_st = rx_fsm_idle_st;
+ end
+ else
+ rx_fsm_nxt_st = rx_fsm_updstat_st;
+ end
+ else if(mi2rx_end_rcv)
+ begin
+ //if(inc_rcv_byte_count[14:0] == 15'd64)
+ if(rcv_byte_count[14:0] == 15'd64) // mfilardo
+ lengthfield_error = 0;
+ else
+ lengthfield_error = 1;
+
+ rx_fsm_nxt_st = rx_fsm_extend_st;
+ end
+ else if(mi2rx_rcv_vld)
+ begin
+ if(cf2rx_strp_pad_en)
+ rcv_pad_data = 1'b1;
+ end
+ else
+ rx_fsm_nxt_st = rx_fsm_getpaddt_nib1_st;
+ end // case: rx_fsm_getpaddt_nib1_st
+
+
+ rx_fsm_extend_st:
+ //This state handles the first extend conditon in the
+ //cf2rx_gigabit_xfr
+ //transfer
+ begin
+ if (mi2rx_extend)
+ begin
+ rx_fsm_nxt_st = rx_fsm_extend_st;
+ end
+ else
+ begin
+ commit_write = 1'b1;
+ rx_fsm_nxt_st = rx_fsm_chkval_st;
+ end
+ end
+ rx_fsm_chkval_st:
+ // This packet generates the validity of the packet
+ // This is reached either on clean or error type
+ // completion of packet.
+ begin
+ if(ap2rx_rx_fifo_err)
+ begin
+ rx_fsm_nxt_st = rx_fsm_updstat_st;
+ end
+ else if(cf2rx_rcv_runt_pkt_en && first_dword)
+ begin
+ rx_fsm_nxt_st = rx_fsm_chkval_st;
+ case(rcv_byte_count[2:0])
+ 3'd1:
+ begin
+ if(shift_counter == 3'd4)
+ begin
+ if(bytes_to_fifo == rcv_byte_count[2:0])
+ begin
+ gen_eop = 1'b1;
+ rx_fsm_nxt_st = rx_fsm_updstat_st;
+ end // if (bytes_to_fifo == rcv_nibble_count[3:1])
+ else
+ send_data_to_fifo = 1'b1;
+ end // if (shift_counter == 3'd4)
+ else
+ inc_shift_counter = 1;
+ end // case: 3'd1
+
+ 3'd2:
+ begin
+ if(shift_counter == 3'd3)
+ begin
+ if(bytes_to_fifo == rcv_byte_count[2:0])
+ begin
+ gen_eop = 1'b1;
+ rx_fsm_nxt_st = rx_fsm_updstat_st;
+ end // if (bytes_to_fifo == rcv_nibble_count[3:1])
+ else
+ send_data_to_fifo = 1'b1;
+ end // if (shift_counter == 3'd3)
+ else
+ inc_shift_counter = 1;
+ end // case: 3'd2
+
+ 3'd3:
+ begin
+ if(shift_counter == 3'd2)
+ begin
+ if(bytes_to_fifo == rcv_byte_count[2:0])
+ begin
+ gen_eop = 1'b1;
+ rx_fsm_nxt_st = rx_fsm_updstat_st;
+ end
+ else
+ send_data_to_fifo = 1'b1;
+ end // if (shift_counter == 3'd2)
+ else
+ inc_shift_counter = 1;
+ end // case: 3'd3
+
+ 3'd4:
+ begin
+ if(shift_counter == 3'd1)
+ begin
+ if(bytes_to_fifo == rcv_byte_count[2:0])
+ begin
+ gen_eop = 1'b1;
+ rx_fsm_nxt_st = rx_fsm_updstat_st;
+ end // if (bytes_to_fifo == rcv_nibble_count[3:1])
+ else
+ send_data_to_fifo = 1'b1;
+ end
+ else
+ inc_shift_counter = 1;
+ end // case: 3'd4
+ default:
+ begin
+ rx_fsm_nxt_st = rx_fsm_idle_st;
+ gen_eop = 1'b0;
+ end
+ endcase // case(rcv_nibble_count[3
+ end // if (cf2rx_rcv_runt_pkt_en && first_dword)
+ else if(((cf2rx_snd_crc || send_runt_packet || look_at_length_field)
+ && crc_count == 3'd4))
+ begin
+ gen_eop = 1'b1;
+ rx_fsm_nxt_st = rx_fsm_updstat_st;
+ end
+ else if(send_runt_packet || look_at_length_field)
+ begin
+ send_crc = 1'b1;
+ rx_fsm_nxt_st = rx_fsm_chkval_st;
+ end
+ else if(!cf2rx_snd_crc)
+ begin
+ gen_eop = 1'b1;
+ rx_fsm_nxt_st = rx_fsm_updstat_st;
+ end
+ else
+ begin
+ send_crc = 1'b1;
+ rx_fsm_nxt_st = rx_fsm_chkval_st;
+ end
+ end // case: rx_fsm_chkval_st
+
+ rx_fsm_updstat_st:
+ // This state updates the status to the application
+ // This allows the application to determine the validity
+ // of the packet so that it can take the necessary action
+ begin
+ e_rx_sts_vld = 1'b1;
+ rx_fsm_nxt_st = rx_fsm_idle_st;
+ end
+
+ default:
+ begin
+ rx_fsm_nxt_st = rx_fsm_idle_st;
+ end
+ endcase // casex(rx_fsm_cur_st)
+ end // always @ (rx_fsm_cur_st or mi2rx_strt_rcv or rx_ch_en or cf2rx_strp_pad_en...
+
+ always @(inc_rcv_byte_count)
+ begin
+ if(inc_rcv_byte_count[14:0] < 15'd6)
+ first_dword = 1'b1;
+ else
+ first_dword = 1'b0;
+ end // always @ (inc_rcv_nibble_count or...
+
+
+ always @(posedge phy_rx_clk
+ or negedge reset_n)
+ begin
+ if(!reset_n)
+ crc_count <= 3'b000;
+ else if(mi2rx_strt_rcv)
+ crc_count <= 3'b000;
+ else if(send_crc)
+ crc_count <= crc_count + 1;
+ end // always @ (posedge phy_rx_clk...
+
+ // These signals are used as intermediate flags to determine
+ // whether to commit pointer or not to commit pointers
+ // to the application
+ // error_seen helps in tracking errors which could occurs in between
+ // packet transfer
+ always @(posedge phy_rx_clk
+ or negedge reset_n)
+ begin
+ if(!reset_n)
+ begin
+ commit_write_done <= 1'b1;
+ error_seen <= 1'b0;
+ end
+ else if(mi2rx_strt_rcv)
+ begin
+ commit_write_done <= 1'b0;
+ error_seen <= 1'b0;
+ end
+ else
+ begin
+ if(commit_write)
+ commit_write_done <= 1'b1;
+ if(error)
+ error_seen <= 1'b1;
+ end
+ end // always @ (posedge phy_rx_clk...
+
+ assign look_at_length_field = cf2rx_strp_pad_en &&
+ (rcv_length_reg < MIN_FRM_SIZE) && (|rcv_length_reg);
+ assign send_runt_packet = cf2rx_rcv_runt_pkt_en &&
+ (rcv_byte_count[15:8] == 8'd0 && rcv_byte_count[7:0] < 8'd64);
+
+
+
+
+ assign inc_rcv_byte_count = rcv_byte_count + 16'h1;
+
+ always @(posedge phy_rx_clk
+ or negedge reset_n)
+ begin
+ if(!reset_n)
+ rcv_byte_count <= 16'h0000;
+ else if(mi2rx_strt_rcv)
+ rcv_byte_count <= 16'h0000;
+ else if(mi2rx_rcv_vld)
+ rcv_byte_count <= inc_rcv_byte_count;
+ end // always @ (posedge phy_rx_clk...
+
+ // This signal is asserted wheneven there is no valid transfer on the
+ // line. Valid transfer is only between mi2rx_strt_rcv and
+ // mi2rx_end_rcv. In case
+ // of rewind write transfer becomes invalid. Such data should not be
+ // written in to the fifo
+ reg dt_xfr_invalid;
+ always @(posedge phy_rx_clk
+ or negedge reset_n)
+ begin
+ if(!reset_n)
+ dt_xfr_invalid <= 1;
+ else if(rewind_write || ap2rx_rx_fifo_err)
+ dt_xfr_invalid <= 1;
+ else if(mi2rx_strt_rcv)
+ dt_xfr_invalid <= 0;
+ end
+ // This is the mux to gather nibbles to two octets for the length field
+ // of the register
+ assign inc_length_counter = length_counter + 16'h1;
+ always @(posedge phy_rx_clk
+ or negedge reset_n)
+ begin
+ if(!reset_n)
+ begin
+ rcv_length_reg <= 16'b0;
+ length_counter <= 16'b0;
+ end // if (reset_n)
+ else if (rx_ch_en)
+ begin
+ if(mi2rx_strt_rcv)
+ begin
+ length_counter <= 16'b0;
+ rcv_length_reg <= 16'b0;
+ end
+ else if(dec_data_len )
+ length_counter <= inc_length_counter;
+ else
+ begin
+ if(ld_length_byte_1)
+ begin
+ rcv_length_reg[15:8] <= mi2rx_rx_byte;
+ end
+ else if(ld_length_byte_2)
+ begin
+ rcv_length_reg[7:0] <= mi2rx_rx_byte;
+ end
+ end // else: !if(dec_data_len)
+ end // else: !if(!reset_n)
+ end // always @ (posedge phy_rx_clk...
+
+ // This signal helps in making sure that when packets are received the
+ // channel is enabled else ignore the complete packet until next start
+ // of packet
+ reg enable_channel;
+ always @(posedge phy_rx_clk
+ or negedge reset_n)
+ begin
+ if(!reset_n)
+ enable_channel <= 0;
+ else if(gen_eop)
+ enable_channel <= 0;
+ else if(mi2rx_strt_rcv && rx_ch_en)
+ enable_channel <= 1;
+ end
+
+ // This is the decremented padding length register
+ // Once it reaches zero CRC should follow
+ assign dec_pad_length = padding_len_reg - 7'h1;
+ always @(posedge phy_rx_clk
+ or negedge reset_n)
+ begin
+ if(!reset_n)
+ begin
+ padding_needed <= 1'b0;
+ padding_len_reg <= 6'b0;
+ end
+ else if(mi2rx_strt_rcv)
+ begin
+ padding_needed <= 1'b0;
+ padding_len_reg <= 6'b0;
+ end
+ else if(look_at_length_field &&
+ check_padding)
+ begin
+ padding_len_reg <= MIN_FRM_SIZE - rcv_length_reg[5:0];
+ padding_needed <= 1'b1;
+ end
+ else if(dec_pad_len)
+ begin
+ padding_len_reg <= dec_pad_len;
+ padding_needed <= padding_needed;
+ end
+ end // always @ (posedge phy_rx_clk...
+
+ /*********************************************************
+ Status Generation for Receive packets
+ Statuses in this case are checked at end of receive packets
+ and are registered and provided inthe next state along with
+ rx_sts_valid bit asserted
+ *********************************************************/
+
+ reg[14:0] fifo_byte_count;
+ wire [14:0] inc_fifo_byte_count;
+ wire [14:0] dec_fifo_byte_count;
+ assign inc_fifo_byte_count = fifo_byte_count + 15'h1;
+ assign dec_fifo_byte_count = fifo_byte_count - 15'h1;
+
+ always @(posedge phy_rx_clk or negedge reset_n)
+ begin
+ if(!reset_n)
+ fifo_byte_count <= 15'd0;
+ else if(rewind_write || mi2rx_strt_rcv)
+ fifo_byte_count <= 15'd0;
+ else if(rx2ap_rx_fsm_wrt)
+ fifo_byte_count <= inc_fifo_byte_count;
+ end
+
+ reg length_sz_mismatch;
+
+ assign rx_sts_dt[31:16] = (e_rx_sts_vld && ap2rx_rx_fifo_err) ?
+ {dec_fifo_byte_count + 16'h1} : {fifo_byte_count + 16'h1};
+ assign rx_sts_dt[15:13] = 3'd0;
+ assign rx_sts_dt[12] = length_sz_mismatch;
+ assign rx_sts_dt[11] = 1'b0;
+ assign rx_sts_dt[10] = large_pkt_reg;
+ assign rx_sts_dt[7] = lengthfield_err_reg;
+ assign rx_sts_dt[6] = crc_stat_reg;
+ assign rx_sts_dt[5] = rx_runt_pkt_reg;
+ assign rx_sts_dt[4] = rx_fifo_overrun_reg;
+ assign rx_sts_dt[2] = frm_length_err_reg;
+ assign rx_sts_dt[1:0] = 2'd0;
+
+ wire rx_sts_large_pkt;
+ wire [15:0] rx_sts_bytes_rcvd;
+ wire rx_sts_lengthfield_err;
+ wire rx_sts_crc_err;
+ wire rx_sts_runt_pkt_rcvd;
+ wire rx_sts_rx_overrun;
+ wire rx_sts_frm_length_err;
+ wire rx_sts_len_mismatch;
+
+ assign rx_sts_bytes_rcvd = rx_sts[31:16];
+ assign rx_sts_len_mismatch = rx_sts[12];
+ assign rx_sts_large_pkt = rx_sts[10];
+ assign rx_sts_lengthfield_err = rx_sts[7];
+ assign rx_sts_crc_err = rx_sts[6];
+ assign rx_sts_runt_pkt_rcvd = rx_sts[5];
+ assign rx_sts_rx_overrun = rx_sts[4];
+ assign rx_sts_frm_length_err = rx_sts[2];
+
+
+ always @(posedge phy_rx_clk
+ or negedge reset_n)
+ begin
+ if(!reset_n)
+ begin
+ crc_stat_reg <= 1'b0;
+ frm_length_err_reg <= 1'b0;
+ lengthfield_err_reg <= 1'b0;
+ rx_fifo_overrun_reg <= 1'b0;
+ rx_runt_pkt_reg <= 1'b0;
+ large_pkt_reg <= 1'b0;
+ length_sz_mismatch <= 1'b0;
+ end
+ else if(mi2rx_strt_rcv)
+ begin
+ crc_stat_reg <= 1'b0;
+ frm_length_err_reg <= 1'b0;
+ lengthfield_err_reg <= 1'b0;
+ rx_fifo_overrun_reg <= 1'b0;
+ rx_runt_pkt_reg <= 1'b0;
+ large_pkt_reg <= 1'b0;
+ length_sz_mismatch <= 1'b0;
+ end
+ else
+ begin
+ if(rx_overrun_error)
+ rx_fifo_overrun_reg <= 1'b1;
+
+ if(lengthfield_error)
+ lengthfield_err_reg <= 1'b1;
+
+ if(mi2rx_end_rcv && mi2rx_frame_err)
+ frm_length_err_reg <= 1'b1;
+
+ if(mi2rx_end_rcv)
+ begin
+ if(!rc2rx_crc_ok)
+ crc_stat_reg <= 1'b1;
+ if(rcv_byte_count[14:0] < 15'd64)
+ rx_runt_pkt_reg <= 1'b1;
+ if(rcv_byte_count[14:0] > adj_cf2rx_max_pkt_sz)
+ large_pkt_reg <= 1'b1;
+ if( (adj_rcv_byte_count[15:0] != adj_rcv_length_reg) && (adj_rcv_length_reg <= 16'd1500) )
+ length_sz_mismatch <= 1'b1;
+ end // if (mi2rx_end_rcv)
+ end // else: !if(mi2rx_strt_rcv)
+ end // always @ (posedge phy_rx_clk...
+
+ /***************************************************/
+ //
+ // Additions for Byte operation
+ //
+ /***************************************************/
+ always @(posedge phy_rx_clk or
+ negedge reset_n)
+ begin
+ if(!reset_n)
+ shift_counter <= 3'd0;
+ else if(mi2rx_strt_rcv)
+ shift_counter <= 3'd0;
+ else if(inc_shift_counter)
+ shift_counter <= shift_counter + 1;
+ end // always @ (posedge phy_rx_clk or...
+
+ always @(posedge phy_rx_clk or
+ negedge reset_n)
+ begin
+ if(!reset_n)
+ bytes_to_fifo <= 3'd0;
+ else if(mi2rx_strt_rcv)
+ bytes_to_fifo <= 3'd1;
+ else if(send_data_to_fifo)
+ bytes_to_fifo <= bytes_to_fifo + 1;
+ end // always @ (posedge phy_rx_clk or...
+
+ wire[8:0] e_rx_fsm_dt;
+ wire e_rx_fsm_wrt;
+ assign e_rx_fsm_dt[7:0] = buf_latch4;
+// assign e_rx_fsm_dt[8] = (rx_fifo_full) ? 1'b1 :gen_eop;
+ assign e_rx_fsm_dt[8] = gen_eop;
+
+ always @(posedge phy_rx_clk or
+ negedge reset_n)
+ begin
+ if(!reset_n)
+ begin
+ rx2ap_rx_fsm_dt <= 9'd0;
+ rx2ap_rx_fsm_wrt <= 1'b0;
+ rx2ap_commit_write <= 1'b0;
+ rx2ap_rewind_write <= 1'b0;
+ end
+ else
+ begin
+ rx2ap_rx_fsm_wrt <= e_rx_fsm_wrt && (!ap2rx_rx_fifo_err);
+ rx2ap_rx_fsm_dt <= e_rx_fsm_dt;
+ rx2ap_commit_write <= commit_write;
+ rx2ap_rewind_write <= rewind_write;
+ end
+ end // always @ (posedge phy_rx_clk or...
+
+ assign e_rx_fsm_wrt = ((enable_channel &&
+ mi2rx_rcv_vld && !first_dword) ||
+ (enable_channel &&
+ (gen_eop || send_crc)) ||
+ (enable_channel && send_data_to_fifo)) && !rcv_pad_data
+ && !dt_xfr_invalid && !rewind_write;
+ assign ld_buf = enable_channel && !rcv_pad_data && (|rcv_byte_count == 1) &&
+ (mi2rx_rcv_vld) || send_crc || inc_shift_counter || send_data_to_fifo;
+
+ assign ld_buf4 = ld_buf ;
+ assign ld_buf3 = ld_buf ;
+ assign ld_buf2 = ld_buf ;
+ assign ld_buf1 = ld_buf ;
+ always @(posedge phy_rx_clk
+ or negedge reset_n)
+ begin
+ if(!reset_n)
+ begin
+ buf_latch4 <= 8'b0;
+ buf_latch3 <= 8'b0;
+ buf_latch2 <= 8'b0;
+ buf_latch1 <= 8'b0;
+ buf_latch0 <= 8'b0;
+ end
+ else
+ begin
+ if(ld_buf4)
+ buf_latch4 <= buf_latch3;
+
+ if(ld_buf3)
+ buf_latch3 <= buf_latch2;
+
+ if(ld_buf2)
+ buf_latch2 <= buf_latch1;
+
+ if(ld_buf1)
+ buf_latch1 <= buf_latch0;
+
+ if (rx_ch_en)
+ begin
+ if(mi2rx_strt_rcv)
+ begin
+ buf_latch0 <= 8'b0;
+ end
+ else
+ begin
+ if(mi2rx_rcv_vld && !rcv_pad_data)
+ begin
+ buf_latch0 <= mi2rx_rx_byte;
+ end
+ end // else: !if(mi2rx_strt_rcv)
+ end // if (rx_ch_en)
+ end // else: !if(!reset_n)
+ end // always @ (posedge phy_rx_clk...
+
+endmodule
diff --git a/verilog/rtl/gmac/mac/g_rx_top.v b/verilog/rtl/gmac/mac/g_rx_top.v
new file mode 100755
index 0000000..5f36379
--- /dev/null
+++ b/verilog/rtl/gmac/mac/g_rx_top.v
@@ -0,0 +1,208 @@
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Tubo 8051 cores MAC Interface Module ////
+//// ////
+//// This file is part of the Turbo 8051 cores project ////
+//// http://www.opencores.org/cores/turbo8051/ ////
+//// ////
+//// Description ////
+//// Turbo 8051 definitions. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : Mar 2, 2011 ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+ module g_rx_top(
+ app_reset_n,
+ phy_rx_clk,
+ rx_reset_n,
+ app_clk,
+ scan_mode,
+ rx_sts_vld,
+ rx_sts_bytes_rcvd,
+ rx_sts_large_pkt,
+ rx_sts_lengthfield_err,
+ rx_sts_len_mismatch,
+ rx_sts_crc_err,
+ rx_sts_runt_pkt_rcvd,
+ rx_sts_rx_overrun,
+ rx_sts_frm_length_err,
+ clr_rx_error_from_rx_fsm,
+ rx_fifo_full,
+ rx_dt_wrt,
+ rx_dt_out,
+ rx_commit_wr,
+ commit_write_done,
+ rx_rewind_wr,
+ mi2rx_strt_rcv,
+ mi2rx_rcv_vld,
+ mi2rx_rx_byte,
+ mi2rx_end_rcv,
+ mi2rx_extend,
+ mi2rx_frame_err,
+ mi2rx_end_frame,
+ phy_rx_dv,
+ cf2rx_max_pkt_sz,
+ cf2rx_rx_ch_en,
+ cf2rx_strp_pad_en,
+ cf2rx_snd_crc,
+ cf2df_dfl_single_rx,
+ cf2rx_rcv_runt_pkt_en,
+ cf_macmode,
+ mi2rx_crs,
+ df2rx_dfl_dn,
+ ap2rx_rx_fifo_err,
+ //for crs based flow control
+ phy_crs
+ );
+
+ input app_reset_n;
+ input phy_rx_clk;
+ input rx_reset_n;
+ input app_clk;
+ input scan_mode;
+
+ output rx_sts_vld;
+ output [15:0] rx_sts_bytes_rcvd;
+ output rx_sts_large_pkt;
+ output rx_sts_lengthfield_err;
+ output rx_sts_len_mismatch;
+ output rx_sts_crc_err;
+ output rx_sts_runt_pkt_rcvd;
+ output rx_sts_rx_overrun;
+ output rx_sts_frm_length_err;
+
+ output clr_rx_error_from_rx_fsm;
+ input rx_fifo_full;
+ output rx_dt_wrt;
+ output [8:0] rx_dt_out;
+ output rx_commit_wr;
+ output commit_write_done;
+ output rx_rewind_wr;
+ input mi2rx_strt_rcv;
+ input mi2rx_rcv_vld;
+ input [7:0] mi2rx_rx_byte;
+ input mi2rx_end_rcv;
+ input mi2rx_extend;
+ input mi2rx_frame_err;
+ input mi2rx_end_frame;
+ input phy_rx_dv;
+ input [15:0] cf2rx_max_pkt_sz;
+ input cf2rx_rx_ch_en;
+ input cf2rx_strp_pad_en;
+ input cf2rx_snd_crc;
+ input cf2rx_rcv_runt_pkt_en;
+ input cf_macmode;
+ input [7:0] cf2df_dfl_single_rx;
+ input ap2rx_rx_fifo_err;
+ input mi2rx_crs;
+ output df2rx_dfl_dn;
+
+ //for crs based flow control
+ input phy_crs;
+
+
+
+ g_rx_fsm u_rx_fsm(
+ // Status information to Applications
+ .rx_sts_vld(rx_sts_vld),
+ .rx_sts_bytes_rcvd(rx_sts_bytes_rcvd),
+ .rx_sts_large_pkt(rx_sts_large_pkt),
+ .rx_sts_lengthfield_err(rx_sts_lengthfield_err),
+ .rx_sts_len_mismatch(rx_sts_len_mismatch),
+ .rx_sts_crc_err(rx_sts_crc_err),
+ .rx_sts_runt_pkt_rcvd(rx_sts_runt_pkt_rcvd),
+ .rx_sts_rx_overrun(rx_sts_rx_overrun),
+ .rx_sts_frm_length_err(rx_sts_frm_length_err),
+ // Data Signals to Fifo Management Block
+ .clr_rx_error_from_rx_fsm(clr_rx_error_from_rx_fsm),
+ .rx2ap_rx_fsm_wrt(rx_dt_wrt),
+ .rx2ap_rx_fsm_dt(rx_dt_out),
+ // Fifo Control Signal to Fifo Management Block
+ .rx2ap_commit_write(rx_commit_wr),
+ .rx2ap_rewind_write(rx_rewind_wr),
+ // To address filtering block
+ .commit_write_done(commit_write_done),
+
+ // Global Signals
+ .reset_n(rx_reset_n),
+ .phy_rx_clk(phy_rx_clk),
+ // Signals from Mii/Rmii block for Receive data
+ .mi2rx_strt_rcv(mi2rx_strt_rcv),
+ .mi2rx_rcv_vld(mi2rx_rcv_vld),
+ .mi2rx_rx_byte(mi2rx_rx_byte),
+ .mi2rx_end_rcv(mi2rx_end_rcv),
+ .mi2rx_extend(mi2rx_extend),
+ .mi2rx_end_frame(mi2rx_end_frame),
+ .mi2rx_frame_err(mi2rx_frame_err),
+ // Rx fifo management signal to indicate overrun
+ .rx_fifo_full(rx_fifo_full),
+ .ap2rx_rx_fifo_err(ap2rx_rx_fifo_err),
+ // Signal from CRC check block
+ .rc2rx_crc_ok(rc2rx_crc_ok),
+ // Signals from Address filtering block
+ // Signals from Config Management Block
+ .cf2rx_max_pkt_sz(cf2rx_max_pkt_sz),
+ .cf2rx_rx_ch_en(cf2rx_rx_ch_en),
+ .cf2rx_strp_pad_en(cf2rx_strp_pad_en),
+ .cf2rx_snd_crc(cf2rx_snd_crc),
+ .cf2rx_rcv_runt_pkt_en(cf2rx_rcv_runt_pkt_en),
+ .cf2rx_gigabit_xfr(cf_macmode),
+ //for crs based flow control
+ .phy_crs(phy_crs)
+ );
+
+
+ g_rx_crc32 u_rx_crc32 (
+ // CRC Valid signal to rx_fsm
+ .rc2rf_crc_ok(rc2rx_crc_ok),
+
+ // Global Signals
+ .phy_rx_clk(phy_rx_clk),
+ .reset_n(rx_reset_n),
+ // CRC Data signals
+ .mi2rc_strt_rcv(mi2rx_strt_rcv),
+ .mi2rc_rcv_valid(mi2rx_rcv_vld),
+ .mi2rc_rx_byte(mi2rx_rx_byte)
+ );
+
+
+ g_deferral_rx U_deferral_rx (
+ .rx_dfl_dn(df2rx_dfl_dn),
+ .dfl_single(cf2df_dfl_single_rx),
+ .rx_dv(phy_rx_dv),
+ .rx_clk(phy_rx_clk),
+ .reset_n(rx_reset_n));
+
+ endmodule
diff --git a/verilog/rtl/gmac/mac/g_tx_fsm.v b/verilog/rtl/gmac/mac/g_tx_fsm.v
new file mode 100755
index 0000000..c28a2e6
--- /dev/null
+++ b/verilog/rtl/gmac/mac/g_tx_fsm.v
@@ -0,0 +1,775 @@
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Tubo 8051 cores MAC Interface Module ////
+//// ////
+//// This file is part of the Turbo 8051 cores project ////
+//// http://www.opencores.org/cores/turbo8051/ ////
+//// ////
+//// Description ////
+//// Turbo 8051 definitions. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : Mar 2, 2011 ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+/***************************************************************
+ Description:
+
+ tx_fsm.v: Frames are queued in TX FIFO, when the TX FIFO has enough
+ data to sustain a 100Mb or 10 Mb transfer on the TX transmit is enabled.
+ Each dword has 3 extra bits, which indicate the end of the frame and
+ the number of valid bytes in the current dword.
+
+ ***********************************************************************/
+
+
+module g_tx_fsm (
+ //Outputs
+ //FIFO
+ tx_commit_read,
+ tx_dt_rd,
+
+ //FCS
+ tx2tc_fcs_active,
+ tx2tc_gen_crc,
+
+ //MII interface
+ tx2mi_strt_preamble,
+ tx2mi_byte_valid,
+ tx2mi_byte,
+ tx2mi_end_transmit,
+ phy_tx_en,
+ tx_ch_en,
+
+ //Application
+ tx_sts_vld,
+ tx_sts_byte_cntr,
+ tx_sts_fifo_underrun,
+
+ //Inputs
+ //FIFO
+ app_tx_rdy,
+ tx_end_frame,
+ app_tx_dt_in,
+ app_tx_fifo_empty,
+
+ //dfl and back
+ df2tx_dfl_dn,
+
+ //FCS
+ tc2tx_fcs,
+
+ //Configuration
+ cf2tx_ch_en,
+ cf2tx_pad_enable,
+ cf2tx_append_fcs,
+ cf_mac_mode,
+ cf_mac_sa,
+ cf2tx_force_bad_fcs,
+
+ app_clk,
+ set_fifo_undrn,
+
+ //MII interface
+ mi2tx_byte_ack,
+ tx_clk,
+ tx_reset_n,
+ app_reset_n);
+
+
+parameter CORE_MIN_FRAME_SIZE = 16'h40; //64 bytes =>
+// (12(add)+2(len)+46(pay) + 4CRC)*2
+parameter CORE_MIN_FRAME_COL_SIZE = 16'h40; //63 bytes =>
+// tx_fsm lags MII by one byte
+parameter CORE_PAYLOAD_SIZE = 16'h3C ; //60 bytes =>
+// (12(add)+2(len)+46(pay))*2
+
+
+ input cf2tx_ch_en; //transmit enable application clock
+ input app_tx_rdy; //tx fifo management, enough buffer to tx
+ input tx_end_frame; //Current DWORD marks end of frame
+ input [7:0] app_tx_dt_in; //double word data from the TX fifo mgmt
+ input app_tx_fifo_empty; //TX fifo is empty, if there were a data
+ //data request when app_tx_fifo_empty is asserted
+ //would result in FIFO underrun and error cond
+ input [31:0] tc2tx_fcs;
+
+ //defferral inputs
+ input df2tx_dfl_dn; //IPG time between frames is satisfied
+
+ //configuration inputs
+ input cf2tx_pad_enable; //pad the TX frame if they are small
+ input cf2tx_append_fcs; //on every TX, compute and append FCS, when
+ //cf2tx_pad_enable and the current frame is small
+ //FCS is computed and appended to the frame
+ //irrespective of this signal
+ input cf_mac_mode; // 1 is GMII 0 10/100
+ input [47:0] cf_mac_sa;
+ input cf2tx_force_bad_fcs;
+ input mi2tx_byte_ack; //MII interface accepted last byte
+ input tx_clk;
+ input tx_reset_n;
+ input app_reset_n;
+
+ //tx fifo management outputs
+ output tx_commit_read; //64 bytes have been transmitted successfully
+ //hence advance the rd pointer
+ output tx_dt_rd; //get net dword from the TX FIFO
+ //FCS interface
+ output tx2tc_fcs_active; //FCS being shipped to RMII or MII interface
+ output tx2tc_gen_crc; //update the CRC with new byte
+
+
+ //MII or RMII interface signals
+ output tx2mi_strt_preamble; //ask RMII or MII interface to send preamable
+ output tx2mi_byte_valid; //current byte to RMII or MII is valid
+ output [7:0] tx2mi_byte; //data to RMII and MII interface
+ output tx2mi_end_transmit; //frame transfer done
+ output tx_sts_vld; //tx status is valid
+ output [15:0] tx_sts_byte_cntr;
+ output tx_sts_fifo_underrun;
+ output tx_ch_en;
+
+ input phy_tx_en;
+
+ input app_clk;
+ output set_fifo_undrn;
+
+
+ parameter mn_idle_st = 3'd0;
+ parameter mn_snd_full_dup_frm_st = 3'd1;
+
+ parameter fcs_idle_st = 0;
+ parameter fcs_snd_st = 1;
+
+ parameter dt_idle_st = 12'b000000000000;
+ parameter dt_xfr_st = 12'b000000000001;
+ parameter dt_pad_st = 12'b000000000010;
+ parameter dt_fcs_st = 12'b000000000100;
+
+
+ wire tx_commit_read;
+ wire tx_dt_rd; //request TX FIFO for more data
+ wire tx2tc_fcs_active; //FCS is currently transmitted
+ wire tx2tc_gen_crc;
+ wire tx2mi_strt_preamble;
+ wire tx2mi_end_transmit;
+ wire [7:0] tx2mi_byte;
+ wire tx2mi_byte_valid;
+ wire cfg_force_bad_fcs_pulse;
+ reg [15:0] tx_sts_byte_cntr;
+ reg tx_sts_fifo_underrun;
+
+
+ reg [11:0] curr_dt_st, nxt_dt_st;
+ reg tx_fcs_dn, tx_fcs_dn_reg; //FCS fsm on completion of appending FCS
+ reg curr_fcs_st, nxt_fcs_st; //FSM for FCS
+ reg fcs_active; //FCS is currently transmitted
+
+ reg init_fcs_select; //initiliaze FCS mux select
+ reg clr_bad_fcs; //tx_reset the bad FCS requirement
+ reg clr_pad_byte; //clear the padded condition
+ reg [2:0] fcs_mux_select; //mux select for FCS
+ reg send_bad_fcs; //registered send bad FCS requirement
+ reg set_bad_fcs; //set the above register
+ reg [15:0] tx_byte_cntr; //count the number of bytes xfr'ed
+ reg tx_fsm_rd; //request TX FIFO for more data
+ reg tx_byte_valid; //current byte to MII is valdi
+ reg strt_fcs, strt_fcs_reg; //data is done, send FCS
+ reg frm_padded; //current frame is padded
+
+
+ reg set_pad_byte; //send zero filled bytes
+ reg e_tx_sts_vld; //current packet is transferred
+ reg tx_sts_vld;
+ reg strt_preamble;
+ reg [7:0] tx_byte;
+ reg [7:0] tx_fsm_dt_reg;
+ reg tx_end_frame_reg;
+ reg tx_lst_xfr_dt, tx_lst_xfr_fcs;
+ reg commit_read;
+ reg set_max_retry_reached;
+ reg gen_tx_crc;
+ reg set_fifo_undrn, clr_fifo_undrn, fifo_undrn;
+ reg commit_read_sent;
+ reg clr_first_dfl, set_first_dfl;
+
+ wire tx_lst_xfr;
+
+
+ reg tx_lst_xfr_fcs_reg;
+ wire [15:0] tx_byte_cntr_int;
+
+ reg cur_idle_st_del;
+
+ reg app_tx_rdy_dly;
+
+
+ always @(posedge tx_clk or negedge tx_reset_n) begin
+ if (!tx_reset_n) begin
+ app_tx_rdy_dly <= 1'b0;
+ end
+ else begin
+ app_tx_rdy_dly <= app_tx_rdy;
+ end
+ end
+
+
+
+ assign tx_commit_read = commit_read;
+ assign tx_dt_rd = tx_fsm_rd;
+ assign tx2tc_fcs_active = fcs_active;
+ assign tx2tc_gen_crc = gen_tx_crc;
+ assign tx2mi_strt_preamble = strt_preamble;
+ assign tx2mi_byte_valid = tx_byte_valid;
+ assign tx2mi_byte = tx_byte;
+ assign tx2mi_end_transmit = tx_lst_xfr;
+
+ assign tx_lst_xfr = tx_lst_xfr_dt || tx_lst_xfr_fcs;
+
+//To take care of 1 less byte count when fcs is not appended.
+ assign tx_byte_cntr_int = (curr_dt_st == dt_fcs_st) ? tx_byte_cntr : tx_byte_cntr + 16'h1;
+
+ always @(posedge tx_clk or negedge tx_reset_n)
+ begin
+ if (!tx_reset_n)
+ begin
+ tx_sts_vld <= 1'b0;
+ tx_sts_byte_cntr <= 16'b0;
+ tx_sts_fifo_underrun <= 1'b0;
+ end // if (!tx_reset_n)
+ else
+ begin
+ tx_sts_vld <= e_tx_sts_vld;
+ if (e_tx_sts_vld)
+ begin
+ tx_sts_byte_cntr <= tx_byte_cntr_int;
+ tx_sts_fifo_underrun <= fifo_undrn || set_fifo_undrn;
+ end
+ end // else: !if(!tx_reset_n)
+ end // always @ (posedge tx_clk or negedge tx_reset_n)
+
+
+
+
+ half_dup_dble_reg U_dble_reg2 (
+ //outputs
+ .sync_out_pulse(tx_ch_en),
+ //inputs
+ .in_pulse(cf2tx_ch_en),
+ .dest_clk(tx_clk),
+ .reset_n(tx_reset_n)
+ );
+
+
+
+ half_dup_dble_reg U_dble_reg4 (
+ //outputs
+ .sync_out_pulse(cfg_force_bad_fcs_pulse),
+ //inputs
+ .in_pulse(cf2tx_force_bad_fcs),
+ .dest_clk(tx_clk),
+ .reset_n(tx_reset_n)
+ );
+
+ always @(posedge tx_clk or negedge tx_reset_n)
+ begin
+ if (!tx_reset_n)
+ cur_idle_st_del <= 1'b1;
+ else
+ cur_idle_st_del <= (curr_dt_st==dt_idle_st);
+ end
+
+ //Data pump, this state machine gets triggered by TX FIFO
+ //This FSM control's the MUX loging to channel the 32 bit
+ //data to byte wide and also keeps track of the end of the
+ //frame and the valid bytes for the last double word. tx_sts_vld
+ //is generated by this fsm.
+ //Collission handling, retry operations are done in this FSM.
+ always @(posedge tx_clk or negedge tx_reset_n)
+ begin
+ if (!tx_reset_n)
+ curr_dt_st <= dt_idle_st;
+ else if (tx_ch_en)
+ curr_dt_st <= nxt_dt_st;
+ else
+ curr_dt_st <= dt_idle_st;
+ end // always @ (posedge tx_clk or negedge tx_reset_n)
+
+ //combinatorial process
+ //always @(curr_dt_st or mi2tx_byte_ack or app_tx_fifo_empty
+ always @(curr_dt_st or mi2tx_byte_ack or app_tx_fifo_empty
+ or tx_end_frame_reg or commit_read_sent
+ or tx_byte_cntr or tx_fcs_dn_reg or cf2tx_pad_enable or tx_ch_en
+ or df2tx_dfl_dn or app_tx_rdy
+ or strt_fcs_reg
+ or tx_end_frame or tx_clk
+ or cf2tx_append_fcs
+ or app_tx_rdy_dly or cur_idle_st_del)
+ begin
+ nxt_dt_st = curr_dt_st;
+ tx_fsm_rd = 0;
+ tx_byte_valid = 0;
+ set_bad_fcs = 0;
+ strt_fcs = 0;
+ set_pad_byte = 0;
+ set_max_retry_reached = 0;
+ e_tx_sts_vld = 0;
+ commit_read = 0;
+ strt_preamble = 0;
+ tx_lst_xfr_dt = 0;
+ clr_pad_byte = 0;
+ set_fifo_undrn = 0;
+ clr_fifo_undrn = 0;
+ clr_first_dfl = 0;
+ set_first_dfl = 0;
+ case (curr_dt_st)
+ dt_idle_st :
+ begin
+ //clear early state
+ clr_pad_byte = 1;
+ clr_fifo_undrn = 1;
+ clr_first_dfl = 1'b1;
+ //wait until there is enough data in the TX FIFO
+ //and tx_enabled and not waiting for pause period
+ //in the case of full duplex
+ if (tx_ch_en) //config, channel enable
+ begin
+ if (app_tx_rdy && df2tx_dfl_dn)
+ begin
+ tx_fsm_rd = 1;
+ nxt_dt_st = dt_xfr_st;
+ strt_preamble = 1;
+ end
+ else
+ nxt_dt_st = dt_idle_st;
+ end // if (tx_ch_en)
+ else
+ nxt_dt_st = dt_idle_st;
+ end // case: dt_idle_st
+
+ dt_xfr_st :
+ begin
+ tx_byte_valid = 1;
+ //compare the mux_select to max bytes to be transmitted
+ //on the last dword of the frame
+ if (mi2tx_byte_ack && (tx_end_frame_reg))
+ begin
+ // If it is end of frame detection and the count
+ // indicates that there is no need for padding then if
+ // pad is enabled dont check for cf2tx_append_fcs and Append
+ // the CRC with the data packet
+ if ((tx_byte_cntr >= ( CORE_PAYLOAD_SIZE - 1)) && cf2tx_append_fcs)
+ begin
+ strt_fcs = 1;
+ nxt_dt_st = dt_fcs_st;
+ end // if (cf2tx_append_fcs)
+ else
+ //ending the current transfer, check the frame size
+ //padding or FCS needs to be performed
+ if (tx_byte_cntr < ( CORE_PAYLOAD_SIZE - 1))
+ begin
+ //less than min frame size, check to see if
+ //padding can be done
+ if(cf2tx_pad_enable)
+ begin
+ nxt_dt_st = dt_pad_st;
+ end // if (cf2tx_pad_enable)
+ else
+ begin
+ //if no padding, check to see if FCS needs
+ //to be computed
+ if (cf2tx_append_fcs)
+ begin
+ strt_fcs = 1;
+ nxt_dt_st = dt_fcs_st;
+ end // if (cf2tx_append_fcs)
+ else
+ //if no FCS, complete the transfer
+ begin
+ e_tx_sts_vld = 1;
+ commit_read = 1;
+ nxt_dt_st = dt_idle_st;
+ end // else: !if(cf2tx_append_fcs)
+ end // else: !if(cf2tx_pad_enable)
+ end // if (tx_byte_cntr < ( CORE_MIN_FRAME_SIZE - 1))
+ else
+ //minimmum frame sent, check to see if FCS needs to
+ //be computed else transfer is done
+ begin
+ if (cf2tx_append_fcs)
+ begin
+ strt_fcs = 1;
+ nxt_dt_st = dt_fcs_st;
+ end // if (cf2tx_append_fcs)
+ else
+ begin
+ commit_read = !commit_read_sent;
+ e_tx_sts_vld = 1;
+ nxt_dt_st = dt_idle_st;
+ end // else: !if(cf2tx_append_fcs)
+ end // else: !if(tx_byte_cntr < ( CORE_MIN_FRAME_SIZE - 1))
+ end
+ else if (mi2tx_byte_ack)
+ begin
+ //time to fetch the new dword
+ //check to see if the fifo is empty
+ //if it is then send the crc with last bit
+ //inverted as bad CRC so that the destination
+ //can throw away the frame
+ if (app_tx_fifo_empty)
+ begin
+ //TX has encountered error, finish the current byte
+ //append wrong fcs
+ set_bad_fcs = 1;
+ strt_fcs = 1;
+ nxt_dt_st = dt_fcs_st;
+ set_fifo_undrn = 1;
+ end // if (mi2tx_byte_ack && ((mux_select == 1) ||...
+ tx_fsm_rd = 1; //just to set error, or
+ //get next word
+ end // if (mi2tx_byte_ack && mux_selectl == 1)
+ //provide end of transfer to MII/RMII interface
+ //commit_read pointer
+ if (mi2tx_byte_ack )
+ commit_read = !commit_read_sent;
+
+ if (tx_end_frame_reg)
+ begin
+ if (tx_byte_cntr < (CORE_PAYLOAD_SIZE - 1))
+ begin
+ if(!cf2tx_pad_enable)
+ begin
+ if (!cf2tx_append_fcs)
+ tx_lst_xfr_dt = 1;
+ end // if (!cf2tx_pad_enable)
+ end // if (tx_byte_cntr < (CORE_MIN_FRAME_SIZE - 1))
+ else
+ begin
+ if (!cf2tx_append_fcs)
+ tx_lst_xfr_dt = 1;
+ end
+ end // if ((mux_select == mux_max_select) && (tx_end_frame_reg))
+ end // case: dt_xfr_st
+
+ dt_pad_st :
+ begin
+ //wait until the padded data is enough to satisfy
+ //the minimum packet size and then return to idle
+ tx_byte_valid = 1;
+ set_pad_byte = 1;
+ //check to see if the 48 bytes are sent and then move to the
+ //crc state
+ if (mi2tx_byte_ack && (tx_byte_cntr == CORE_PAYLOAD_SIZE - 1))
+ begin
+ strt_fcs = 1;
+ nxt_dt_st = dt_fcs_st;
+ end // if (mi2tx_byte_ack && (tx_byte_cntr == CORE_PAYLOAD_SIZE - 1))
+ end // case: dt_pad_st
+
+ dt_fcs_st :
+ begin
+ if (tx_fcs_dn_reg && !strt_fcs_reg)
+ //last byte of crc is transmitted to MII and
+ //a new set of CRC is not transmitted to MII (this
+ //could be because of JAM sequence)
+ begin
+ //In the case of MII, while in this state the
+ //MII interface will be transferring the last
+ //byte to the PHY. If a collision is seen in this
+ //state then do the appropriate
+ commit_read = !commit_read_sent;
+ nxt_dt_st = dt_idle_st;
+ e_tx_sts_vld = 1;
+ end // if (tx_fcs_dn)
+ else
+ begin
+ nxt_dt_st = dt_fcs_st;
+ end // else: !if(tx_fcs_dn)
+ end // case: dt_fcs_st
+
+
+
+ default :
+ begin
+ nxt_dt_st = dt_idle_st;
+ end
+ endcase // case (curr_dt_st)
+ end // always @ (curr_dt_st or )
+
+ //counter to track the number of bytes transferred excluding
+ //the preamble and SOF
+ always @(posedge tx_clk or negedge tx_reset_n)
+ begin
+ if (!tx_reset_n)
+ begin
+ tx_byte_cntr <= 16'd0;
+ end // if (!tx_reset_n)
+ else
+ begin
+ if (mi2tx_byte_ack)
+ begin
+ tx_byte_cntr <= tx_byte_cntr + 1;
+ end // if (mi2tx_byte_ack)
+ else if (strt_preamble)
+ begin
+ tx_byte_cntr <= 16'd0;
+ end // else: !if(mi2tx_byte_ack)
+ end // else: !if(!tx_reset_n)
+ end // always @ (posedge tx_clk or negedge tx_reset_n)
+
+// So, introduce strt_preamble_pls to compensate for delay.
+ reg s_p_d1, s_p_d2, s_p_d3;
+ wire strt_preamble_pls;
+ always @(posedge tx_clk or negedge tx_reset_n) begin
+ if (!tx_reset_n) begin
+ s_p_d1 <= 1'b0;
+ s_p_d2 <= 1'b0;
+ s_p_d3 <= 1'b0;
+ end // if (!tx_reset_n)
+ else begin
+ s_p_d1 <= strt_preamble;
+ s_p_d2 <= s_p_d1;
+ s_p_d3 <= s_p_d2;
+ end
+ end // always
+
+ wire strt_preamble_prog;
+ assign strt_preamble_pls = strt_preamble || s_p_d1 || s_p_d2 || s_p_d3;
+ assign strt_preamble_prog = strt_preamble;
+
+ //fsm to transmit the FCS
+ //synchronous process
+ always @(posedge tx_clk or negedge tx_reset_n)
+ begin
+ if (!tx_reset_n)
+ curr_fcs_st <= fcs_idle_st;
+ else
+ curr_fcs_st <= nxt_fcs_st;
+ end // always @ (posedge tx_clk or negedge tx_reset_n)
+
+ //set bad fcs requirement
+ always @(posedge tx_clk or negedge tx_reset_n)
+ begin
+ if (!tx_reset_n)
+ send_bad_fcs <= 0;
+ else
+ begin
+ //if (set_bad_fcs)
+ if (set_bad_fcs | cfg_force_bad_fcs_pulse)
+ send_bad_fcs <= 1;
+ else if (clr_bad_fcs)
+ send_bad_fcs <= 0;
+ end // else: !if(!tx_reset_n)
+ end // always @ (posedge tx_clk or negedge tx_reset_n)
+ //set the error condition flags
+ always @(posedge tx_clk or negedge tx_reset_n)
+ begin
+ if (!tx_reset_n)
+ begin
+ fifo_undrn <= 0;
+ end // if (!tx_reset_n)
+ else
+ begin
+
+ if (set_fifo_undrn)
+ fifo_undrn <= 1;
+ else if (clr_fifo_undrn)
+ fifo_undrn <= 0;
+ end // else: !if(!tx_reset_n)
+ end // always @ (posedge tx_clk or negedge tx_reset_n)
+
+ //sync block for tx_fcs_dn
+
+ always @(posedge tx_clk or negedge tx_reset_n)
+ begin
+ if (!tx_reset_n)
+ begin
+ strt_fcs_reg <= 0;
+ tx_fcs_dn_reg <= 0;
+ tx_lst_xfr_fcs_reg <= 0;
+ end // if (!tx_reset_n)
+ else
+ begin
+ tx_fcs_dn_reg <= tx_fcs_dn;
+ strt_fcs_reg <= strt_fcs;
+ tx_lst_xfr_fcs_reg <= tx_lst_xfr_fcs;
+ end // else: !if(!tx_reset_n)
+ end // always @ (posedge tx_clk or negedge tx_reset_n)
+
+ //combinatorial process
+ //bad fcs or good fcs could have been requested, in either case
+ //the 8 bytes have to be shifted out, in the case of bad fcs
+ //the last bit of the last byte will up toggled.
+ always @(curr_fcs_st or mi2tx_byte_ack or fcs_mux_select or
+ strt_fcs or strt_fcs_reg)
+ begin
+ nxt_fcs_st = curr_fcs_st;
+ fcs_active = 0;
+ init_fcs_select = 0;
+ tx_fcs_dn = 0;
+ clr_bad_fcs = 0;
+ tx_lst_xfr_fcs = 0;
+ case (curr_fcs_st)
+ fcs_idle_st :
+ if (strt_fcs || strt_fcs_reg)
+ begin
+ nxt_fcs_st = fcs_snd_st;
+ init_fcs_select = 1;
+ end // if (strt_fcs)
+ fcs_snd_st :
+ begin
+ fcs_active = 1;
+ if (fcs_mux_select == 3'd3)
+ tx_lst_xfr_fcs = 1;
+ if (mi2tx_byte_ack && fcs_mux_select == 3'd3)
+ begin
+ tx_fcs_dn = 1;
+ clr_bad_fcs = 1;
+ nxt_fcs_st = fcs_idle_st;
+ end // if (mi2tx_byte_ack)
+ end // case: fcs_snd_st
+ default :
+ begin
+ nxt_fcs_st = fcs_idle_st;
+ end
+ endcase // case (curr_fcs_st)
+ end // always @ (curr_fcs_st or)
+
+ //fcs mux select counter
+ always @(posedge tx_clk or negedge tx_reset_n)
+ begin
+ if (!tx_reset_n)
+ fcs_mux_select <= 3'd0;
+ else
+ begin
+ if (strt_fcs)
+ fcs_mux_select <= 3'd0;
+ else if (mi2tx_byte_ack)
+ fcs_mux_select <= fcs_mux_select + 1 ;
+ end // else: !if(!tx_reset_n)
+ end // always @ (posedge tx_clk or negedge tx_reset_n)
+
+ //if frame is padded
+ always @(posedge tx_clk or negedge tx_reset_n)
+ begin
+ if (!tx_reset_n)
+ frm_padded <= 0;
+ else
+ begin
+ if (clr_pad_byte)
+ frm_padded <= 0;
+ else if (set_pad_byte)
+ frm_padded <= 1;
+ end // else: !if(!tx_reset_n)
+ end // always @ (posedge tx_clk or negedge tx_reset_n)
+
+
+ //register the TX fifo data on tx_fsm_rd and demux
+ //it for byte access
+ always @(posedge tx_clk or negedge tx_reset_n)
+ begin
+ if (!tx_reset_n)
+ begin
+ tx_fsm_dt_reg <= 8'd0;
+ tx_end_frame_reg <= 0;
+ end // if (!tx_reset_n)
+ else
+ begin
+ if (tx_fsm_rd)
+ begin
+ tx_fsm_dt_reg <= app_tx_dt_in;
+ tx_end_frame_reg <= tx_end_frame;
+ end // if (tx_fsm_rd)
+ if (e_tx_sts_vld)
+ tx_end_frame_reg <= 0;
+ end // else: !if(!tx_reset_n)
+ end // always @ (posedge tx_clk or negedge tx_reset_n)
+
+
+ //Data mux, is controlled either by the mux select from the
+ //primary data flow or from the FCS mux select. When PAD
+ //data option is used bytes of all zeros are transmitted
+ always @(fcs_active or app_tx_dt_in or tc2tx_fcs
+ or send_bad_fcs or fcs_mux_select or
+ set_pad_byte or tx_fsm_dt_reg )
+ begin
+ if (!fcs_active && !set_pad_byte)
+ begin
+ //primary data flow
+ tx_byte = tx_fsm_dt_reg[7:0];
+ end // if (!fcs_active)
+ else if (fcs_active)
+ begin
+ tx_byte = tc2tx_fcs[7:0];
+ case (fcs_mux_select)
+ 3'd0 :
+ tx_byte = tc2tx_fcs[7:0];
+ 3'd1 :
+ tx_byte = tc2tx_fcs[15:8];
+ 3'd2 :
+ tx_byte = tc2tx_fcs[23:16];
+ default :
+ begin
+ if (send_bad_fcs)
+ tx_byte = {!tc2tx_fcs[31], tc2tx_fcs[30:24]};
+ else
+ tx_byte = tc2tx_fcs[31:24];
+ end // case: 3'd7
+ endcase // case (mux_select)
+ end // else: !if(!fcs_active)
+ else if (set_pad_byte)
+ tx_byte = 8'd0;
+ else
+ tx_byte = 8'd0;
+ end // always @ (fcs_active or app_tx_dt_in or tc2tx_fcs or mux_select...
+
+ //generate fcs computation enable. One cycle after the
+ //strt_preamble the tx_byte is stable and a cycle after the
+ //mi2tx_byte_ack also a new byte is stable
+ always @(posedge tx_clk or negedge tx_reset_n)
+ begin
+ if (!tx_reset_n)
+ gen_tx_crc <= 1'b0;
+ else
+ begin
+ if (fcs_active || strt_fcs)
+ gen_tx_crc <= 1'b0;
+ else
+ gen_tx_crc <= strt_preamble || mi2tx_byte_ack;
+ end // else: !if(!tx_reset_n)
+ end // always (posedge tx_clk or negedge tx_reset_n)
+
+
+endmodule // tx_fsm
diff --git a/verilog/rtl/gmac/mac/g_tx_top.v b/verilog/rtl/gmac/mac/g_tx_top.v
new file mode 100755
index 0000000..5e8173e
--- /dev/null
+++ b/verilog/rtl/gmac/mac/g_tx_top.v
@@ -0,0 +1,231 @@
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Tubo 8051 cores MAC Interface Module ////
+//// ////
+//// This file is part of the Turbo 8051 cores project ////
+//// http://www.opencores.org/cores/turbo8051/ ////
+//// ////
+//// Description ////
+//// Turbo 8051 definitions. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : Mar 2, 2011 ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+/***************************************************************
+ Description:
+
+ tx_top.v: This module has the top level of the transmit block
+ It instantiates the following blocks
+ 1. tx_fsm
+ 2. tx_crc
+ 3. tx_fifo_mgmt
+ 4. deferral
+ 5. backoff
+ ***********************************************************************/
+module g_tx_top(
+ app_clk,
+ set_fifo_undrn,
+
+
+ //Outputs
+ //TX FIFO management
+ tx_commit_read,
+ tx_dt_rd,
+
+ //MII interface
+ tx2mi_strt_preamble,
+ tx2mi_byte_valid,
+ tx2mi_byte,
+ tx2mi_end_transmit,
+ tx_ch_en,
+
+ //Status to application
+ tx_sts_vld,
+ tx_sts_byte_cntr,
+ tx_sts_fifo_underrun,
+
+
+ //Inputs
+ //MII interface
+ phy_tx_en,
+ phy_tx_er,
+
+ //configuration
+ cf2tx_ch_en,
+ cf2df_dfl_single,
+ cf2tx_pad_enable,
+ cf2tx_append_fcs,
+ cf_mac_mode,
+ cf_mac_sa,
+ cf2tx_force_bad_fcs,
+ //FIFO data
+ app_tx_dt_in,
+ app_tx_fifo_empty,
+ app_tx_rdy,
+
+ //MII
+ mi2tx_byte_ack,
+ app_reset_n,
+ tx_reset_n,
+ tx_clk);
+ input app_reset_n; // Global app_reset for the MAC
+ input tx_reset_n;
+ input tx_clk; // Transmit clock
+
+ input [8:0] app_tx_dt_in;
+ input app_tx_fifo_empty;
+ input app_tx_rdy;
+
+ input phy_tx_en; // Transmit data Enable
+ input phy_tx_er; // Transmit Error
+ input cf2tx_ch_en; // Transmit channel Enable
+ input [7:0] cf2df_dfl_single;
+ input cf2tx_pad_enable; // Padding Enabled
+ input cf2tx_append_fcs; // Append CRC to packets
+ input cf2tx_force_bad_fcs; // force bad fcs
+ input [47:0] cf_mac_sa; // MAC Source Address
+ input cf_mac_mode; // Gigabit or 10/100
+
+
+
+ input mi2tx_byte_ack; // Transmit byte ack from RMII
+ output tx_commit_read;
+ output tx_dt_rd; //get the next fsm data
+
+
+ output tx2mi_strt_preamble; // Start preamble indicated to RMII
+ output tx2mi_byte_valid; // Byte valid from the Tx State Macine
+ output [7:0] tx2mi_byte; // Transmit byte to RMII
+ output tx2mi_end_transmit; // Transmit complete
+
+ output tx_sts_vld; //tx_sts is valid on valid tx_sts_vld
+ output [15:0] tx_sts_byte_cntr;
+ output tx_sts_fifo_underrun;
+
+ output tx_ch_en;
+
+ output set_fifo_undrn;
+
+ input app_clk;
+
+ wire [31:0] tc2tx_fcs;
+ wire set_fifo_undrn;
+
+
+
+
+
+ // Instantiate Defferal block
+ g_deferral U_deferral (
+ //Outputs
+ .df2tx_dfl_dn(df2tx_dfl_dn),
+ .cf2df_dfl_single(cf2df_dfl_single),
+ .phy_tx_en(phy_tx_en),
+ .phy_tx_er(phy_tx_er),
+ .tx_clk(tx_clk),
+ .app_reset_n(tx_reset_n));
+
+
+
+ // Instantiate Transmit State machine block
+ g_tx_fsm U_tx_fsm(
+ .app_clk(app_clk),
+ .set_fifo_undrn(set_fifo_undrn),
+
+ //Outputs
+ .tx_commit_read(tx_commit_read),
+ .tx_dt_rd(tx_dt_rd),
+ //FCS block interface
+ .tx2tc_fcs_active(tx2tc_fcs_active),
+ .tx2tc_gen_crc(tx2tc_gen_crc),
+ //MII or RMII interface signals
+ .tx2mi_strt_preamble(tx2mi_strt_preamble),
+ .tx2mi_byte_valid(tx2mi_byte_valid),
+ .tx2mi_byte(tx2mi_byte),
+ .tx2mi_end_transmit(tx2mi_end_transmit),
+ .tx_ch_en(tx_ch_en),
+ .phy_tx_en(phy_tx_en),
+ //tx fifo management outputs
+ .tx_sts_vld(tx_sts_vld),
+ .tx_sts_byte_cntr(tx_sts_byte_cntr),
+ .tx_sts_fifo_underrun(tx_sts_fifo_underrun),
+ .app_tx_rdy(app_tx_rdy),
+ .tx_end_frame(app_tx_dt_in[8]),
+ .app_tx_dt_in(app_tx_dt_in[7:0]),
+ .app_tx_fifo_empty(app_tx_fifo_empty),
+ //dfl and back off
+ .df2tx_dfl_dn(df2tx_dfl_dn),
+ //inputs from FCS
+ .tc2tx_fcs(tc2tx_fcs),
+ .cf2tx_ch_en(cf2tx_ch_en),
+ .cf2tx_pad_enable(cf2tx_pad_enable),
+ .cf2tx_append_fcs(cf2tx_append_fcs),
+ .cf_mac_mode(cf_mac_mode),
+ .cf_mac_sa(cf_mac_sa),
+ .cf2tx_force_bad_fcs(cf2tx_force_bad_fcs),
+ //MII
+ .mi2tx_byte_ack(mi2tx_byte_ack),
+ .tx_clk(tx_clk),
+ .tx_reset_n(tx_reset_n),
+ .app_reset_n(app_reset_n));
+
+
+
+
+ // Instantiate CRC 32 block for Transmit
+ g_tx_crc32 U_tx_crc32 (
+ // List of outputs.
+ .tx_fcs (tc2tx_fcs),
+ // List of inputs
+ .gen_tx_crc(tx2tc_gen_crc),
+ .tx_reset_crc(tx2mi_strt_preamble),
+ .tx_data(tx2mi_byte),
+ .sclk(tx_clk),
+ .reset_n(tx_reset_n)
+ );
+
+endmodule
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/verilog/rtl/gmac/mac/s2f_sync.v b/verilog/rtl/gmac/mac/s2f_sync.v
new file mode 100755
index 0000000..0ea7b49
--- /dev/null
+++ b/verilog/rtl/gmac/mac/s2f_sync.v
@@ -0,0 +1,87 @@
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Tubo 8051 cores MAC Interface Module ////
+//// ////
+//// This file is part of the Turbo 8051 cores project ////
+//// http://www.opencores.org/cores/turbo8051/ ////
+//// ////
+//// Description ////
+//// Turbo 8051 definitions. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : Mar 2, 2011 ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+/***************************************************************
+ Description:
+ Synchronizes the pulse from one clock to another
+ * clock domain
+***********************************************************************/
+module s2f_sync (
+ //outputs
+ sync_out_pulse,
+ //inputs
+ in_pulse,
+ dest_clk,
+ reset_n);
+
+ output sync_out_pulse; //output synchronised to slow clock
+ input in_pulse; //input based on fast clock, pulse
+ input dest_clk; //slow clock
+ input reset_n;
+
+ reg sync1_out, sync2_out, sync3_out;
+
+ always @(posedge dest_clk or negedge reset_n)
+ begin
+ if (!reset_n)
+ begin
+ sync1_out <= 0;
+ sync2_out <= 0;
+ sync3_out <= 0;
+ end // if (!reset_n)
+ else
+ begin
+ sync1_out <= in_pulse;
+ sync2_out <= sync1_out;
+ sync3_out <= sync2_out;
+ end // else: !if(reset_n)
+ end // always @ (posedge dest_clk or negedge reset_n)
+
+ assign sync_out_pulse = sync2_out && !sync3_out;
+endmodule // s2f_sync
+
+
+
+
+
diff --git a/verilog/rtl/gmac/top/filelist_top.f b/verilog/rtl/gmac/top/filelist_top.f
new file mode 100644
index 0000000..9db1813
--- /dev/null
+++ b/verilog/rtl/gmac/top/filelist_top.f
@@ -0,0 +1,22 @@
+g_mac_top.v
+dble_reg.v
+g_tx_fsm.v
+g_deferral.v
+g_tx_top.v
+g_rx_fsm.v
+g_cfg_mgmt.v
+s2f_sync.v
+g_md_intf.v
+g_deferral_rx.v
+g_rx_top.v
+g_mii_intf.v
+g_mac_core.v
+g_rx_crc32.v
+g_tx_crc32.v
+async_fifo.v
+eth_parser.v
+-v registers.v
+-v stat_counter.v
+-v toggle_sync.v
++lint=all
++v2k
diff --git a/verilog/rtl/gmac/top/g_mac_top.v b/verilog/rtl/gmac/top/g_mac_top.v
new file mode 100644
index 0000000..2f393f4
--- /dev/null
+++ b/verilog/rtl/gmac/top/g_mac_top.v
@@ -0,0 +1,443 @@
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Tubo 8051 cores MAC Interface Module ////
+//// ////
+//// This file is part of the Turbo 8051 cores project ////
+//// http://www.opencores.org/cores/turbo8051/ ////
+//// ////
+//// Description ////
+//// Turbo 8051 definitions. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+// ------------------------------------------------------------------------
+// Description :
+// This module instantiates the MAC block and the FIFO interface
+//
+// ------------------------------------------------------------------------
+module g_mac_top (
+ scan_mode,
+ s_reset_n,
+ tx_reset_n,
+ rx_reset_n,
+ reset_mdio_clk_n,
+ app_reset_n,
+
+ app_clk,
+
+ // Application RX FIFO Interface
+ app_txfifo_wren_i,
+ app_txfifo_wrdata_i,
+ app_txfifo_addr,
+ app_txfifo_full_o,
+ app_txfifo_afull_o,
+ app_txfifo_space_o,
+
+ // Application TX FIFO Interface
+ app_rxfifo_rden_i,
+ app_rxfifo_empty_o,
+ app_rxfifo_aempty_o,
+ app_rxfifo_cnt_o,
+ app_rxfifo_rdata_o,
+ app_rxfifo_addr,
+
+ app_rx_desc_req ,
+ app_rx_desc_ack ,
+ app_rx_desc_discard ,
+ app_rx_desc_data ,
+
+ // Conntrol Bus Sync with Application Clock
+ reg_cs,
+ reg_wr,
+ reg_addr,
+ reg_wdata,
+ reg_be,
+
+ // Outputs
+ reg_rdata,
+ reg_ack,
+
+
+ // Phy Signals
+
+ // Line Side Interface TX Path
+ phy_tx_en,
+ phy_tx_er,
+ phy_txd,
+ phy_tx_clk,
+
+ // Line Side Interface RX Path
+ phy_rx_clk,
+ phy_rx_er,
+ phy_rx_dv,
+ phy_rxd,
+ phy_crs,
+
+ //MDIO interface
+ mdio_clk,
+ mdio_in,
+ mdio_out_en,
+ mdio_out,
+
+ // QCounter
+ rx_buf_qbase_addr,
+ tx_buf_qbase_addr,
+
+ tx_qcnt_inc,
+ tx_qcnt_dec,
+ rx_qcnt_inc,
+ rx_qcnt_dec,
+
+ tx_qcnt,
+ rx_qcnt
+
+ );
+
+parameter W = 8'd9;
+parameter DP = 8'd32;
+parameter AW = (DP == 2) ? 1 :
+ (DP == 4) ? 2 :
+ (DP == 8) ? 3 :
+ (DP == 16) ? 4 :
+ (DP == 32) ? 5 :
+ (DP == 64) ? 6 :
+ (DP == 128) ? 7 :
+ (DP == 256) ? 8 : 0;
+
+
+//-----------------------------------------------------------------------
+// INPUT/OUTPUT DECLARATIONS
+//-----------------------------------------------------------------------
+input scan_mode;
+input s_reset_n;
+input tx_reset_n;
+input rx_reset_n;
+input reset_mdio_clk_n;
+input app_reset_n;
+
+//-----------------------------------------------------------------------
+// Application Clock Related Declaration
+//-----------------------------------------------------------------------
+input app_clk;
+
+
+// Application RX FIFO Interface
+input app_txfifo_wren_i;
+input [8:0] app_txfifo_wrdata_i;
+output [15:0] app_txfifo_addr;
+
+output app_txfifo_full_o;
+output app_txfifo_afull_o;
+output [AW:0] app_txfifo_space_o;
+
+// Application TX FIFO Interface
+input app_rxfifo_rden_i;
+output app_rxfifo_empty_o;
+output app_rxfifo_aempty_o;
+output [AW:0] app_rxfifo_cnt_o;
+output [8:0] app_rxfifo_rdata_o;
+output [15:0] app_rxfifo_addr;
+
+// descriptor interface
+output app_rx_desc_req ; // descriptor request
+input app_rx_desc_ack ; // descriptor ack
+output app_rx_desc_discard ; // descriptor discard
+output [31:0] app_rx_desc_data ; // descriptor data
+
+// Conntrol Bus Sync with Application Clock
+//---------------------------------
+// Reg Bus Interface Signal
+//---------------------------------
+input reg_cs ;
+input reg_wr ;
+input [3:0] reg_addr ;
+input [31:0] reg_wdata ;
+input [3:0] reg_be ;
+
+ // Outputs
+output [31:0] reg_rdata ;
+output reg_ack ;
+
+//-----------------------------------------------------------------------
+// Line-Tx Signal
+//-----------------------------------------------------------------------
+output phy_tx_en;
+output phy_tx_er;
+output [7:0] phy_txd;
+input phy_tx_clk;
+
+//-----------------------------------------------------------------------
+// Line-Rx Signal
+//-----------------------------------------------------------------------
+input phy_rx_clk;
+input phy_rx_er;
+input phy_rx_dv;
+input [7:0] phy_rxd;
+input phy_crs;
+
+
+//-----------------------------------------------------------------------
+// MDIO Signal
+//-----------------------------------------------------------------------
+ input mdio_clk;
+ input mdio_in;
+ output mdio_out_en;
+ output mdio_out;
+
+//--------------------------------------
+// QCounter, Better to move to seperate global reg block
+//-------------------------------------
+output [9:0] rx_buf_qbase_addr; // Rx QBase Address
+output [9:0] tx_buf_qbase_addr; // TX QBase Address
+
+input tx_qcnt_inc; // Tx QCounter Increment indication
+input tx_qcnt_dec; // Tx QCounter Decrement indication
+input rx_qcnt_inc; // Rx QCounter Increment indication
+input rx_qcnt_dec; // Rx QCounter Decrement indication
+
+output [3:0] tx_qcnt ;
+output [3:0] rx_qcnt ;
+
+//---------------------
+// RX FIFO Interface Signal
+ wire clr_rx_error_from_rx_fsm_o;
+ wire rx_fifo_full_i;
+ wire rx_fifo_wr_o;
+ wire [8:0] rx_fifo_data_o;
+ wire rx_commit_wr_o;
+ wire rx_commit_write_done_o;
+ wire rx_rewind_wr_o;
+ wire rx_fifo_error = 1'b0;
+
+//-----------------------------------------------------------------------
+// TX-Clock Domain Status Signal
+//-----------------------------------------------------------------------
+ wire tx_commit_read;
+ wire tx_fifo_rd;
+
+ wire [8:0] tx_fifo_data;
+ wire tx_fifo_empty;
+ wire tx_fifo_rdy;
+ wire [AW:0] tx_fifo_aval;
+
+ wire [47:0] cf_mac_sa;
+ wire [31:0] cfg_ip_sa;
+ wire [31:0] cfg_mac_filter;
+ wire [3:0] tx_buf_base_addr;
+ wire [3:0] rx_buf_base_addr;
+ wire [11:0] g_rx_pkt_len;
+ wire [15:0] pkt_status;
+ wire app_rxfifo_empty;
+ wire g_rx_block_rxrd;
+ wire [15:0] g_rx_pkt_status ; // Packet Status
+
+assign app_rxfifo_empty_o = app_rxfifo_empty | g_rx_block_rxrd;
+g_dpath_ctrl m_g_dpath_ctrl (
+ .rst_n ( s_reset_n ),
+ .clk ( app_clk ),
+
+ .rx_buf_base_addr (rx_buf_base_addr ),
+ .tx_buf_base_addr (tx_buf_base_addr ),
+
+ // gmac core to memory write interface
+ .g_rx_mem_rd ( app_rxfifo_rden_i ),
+ .g_rx_mem_eop ( app_rxfifo_rdata_o[8] ),
+ .g_rx_mem_addr ( app_rxfifo_addr ),
+ .g_rx_block_rxrd ( g_rx_block_rxrd ),
+
+ // descr handshake
+ .g_rx_desc_req (app_rx_desc_req ),
+ .g_rx_desc_discard (app_rx_desc_discard ),
+ .g_rx_desc_data (app_rx_desc_data ),
+ .g_rx_desc_ack (app_rx_desc_ack ),
+
+
+ .g_rx_pkt_done (g_rx_pkt_done ),
+ .g_rx_pkt_len (g_rx_pkt_len ),
+ .g_rx_pkt_status (g_rx_pkt_status ),
+ .g_rx_pkt_drop (g_rx_pkt_drop )
+
+
+ );
+
+
+g_eth_parser u_eth_parser (
+ .s_reset_n (app_reset_n),
+ .app_clk (app_clk),
+
+ // Configuration
+ .cfg_filters (cfg_mac_filter),
+ .cfg_mac_sa (cf_mac_sa),
+ .cfg_ip_sa (cfg_ip_sa),
+
+ // Input Control Information
+ .eop (app_rxfifo_rdata_o[8]),
+ .dval (app_rxfifo_rden_i),
+ .data (app_rxfifo_rdata_o[7:0]),
+
+ // output status
+ .pkt_done (g_rx_pkt_done ),
+ .pkt_len (g_rx_pkt_len ),
+ .pkt_status (g_rx_pkt_status ),
+ .pkt_drop_ind (g_rx_pkt_drop ),
+ .pkt_drop_reason ()
+ );
+
+
+
+g_mac_core u_mac_core (
+ .scan_mode (scan_mode),
+ .s_reset_n (s_reset_n) ,
+ .tx_reset_n (tx_reset_n) ,
+ .rx_reset_n (rx_reset_n) ,
+ .reset_mdio_clk_n (reset_mdio_clk_n) ,
+ .app_reset_n (app_reset_n) ,
+
+ // Reg Bus Interface Signal
+ . reg_cs (reg_cs),
+ . reg_wr (reg_wr),
+ . reg_addr (reg_addr),
+ . reg_wdata (reg_wdata),
+ . reg_be (reg_be),
+
+ // Outputs
+ . reg_rdata (reg_rdata),
+ . reg_ack (reg_ack),
+
+ .app_clk (app_clk) ,
+
+ // Conntrol Bus Sync with Application Clock
+
+
+
+ // RX FIFO Interface Signal
+ .rx_fifo_full_i (rx_fifo_full_i) ,
+ .rx_fifo_wr_o (rx_fifo_wr_o) ,
+ .rx_fifo_data_o (rx_fifo_data_o) ,
+ .rx_commit_wr_o (rx_commit_wr_o) ,
+ .rx_rewind_wr_o (rx_rewind_wr_o) ,
+ .rx_commit_write_done_o (rx_commit_write_done_o) ,
+ .clr_rx_error_from_rx_fsm_o(clr_rx_error_from_rx_fsm_o) ,
+ .rx_fifo_error_i (rx_fifo_error) ,
+
+ // TX FIFO Interface Signal
+ .tx_fifo_data_i (tx_fifo_data) ,
+ .tx_fifo_empty_i (tx_fifo_empty) ,
+ .tx_fifo_rdy_i (tx_fifo_rdy) , // See to connect to config
+ .tx_fifo_rd_o (tx_fifo_rd) ,
+ .tx_commit_read_o (tx_commit_read) ,
+
+ // Phy Signals
+
+ // Line Side Interface TX Path
+ .phy_tx_en (phy_tx_en) ,
+ .phy_tx_er (phy_tx_er) ,
+ .phy_txd (phy_txd) ,
+ .phy_tx_clk (phy_tx_clk) ,
+
+ // Line Side Interface RX Path
+ .phy_rx_clk (phy_rx_clk) ,
+ .phy_rx_er (phy_rx_er) ,
+ .phy_rx_dv (phy_rx_dv) ,
+ .phy_rxd (phy_rxd) ,
+ .phy_crs (phy_crs) ,
+
+ //MDIO interface
+ .mdio_clk (mdio_clk) ,
+ .mdio_in (mdio_in) ,
+ .mdio_out_en (mdio_out_en) ,
+ .mdio_out (mdio_out),
+
+ .cf_mac_sa (cf_mac_sa),
+ .cfg_ip_sa (cfg_ip_sa),
+ .cfg_mac_filter (cfg_mac_filter),
+
+ .rx_buf_base_addr (rx_buf_base_addr),
+ .tx_buf_base_addr (tx_buf_base_addr),
+
+ .rx_buf_qbase_addr (rx_buf_qbase_addr),
+ .tx_buf_qbase_addr (tx_buf_qbase_addr),
+
+ .tx_qcnt_inc (tx_qcnt_inc),
+ .tx_qcnt_dec (tx_qcnt_dec),
+ .tx_qcnt (tx_qcnt),
+
+ .rx_qcnt_inc (rx_qcnt_inc),
+ .rx_qcnt_dec (rx_qcnt_dec),
+ .rx_qcnt (rx_qcnt)
+
+ );
+
+assign tx_fifo_rdy = (tx_fifo_aval > 8) ; // Dinesh-A Change it to config
+
+async_fifo #(W,DP,0,0) u_mac_txfifo (
+ .wr_clk (app_clk),
+ .wr_reset_n (app_reset_n),
+ .wr_en (app_txfifo_wren_i),
+ .wr_data (app_txfifo_wrdata_i),
+ .full (app_txfifo_full_o), // sync'ed to wr_clk
+ .afull (app_txfifo_afull_o), // sync'ed to wr_clk
+ .wr_total_free_space (app_txfifo_space_o),
+
+ .rd_clk (phy_tx_clk),
+ .rd_reset_n (tx_reset_n),
+ .rd_en (tx_fifo_rd),
+ .empty (tx_fifo_empty), // sync'ed to rd_clk
+ .aempty (tx_fifo_aempty), // sync'ed to rd_clk
+ .rd_total_aval (tx_fifo_aval),
+ .rd_data (tx_fifo_data)
+ );
+
+async_fifo #(W,DP,0,0) u_mac_rxfifo (
+ .wr_clk (phy_rx_clk),
+ .wr_reset_n (rx_reset_n),
+ .wr_en (rx_fifo_wr_o),
+ .wr_data (rx_fifo_data_o),
+ .full (rx_fifo_full_i), // sync'ed to wr_clk
+ .afull (rx_fifo_afull_i), // sync'ed to wr_clk
+ .wr_total_free_space (),
+
+ .rd_clk (app_clk),
+ .rd_reset_n (app_reset_n),
+ .rd_en (app_rxfifo_rden_i),
+ .empty (app_rxfifo_empty), // sync'ed to rd_clk
+ .aempty (app_rxfifo_aempty_o), // sync'ed to rd_clk
+ .rd_total_aval (app_rxfifo_cnt_o),
+ .rd_data (app_rxfifo_rdata_o)
+ );
+
+
+
+endmodule
+
diff --git a/verilog/rtl/lbist/src/lbist_core.sv b/verilog/rtl/lbist/src/lbist_core.sv
new file mode 100644
index 0000000..3c4e945
--- /dev/null
+++ b/verilog/rtl/lbist/src/lbist_core.sv
@@ -0,0 +1,313 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// LBIST CORE ////
+//// ////
+//// This file is part of the logic_bist project ////
+//// https://github.com/dineshannayya/logic_bist.git ////
+//// ////
+//// Description ////
+//// This block manages all the lbist sequence ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.1 - 29 Nov 2021 Dinesh A ////
+//// Initial version ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+module lbist_core
+ #(parameter SCW = 8 // SCAN CHAIN WIDTH
+ )
+
+ (
+
+ input logic mclk,
+ input logic mclk_skew,
+ input logic rst_n,
+ input logic srst, // software reset
+
+
+ // Reg Bus Interface Signal
+ input logic lbist_start, // lbist start
+ input logic [15:0] cfg_lbist_pat, // Total Scan pattern to be run
+ input logic [15:0] cfg_chain_depth, // Scan Chain Depth
+ input logic cfg_lbist_rsb, // Option to bypass First scan shift compare
+ output logic lbist_done, // End of Ltest
+ output logic [31:0] lbist_sig, // scan signature
+
+
+ // Scan Control Signal
+ output logic scan_clk,
+ output logic scan_rst_n,
+ output logic scan_mode,
+ output logic scan_en,
+ output logic [SCW-1:0] scan_in,
+ input logic [SCW-1:0] scan_out
+
+);
+
+// FSM STATE
+
+parameter FSM_IDLE = 4'b0000;
+parameter FSM_RESET_WAIT = 4'b0001;
+parameter FSM_IDLE_WAIT = 4'b0010;
+parameter FSM_ASSERT_SCAN_EN = 4'b0011;
+parameter FSM_SCAN_SHIFT = 4'b0100;
+parameter FSM_DEASSERT_SCAN_EN = 4'b0101;
+parameter FSM_DEASSERT_SCAN_CLK = 4'b0110;
+parameter FSM_SCAN_CAPTURE = 4'b0111;
+
+// Scan Sequence
+// 1. scan_reset_n = 0, scan_clk_enb = 0, scan_en = 0, Wait 4 Cycle
+// 2. scan_reset_n = 1, scan_clk_enb = 0, scan_en = 0, Wait 4 Cycle
+// 3. scan_en = 1, Wait 4 Cycle
+// 4. scan_clk_enb = 1 , Wait for Scan Depth, If Total Pattern over, Then Exit
+// 5. scan_clk_enb = 0, scan_en = 0, Wait for 4 Cycle
+// 6. scan_clk_en = 1 , Wait for 1 Cycle
+// 7. scan_clk_en = 0 Go to #3
+
+logic [3:0] state, next_state;
+logic next_scan_en;
+logic scan_clk_enb,next_scan_clk_enb;
+logic [15:0]clk_cnt, next_clk_cnt;
+logic next_scan_rst_n;
+logic [15:0]scan_pat_cnt,next_scan_pat_cnt;
+logic next_lbist_done;
+logic lbist_start_d;
+logic next_scan_mode;
+logic r_sshift_done; // Indicate Reset Scan shift done, This is first pattern
+
+always_ff @(negedge rst_n or posedge mclk_skew)
+begin
+ if(rst_n == 1'b0) begin
+ state <= FSM_IDLE;
+ scan_en <= '0;
+ scan_clk_enb <= '0;
+ clk_cnt <= '0;
+ scan_rst_n <= '1;
+ scan_pat_cnt <= '0;
+ lbist_done <= '0;
+ lbist_start_d <= 0;
+ scan_mode <= 0;
+ r_sshift_done <= 0;
+ end else if(srst) begin
+ state <= FSM_IDLE;
+ scan_en <= '0;
+ scan_clk_enb <= '0;
+ clk_cnt <= '0;
+ scan_rst_n <= '1;
+ scan_pat_cnt <= '0;
+ lbist_done <= '0;
+ lbist_start_d <= 0;
+ scan_mode <= 0;
+ r_sshift_done <= 0;
+ end else begin
+ state <= next_state;
+ scan_en <= next_scan_en;
+ scan_clk_enb <= next_scan_clk_enb;
+ clk_cnt <= next_clk_cnt;
+ scan_rst_n <= next_scan_rst_n;
+ scan_pat_cnt <= next_scan_pat_cnt;
+ lbist_done <= next_lbist_done;
+ lbist_start_d <= lbist_start;
+ scan_mode <= next_scan_mode;
+ // After first scan capture, set reset scan shift done indication
+ if(state == FSM_SCAN_CAPTURE)
+ r_sshift_done <= 1;
+
+ end
+end
+
+
+wire lbist_pos_edge = (lbist_start_d ==0) && (lbist_start == 1);
+
+always_comb begin
+ next_state = state;
+ next_scan_en = scan_en;
+ next_scan_clk_enb = scan_clk_enb;
+ next_clk_cnt = clk_cnt;
+ next_scan_rst_n = scan_rst_n;
+ next_scan_pat_cnt = scan_pat_cnt;
+ next_lbist_done = lbist_done;
+ next_scan_mode = scan_mode;
+ case(state)
+ FSM_IDLE:
+ if(lbist_pos_edge) begin
+ next_lbist_done = 0;
+ next_scan_pat_cnt = cfg_lbist_pat;
+ next_scan_mode = 1;
+ next_scan_rst_n = 0;
+ next_scan_en = 0;
+ next_scan_clk_enb = 0;
+ next_clk_cnt = 4;
+ next_state = FSM_RESET_WAIT;
+ end
+ FSM_RESET_WAIT:
+ if(clk_cnt == 0) begin
+ next_scan_rst_n = 1;
+ next_scan_en = 0;
+ next_clk_cnt = 4;
+ next_state = FSM_IDLE_WAIT;
+ end else begin
+ next_clk_cnt = next_clk_cnt - 1;
+ end
+ FSM_IDLE_WAIT:
+ if(clk_cnt == 0) begin
+ next_scan_en = 1;
+ next_clk_cnt = 4;
+ next_state = FSM_ASSERT_SCAN_EN;
+ end else begin
+ next_clk_cnt = next_clk_cnt - 1;
+ end
+ FSM_ASSERT_SCAN_EN:
+ if(clk_cnt == 0) begin
+ next_scan_clk_enb = 1;
+ next_clk_cnt = cfg_chain_depth;
+ next_state = FSM_SCAN_SHIFT;
+ end else begin
+ next_clk_cnt = next_clk_cnt - 1;
+ end
+ FSM_SCAN_SHIFT:
+ if(clk_cnt == 0) begin
+ if(scan_pat_cnt == 0) begin
+ next_lbist_done = 1;
+ next_scan_mode = 0;
+ next_state = FSM_IDLE ;
+ end else begin
+ next_scan_pat_cnt= next_scan_pat_cnt-1;
+ next_scan_clk_enb= 0;
+ next_clk_cnt = 1;
+ next_state = FSM_DEASSERT_SCAN_EN;
+ end
+ end else begin
+ next_clk_cnt = next_clk_cnt - 1;
+ end
+ FSM_DEASSERT_SCAN_EN:
+ if(clk_cnt == 0) begin
+ next_scan_en = 0;
+ next_clk_cnt = 4;
+ next_state = FSM_DEASSERT_SCAN_CLK;
+ end else begin
+ next_clk_cnt = next_clk_cnt - 1;
+ end
+ FSM_DEASSERT_SCAN_CLK:
+ if(clk_cnt == 0) begin
+ next_scan_clk_enb= 1;
+ next_scan_en = 0;
+ next_clk_cnt = 0;
+ next_state = FSM_SCAN_CAPTURE;
+ end else begin
+ next_clk_cnt = next_clk_cnt - 1;
+ end
+ FSM_SCAN_CAPTURE: begin
+ next_scan_clk_enb= 0;
+ next_scan_en = 0;
+ next_clk_cnt = 4;
+ next_state = FSM_IDLE_WAIT;
+ end
+ endcase
+
+end
+
+
+//--------------------------------
+// Scan clock generation
+//--------------------------------
+clk_gate u_scan_gate (
+
+ .GCLK (scan_clk),
+ .TE (1'b0),
+ .EN (scan_clk_enb),
+ .CLK (mclk)
+ );
+
+
+
+//--------------------------------
+// Scan Pattern Generation
+//--------------------------------
+logic [31:0] tx_crc_out;
+
+assign scan_in = (clk_cnt[1:0] == 2'b00) ? tx_crc_out[7:0] :
+ (clk_cnt[1:0] == 2'b01) ? tx_crc_out[15:8] :
+ (clk_cnt[1:0] == 2'b10) ? tx_crc_out[23:16] : tx_crc_out[31:24];
+
+
+// Run CRC at SCAN SHIFT PHASE at every once in 4 cycles
+wire crc_tx_run = (state == FSM_SCAN_SHIFT) & (clk_cnt[1:0] == 2'b11);
+wire crc_rx_run = (cfg_lbist_rsb) ? r_sshift_done & (state == FSM_SCAN_SHIFT) & (clk_cnt[1:0] == 2'b11):
+ (state == FSM_SCAN_SHIFT) & (clk_cnt[1:0] == 2'b11);
+wire crc_clear = lbist_pos_edge;
+
+crc_32 u_tx_crc(
+ // List of outputs.
+ .crc_out (tx_crc_out),
+
+ // List of inputs
+ .run (crc_tx_run), // when asserted, crc is generated
+ .clear (crc_clear), // When asserted crc is re-initialized
+ .data_in (8'h0),
+ .mclk (mclk_skew),
+ .reset_n (rst_n)
+ );
+
+crc_32 u_rx_crc(
+ // List of outputs.
+ .crc_out (lbist_sig),
+
+ // List of inputs
+ .run (crc_rx_run), // when asserted, crc is generated
+ .clear (crc_clear), // When asserted crc is re-initialized
+ .data_in (scan_out),
+ .mclk (mclk_skew),
+ .reset_n (rst_n)
+ );
+
+endmodule
diff --git a/verilog/rtl/lbist/src/lbist_reg.sv b/verilog/rtl/lbist/src/lbist_reg.sv
new file mode 100644
index 0000000..9b02226
--- /dev/null
+++ b/verilog/rtl/lbist/src/lbist_reg.sv
@@ -0,0 +1,218 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Logic Bist register ////
+//// ////
+//// This file is part of the logic bist project ////
+//// https://github.com/dineshannayya/logic_bist.git ////
+//// ////
+//// Description ////
+//// This block manges all the LBIST Register and Status ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.1 - 29 Nov 2021 Dinesh A ////
+//// Initial version ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+module lbist_reg (
+
+ input logic mclk,
+ input logic reset_n,
+
+
+ // Reg Bus Interface Signal
+ input logic reg_cs,
+ input logic reg_wr,
+ input logic [1:0] reg_addr,
+ input logic [31:0] reg_wdata,
+ input logic [3:0] reg_be,
+
+ // Outputs
+ output logic [31:0] reg_rdata,
+ output logic reg_ack,
+
+ // BIST I/F
+ output logic cfg_lbist_rst,
+ output logic cfg_lbist_start, // lbist start
+ output logic cfg_lbist_rsb, // lbist reset scan compare bypass
+ output logic [15:0] cfg_lbist_pat, // Total Scan pattern to be run
+ output logic [15:0] cfg_chain_depth, // Scan Chain Depth
+
+
+ input logic lbist_done,
+ input logic [31:0] lbist_sig
+
+
+ );
+
+
+
+//-----------------------------------------------------------------------
+// Internal Wire Declarations
+//-----------------------------------------------------------------------
+
+logic sw_rd_en ;
+logic sw_wr_en ;
+logic [1:0] sw_addr ; // addressing 16 registers
+logic [3:0] wr_be ;
+logic [31:0] sw_reg_wdata;
+
+
+
+logic [31:0] reg_0; // Reg 0
+logic [31:0] reg_1; // Reg 1
+
+logic [31:0] reg_out;
+
+//-----------------------------------------------------------------------
+// Main code starts here
+//-----------------------------------------------------------------------
+
+
+//-----------------------------------------------------------------------
+// register read enable and write enable decoding logic
+//-----------------------------------------------------------------------
+
+assign sw_addr = reg_addr [1:0];
+assign sw_rd_en = reg_cs & !reg_wr;
+assign sw_wr_en = reg_cs & reg_wr;
+assign wr_be = reg_be;
+assign sw_reg_wdata = reg_wdata;
+
+
+wire sw_wr_en_0 = sw_wr_en & (sw_addr == 2'h0);
+wire sw_rd_en_0 = sw_rd_en & (sw_addr == 2'h0);
+wire sw_wr_en_1 = sw_wr_en & (sw_addr == 2'h1);
+wire sw_rd_en_1 = sw_rd_en & (sw_addr == 2'h1);
+wire sw_wr_en_2 = sw_wr_en & (sw_addr == 2'h2);
+wire sw_rd_en_2 = sw_rd_en & (sw_addr == 2'h2);
+wire sw_wr_en_3 = sw_wr_en & (sw_addr == 2'h3);
+wire sw_rd_en_3 = sw_rd_en & (sw_addr == 2'h3);
+
+logic wb_req;
+
+always_ff @(negedge reset_n or posedge mclk) begin
+ if ( reset_n == 1'b0 ) begin
+ wb_req <= '0;
+ end else begin
+ wb_req <= reg_cs && (reg_ack == 0) ;
+ end
+end
+
+
+always @ (posedge mclk or negedge reset_n)
+begin : preg_out_Seq
+ if (reset_n == 1'b0) begin
+ reg_rdata <= 'h0;
+ reg_ack <= 1'b0;
+ end else if (reg_cs && !reg_ack) begin
+ reg_rdata <= reg_out ;
+ reg_ack <= 1'b1;
+ end else begin
+ reg_ack <= 1'b0;
+ end
+end
+
+always @( *)
+begin
+ reg_out [31:0] = 32'h0;
+
+ case (sw_addr [1:0])
+ 2'b00 : reg_out [31:0] = reg_0;
+ 2'b01 : reg_out [31:0] = reg_1;
+ 2'b10 : reg_out [31:0] = lbist_sig;
+ default : reg_out [31:0] = 'h0;
+ endcase
+end
+
+
+//-----------------------------------------------------------------------
+// Individual register assignments
+//-----------------------------------------------------------------------
+//-----------------------------------------------------------------------
+// reg-0
+// -----------------------------------------------------------------
+generic_register #(8,8'h0 ) u_reg0_be0 (
+ .we ({8{sw_wr_en_0 &
+ wr_be[0] }} ),
+ .data_in (sw_reg_wdata[7:0] ),
+ .reset_n (reset_n ),
+ .clk (mclk ),
+
+ //List of Outs
+ .data_out (reg_0[7:0] )
+ );
+
+
+assign cfg_lbist_rst = reg_0[0];
+assign cfg_lbist_start = reg_0[1];
+assign cfg_lbist_rsb = reg_0[2];
+assign reg_0[31:8] = {lbist_done,23'b0};
+
+//--------------------------------------------
+// Reg-1
+// ------------------------------------------
+
+assign cfg_chain_depth = reg_1[15:0];
+assign cfg_lbist_pat = reg_1[31:16];
+
+gen_32b_reg #(32'h4C66_8354) u_reg_1 (
+ //List of Inputs
+ .reset_n (reset_n ),
+ .clk (mclk ),
+ .cs (sw_wr_en_1 ),
+ .we (wr_be ),
+ .data_in (sw_reg_wdata ),
+
+ //List of Outs
+ .data_out (reg_1 )
+ );
+endmodule
diff --git a/verilog/rtl/lbist/src/lbist_top.sv b/verilog/rtl/lbist/src/lbist_top.sv
new file mode 100644
index 0000000..caffbb7
--- /dev/null
+++ b/verilog/rtl/lbist/src/lbist_top.sv
@@ -0,0 +1,184 @@
+module lbist_top
+ #(parameter SCW = 8 // SCAN CHAIN WIDTH
+ )
+ (
+ // Wishbone Reg I/F
+ input logic wb_clk,
+ input logic wb_rst_n,
+ input logic wb_cs,
+ input logic [1:0] wb_addr,
+ input logic wb_wr,
+ input logic [31:0] wb_wdata,
+ input logic [3:0] wb_be,
+
+ output logic [31:0] wb_rdata,
+ output logic wb_ack,
+ output logic wb_err,
+
+ // LBIST I/F
+ input logic lbist_clk,
+ input logic lbist_clk_skew, // bist clock with additional clock skew
+
+
+ // Scan Control Signal
+ output logic scan_clk,
+ output logic scan_rst_n,
+ output logic scan_mode,
+ output logic scan_en,
+ output logic [SCW-1:0] scan_in,
+ input logic [SCW-1:0] scan_out
+
+);
+
+//----------------------------------------------
+// Local Decleration
+// ---------------------------------------------
+
+logic lbist_rst_n ;
+logic lbist_reg_cs ;
+logic [1:0] lbist_reg_addr ;
+logic lbist_reg_wr ;
+logic [31:0] lbist_reg_wdata ;
+logic [3:0] lbist_reg_be ;
+
+logic [31:0] lbist_reg_rdata ;
+logic lbist_reg_ack ;
+
+logic cfg_lbist_srst ;
+logic cfg_lbist_start ; // lbist start
+logic cfg_lbist_rsb ; // lbist reset scan compare bypass
+
+logic [15:0] cfg_lbist_pat ; // Total Scan pattern to be run
+logic [15:0] cfg_chain_depth ; // Scan chain depth
+
+
+logic lbist_done ;
+logic [31:0] lbist_sig ;
+
+//------------------------------------
+// LBIST Reset Synchronizer
+// -----------------------------------
+
+reset_sync u_lbist_reset (
+ .scan_mode (1'b0 ),
+ .dclk (lbist_clk_skew), // Destination clock domain
+ .arst_n (wb_rst_n ), // active low async reset
+ .srst_n (lbist_rst_n )
+ );
+
+// -------------------------------------------------
+// Wishbone to LBIST register Synchronizer
+// ------------------------------------------------
+
+async_reg_bus #(.AW(2)) u_async_reg (
+ // Initiator declartion
+ .in_clk (wb_clk),
+ .in_reset_n (wb_rst_n),
+ // Reg Bus Master
+ // outputs
+ .in_reg_rdata (wb_rdata),
+ .in_reg_ack (wb_ack),
+ .in_reg_timeout (wb_err),
+
+ // Inputs
+ .in_reg_cs (wb_cs),
+ .in_reg_addr (wb_addr),
+ .in_reg_wdata (wb_wdata),
+ .in_reg_wr (wb_wr),
+ .in_reg_be (wb_be),
+
+ // Target Declaration
+ .out_clk (lbist_clk_skew),
+ .out_reset_n (lbist_rst_n),
+ // Reg Bus Slave
+ // output
+ .out_reg_cs (lbist_reg_cs),
+ .out_reg_addr (lbist_reg_addr),
+ .out_reg_wdata (lbist_reg_wdata),
+ .out_reg_wr (lbist_reg_wr),
+ .out_reg_be (lbist_reg_be),
+
+ // Inputs
+ .out_reg_rdata (lbist_reg_rdata),
+ .out_reg_ack (lbist_reg_ack)
+ );
+
+//------------------------------
+// LBIST local Register
+// ----------------------------
+
+lbist_reg u_reg (
+ .mclk (lbist_clk_skew ),
+ .reset_n (lbist_rst_n ),
+
+
+ // Reg Bus Interface Signal
+ .reg_cs (lbist_reg_cs ),
+ .reg_wr (lbist_reg_wr ),
+ .reg_addr (lbist_reg_addr ),
+ .reg_wdata (lbist_reg_wdata ),
+ .reg_be (lbist_reg_be ),
+
+ // Outputs
+ .reg_rdata (lbist_reg_rdata ),
+ .reg_ack (lbist_reg_ack ),
+
+ // BIST I/F
+ .cfg_lbist_rst (cfg_lbist_srst ),
+ .cfg_lbist_start (cfg_lbist_start ), // lbist start
+ .cfg_lbist_rsb (cfg_lbist_rsb ), // lbist reset scan bypass
+ .cfg_lbist_pat (cfg_lbist_pat ), // Total Scan pattern to be run
+ .cfg_chain_depth (cfg_chain_depth ), // Scan Chain Depth
+
+
+ .lbist_done (lbist_done ),
+ .lbist_sig (lbist_sig )
+
+
+ );
+
+//-----------------------------------------------------
+// LBIST core manges all the scan sequence
+//-----------------------------------------------------
+
+lbist_core
+ #(.SCW(SCW) // SCAN CHAIN WIDTH
+ )
+
+ u_lbist_core (
+
+ .mclk (lbist_clk ),
+ .mclk_skew (lbist_clk_skew ),
+ .rst_n (lbist_rst_n ),
+ .srst (cfg_lbist_srst ), // software reset
+
+
+ // Reg Bus Interface Signal
+ .lbist_start (cfg_lbist_start ),// ltest start
+ .cfg_lbist_rsb (cfg_lbist_rsb ), // lbist reset scan bypass
+ .cfg_lbist_pat (cfg_lbist_pat ),// Total Scan pattern to be run
+ .cfg_chain_depth (cfg_chain_depth ), // Scan Chain Depth
+ .lbist_done (lbist_done ),// End of Ltest
+ .lbist_sig (lbist_sig ),// scan signature
+
+
+ // Scan Control Signal
+ .scan_clk (scan_clk ),
+ .scan_rst_n (scan_rst_n ),
+ .scan_mode (scan_mode ),
+ .scan_en (scan_en ),
+ .scan_in (scan_in ),
+ .scan_out (scan_out )
+
+);
+
+
+
+
+
+
+
+
+endmodule
+
+
diff --git a/verilog/rtl/lbist/src/run_compile b/verilog/rtl/lbist/src/run_compile
new file mode 100644
index 0000000..f2b14af
--- /dev/null
+++ b/verilog/rtl/lbist/src/run_compile
@@ -0,0 +1,2 @@
+iverilog lbist_top.sv ../../lib/crc_32.sv ../../lib/clk_gate.sv lbist_core.sv lbist_reg.sv ../../lib/registers.v ../../lib/async_reg_bus.sv ../../lib/reset_sync.sv -g2005-sv
+verilator -cc lbist_top.sv ../../lib/crc_32.sv ../../lib/clk_gate.sv lbist_core.sv lbist_reg.sv ../../lib/registers.v ../../lib/async_reg_bus.sv ../../lib/reset_sync.sv --top-module lbist_top
diff --git a/verilog/rtl/lib/async_fifo.sv b/verilog/rtl/lib/async_fifo.sv
new file mode 100755
index 0000000..fd59cfa
--- /dev/null
+++ b/verilog/rtl/lib/async_fifo.sv
@@ -0,0 +1,341 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+/*********************************************************************
+
+ ASYNC FIFO
+
+ This file is part of the sdram controller project
+ https://github.com/dineshannayya/yifive_r0.git
+ http://www.opencores.org/cores/sdr_ctrl/
+
+ Description: ASYNC FIFO
+
+ To Do:
+ nothing
+
+ Author(s): Dinesh Annayya, dinesha@opencores.org
+
+ Copyright (C) 2000 Authors and OPENCORES.ORG
+
+ This source file may be used and distributed without
+ restriction provided that this copyright statement is not
+ removed from the file and that any derivative work contains
+ the original copyright notice and the associated disclaimer.
+
+ This source file is free software; you can redistribute it
+ and/or modify it under the terms of the GNU Lesser General
+ Public License as published by the Free Software Foundation;
+ either version 2.1 of the License, or (at your option) any
+later version.
+
+ This source is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied
+ warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ PURPOSE. See the GNU Lesser General Public License for more
+ details.
+
+ You should have received a copy of the GNU Lesser General
+ Public License along with this source; if not, download it
+ from http://www.opencores.org/lgpl.shtml
+
+*******************************************************************/
+
+//-------------------------------------------
+// async FIFO
+//-----------------------------------------------
+//`timescale 1ns/1ps
+
+module async_fifo (wr_clk,
+ wr_reset_n,
+ wr_en,
+ wr_data,
+ full, // sync'ed to wr_clk
+ afull, // sync'ed to wr_clk
+ rd_clk,
+ rd_reset_n,
+ rd_en,
+ empty, // sync'ed to rd_clk
+ aempty, // sync'ed to rd_clk
+ rd_data);
+
+ parameter W = 4'd8;
+ parameter DP = 3'd4;
+ parameter WR_FAST = 1'b1;
+ parameter RD_FAST = 1'b1;
+ parameter FULL_DP = DP;
+ parameter EMPTY_DP = 1'b0;
+
+ parameter AW = (DP == 2) ? 1 :
+ (DP == 4) ? 2 :
+ (DP == 8) ? 3 :
+ (DP == 16) ? 4 :
+ (DP == 32) ? 5 :
+ (DP == 64) ? 6 :
+ (DP == 128) ? 7 :
+ (DP == 256) ? 8 : 0;
+
+ output [W-1 : 0] rd_data;
+ input [W-1 : 0] wr_data;
+ input wr_clk, wr_reset_n, wr_en, rd_clk, rd_reset_n,
+ rd_en;
+ output full, empty;
+ output afull, aempty; // about full and about to empty
+
+
+ // synopsys translate_off
+
+ initial begin
+ if (AW == 0) begin
+ $display ("%m : ERROR!!! Fifo depth %d not in range 2 to 256", DP);
+ end // if (AW == 0)
+ end // initial begin
+
+ // synopsys translate_on
+
+ reg [W-1 : 0] mem[DP-1 : 0];
+
+ /*********************** write side ************************/
+ reg [AW:0] sync_rd_ptr_0, sync_rd_ptr_1;
+ wire [AW:0] sync_rd_ptr;
+ reg [AW:0] wr_ptr, grey_wr_ptr;
+ reg [AW:0] grey_rd_ptr;
+ reg full_q;
+ wire full_c;
+ wire afull_c;
+ wire [AW:0] wr_ptr_inc = wr_ptr + 1'b1;
+ wire [AW:0] wr_cnt = get_cnt(wr_ptr, sync_rd_ptr);
+
+ assign full_c = (wr_cnt == FULL_DP) ? 1'b1 : 1'b0;
+ assign afull_c = (wr_cnt == FULL_DP-1) ? 1'b1 : 1'b0;
+
+
+ always @(posedge wr_clk or negedge wr_reset_n) begin
+ if (!wr_reset_n) begin
+ wr_ptr <= 0;
+ grey_wr_ptr <= 0;
+ full_q <= 0;
+ end
+ else if (wr_en) begin
+ wr_ptr <= wr_ptr_inc;
+ grey_wr_ptr <= bin2grey(wr_ptr_inc);
+ if (wr_cnt == (FULL_DP-1)) begin
+ full_q <= 1'b1;
+ end
+ end
+ else begin
+ if (full_q && (wr_cnt<FULL_DP)) begin
+ full_q <= 1'b0;
+ end
+ end
+ end
+
+ assign full = (WR_FAST == 1) ? full_c : full_q;
+ assign afull = afull_c;
+
+ always @(posedge wr_clk) begin
+ if (wr_en) begin
+ mem[wr_ptr[AW-1:0]] <= wr_data;
+ end
+ end
+
+ wire [AW:0] grey_rd_ptr_dly ;
+ assign #1 grey_rd_ptr_dly = grey_rd_ptr;
+
+ // read pointer synchronizer
+ always @(posedge wr_clk or negedge wr_reset_n) begin
+ if (!wr_reset_n) begin
+ sync_rd_ptr_0 <= 0;
+ sync_rd_ptr_1 <= 0;
+ end
+ else begin
+ sync_rd_ptr_0 <= grey_rd_ptr_dly;
+ sync_rd_ptr_1 <= sync_rd_ptr_0;
+ end
+ end
+
+ assign sync_rd_ptr = grey2bin(sync_rd_ptr_1);
+
+ /************************ read side *****************************/
+ reg [AW:0] sync_wr_ptr_0, sync_wr_ptr_1;
+ wire [AW:0] sync_wr_ptr;
+ reg [AW:0] rd_ptr;
+ reg empty_q;
+ wire empty_c;
+ wire aempty_c;
+ wire [AW:0] rd_ptr_inc = rd_ptr + 1'b1;
+ wire [AW:0] sync_wr_ptr_dec = sync_wr_ptr - 1'b1;
+ wire [AW:0] rd_cnt = get_cnt(sync_wr_ptr, rd_ptr);
+
+ assign empty_c = (rd_cnt == 0) ? 1'b1 : 1'b0;
+ assign aempty_c = (rd_cnt == 1) ? 1'b1 : 1'b0;
+
+ always @(posedge rd_clk or negedge rd_reset_n) begin
+ if (!rd_reset_n) begin
+ rd_ptr <= 0;
+ grey_rd_ptr <= 0;
+ empty_q <= 1'b1;
+ end
+ else begin
+ if (rd_en) begin
+ rd_ptr <= rd_ptr_inc;
+ grey_rd_ptr <= bin2grey(rd_ptr_inc);
+ if (rd_cnt==(EMPTY_DP+1)) begin
+ empty_q <= 1'b1;
+ end
+ end
+ else begin
+ if (empty_q && (rd_cnt!=EMPTY_DP)) begin
+ empty_q <= 1'b0;
+ end
+ end
+ end
+ end
+
+ assign empty = (RD_FAST == 1) ? empty_c : empty_q;
+ assign aempty = aempty_c;
+
+ reg [W-1 : 0] rd_data_q;
+
+ wire [W-1 : 0] rd_data_c = mem[rd_ptr[AW-1:0]];
+ always @(posedge rd_clk) begin
+ rd_data_q <= rd_data_c;
+ end
+ assign rd_data = (RD_FAST == 1) ? rd_data_c : rd_data_q;
+
+ wire [AW:0] grey_wr_ptr_dly ;
+ assign #1 grey_wr_ptr_dly = grey_wr_ptr;
+
+ // write pointer synchronizer
+ always @(posedge rd_clk or negedge rd_reset_n) begin
+ if (!rd_reset_n) begin
+ sync_wr_ptr_0 <= 0;
+ sync_wr_ptr_1 <= 0;
+ end
+ else begin
+ sync_wr_ptr_0 <= grey_wr_ptr_dly;
+ sync_wr_ptr_1 <= sync_wr_ptr_0;
+ end
+ end
+ assign sync_wr_ptr = grey2bin(sync_wr_ptr_1);
+
+
+/************************ functions ******************************/
+function [AW:0] bin2grey;
+input [AW:0] bin;
+reg [8:0] bin_8;
+reg [8:0] grey_8;
+begin
+ bin_8 = bin;
+ grey_8[1:0] = do_grey(bin_8[2:0]);
+ grey_8[3:2] = do_grey(bin_8[4:2]);
+ grey_8[5:4] = do_grey(bin_8[6:4]);
+ grey_8[7:6] = do_grey(bin_8[8:6]);
+ grey_8[8] = bin_8[8];
+ bin2grey = grey_8;
+end
+endfunction
+
+function [AW:0] grey2bin;
+input [AW:0] grey;
+reg [8:0] grey_8;
+reg [8:0] bin_8;
+begin
+ grey_8 = grey;
+ bin_8[8] = grey_8[8];
+ bin_8[7:6] = do_bin({bin_8[8], grey_8[7:6]});
+ bin_8[5:4] = do_bin({bin_8[6], grey_8[5:4]});
+ bin_8[3:2] = do_bin({bin_8[4], grey_8[3:2]});
+ bin_8[1:0] = do_bin({bin_8[2], grey_8[1:0]});
+ grey2bin = bin_8;
+end
+endfunction
+
+
+function [1:0] do_grey;
+input [2:0] bin;
+begin
+ if (bin[2]) begin // do reverse grey
+ case (bin[1:0])
+ 2'b00: do_grey = 2'b10;
+ 2'b01: do_grey = 2'b11;
+ 2'b10: do_grey = 2'b01;
+ 2'b11: do_grey = 2'b00;
+ endcase
+ end
+ else begin
+ case (bin[1:0])
+ 2'b00: do_grey = 2'b00;
+ 2'b01: do_grey = 2'b01;
+ 2'b10: do_grey = 2'b11;
+ 2'b11: do_grey = 2'b10;
+ endcase
+ end
+end
+endfunction
+
+function [1:0] do_bin;
+input [2:0] grey;
+begin
+ if (grey[2]) begin // actually bin[2]
+ case (grey[1:0])
+ 2'b10: do_bin = 2'b00;
+ 2'b11: do_bin = 2'b01;
+ 2'b01: do_bin = 2'b10;
+ 2'b00: do_bin = 2'b11;
+ endcase
+ end
+ else begin
+ case (grey[1:0])
+ 2'b00: do_bin = 2'b00;
+ 2'b01: do_bin = 2'b01;
+ 2'b11: do_bin = 2'b10;
+ 2'b10: do_bin = 2'b11;
+ endcase
+ end
+end
+endfunction
+
+function [AW:0] get_cnt;
+input [AW:0] wr_ptr, rd_ptr;
+begin
+ if (wr_ptr >= rd_ptr) begin
+ get_cnt = (wr_ptr - rd_ptr);
+ end
+ else begin
+ get_cnt = DP*2 - (rd_ptr - wr_ptr);
+ end
+end
+endfunction
+
+// synopsys translate_off
+always @(posedge wr_clk) begin
+ if (wr_en && full) begin
+ $display($time, "%m Error! afifo overflow!");
+ $stop;
+ end
+end
+
+always @(posedge rd_clk) begin
+ if (rd_en && empty) begin
+ $display($time, "%m error! afifo underflow!");
+ $stop;
+ end
+end
+// synopsys translate_on
+
+endmodule
diff --git a/verilog/rtl/lib/async_fifo.v b/verilog/rtl/lib/async_fifo.v
new file mode 100755
index 0000000..2233fb1
--- /dev/null
+++ b/verilog/rtl/lib/async_fifo.v
@@ -0,0 +1,385 @@
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Tubo 8051 cores common library Module ////
+//// ////
+//// This file is part of the Turbo 8051 cores project ////
+//// http://www.opencores.org/cores/turbo8051/ ////
+//// ////
+//// Description ////
+//// Turbo 8051 definitions. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : Mar 2, 2011 ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+//-------------------------------------------
+// async_fifo:: async FIFO
+// Following two ports are newly added
+// 1. At write clock domain:
+// wr_total_free_space --> Indicate total free transfer available
+// 2. At read clock domain:
+// rd_total_aval --> Indicate total no of transfer available
+//-----------------------------------------------
+
+module async_fifo (wr_clk,
+ wr_reset_n,
+ wr_en,
+ wr_data,
+ full, // sync'ed to wr_clk
+ afull, // sync'ed to wr_clk
+ wr_total_free_space,
+ rd_clk,
+ rd_reset_n,
+ rd_en,
+ empty, // sync'ed to rd_clk
+ aempty, // sync'ed to rd_clk
+ rd_total_aval,
+ rd_data);
+
+ parameter W = 4'd8;
+ parameter DP = 3'd4;
+ parameter WR_FAST = 1'b1;
+ parameter RD_FAST = 1'b1;
+ parameter FULL_DP = DP;
+ parameter EMPTY_DP = 1'b0;
+
+ parameter AW = (DP == 2) ? 1 :
+ (DP == 4) ? 2 :
+ (DP == 8) ? 3 :
+ (DP == 16) ? 4 :
+ (DP == 32) ? 5 :
+ (DP == 64) ? 6 :
+ (DP == 128) ? 7 :
+ (DP == 256) ? 8 : 0;
+
+ output [W-1 : 0] rd_data;
+ input [W-1 : 0] wr_data;
+ input wr_clk, wr_reset_n, wr_en, rd_clk, rd_reset_n,
+ rd_en;
+ output full, empty;
+ output afull, aempty; // about full and about to empty
+ output [AW:0] wr_total_free_space; // Total Number of free space aval
+ // w.r.t write clk
+ // note: Without accounting byte enables
+ output [AW:0] rd_total_aval; // Total Number of words avaialble
+ // w.r.t rd clock,
+ // note: Without accounting byte enables
+ // synopsys translate_off
+
+ initial begin
+ if (AW == 0) begin
+ $display ("%m : ERROR!!! Fifo depth %d not in range 2 to 256", DP);
+ end // if (AW == 0)
+ end // initial begin
+
+ // synopsys translate_on
+ reg [W-1 : 0] mem[DP-1 : 0];
+
+ /*********************** write side ************************/
+ reg [AW:0] sync_rd_ptr_0, sync_rd_ptr_1;
+ wire [AW:0] sync_rd_ptr;
+ reg [AW:0] wr_ptr, grey_wr_ptr;
+ reg [AW:0] grey_rd_ptr;
+ reg full_q;
+ wire full_c;
+ wire afull_c;
+ wire [AW:0] wr_ptr_inc = wr_ptr + 1'b1;
+ wire [AW:0] wr_cnt = get_cnt(wr_ptr, sync_rd_ptr);
+
+ assign full_c = (wr_cnt == FULL_DP) ? 1'b1 : 1'b0;
+ assign afull_c = (wr_cnt == FULL_DP-1) ? 1'b1 : 1'b0;
+
+ //--------------------------
+ // Shows total number of words
+ // of free space available w.r.t write clock
+ //---------------------------
+ assign wr_total_free_space = FULL_DP - wr_cnt;
+
+ always @(posedge wr_clk or negedge wr_reset_n) begin
+ if (!wr_reset_n) begin
+ wr_ptr <= 0;
+ grey_wr_ptr <= 0;
+ full_q <= 0;
+ end
+ else if (wr_en) begin
+ wr_ptr <= wr_ptr_inc;
+ grey_wr_ptr <= bin2grey(wr_ptr_inc);
+ if (wr_cnt == (FULL_DP-1)) begin
+ full_q <= 1'b1;
+ end
+ end
+ else begin
+ if (full_q && (wr_cnt<FULL_DP)) begin
+ full_q <= 1'b0;
+ end
+ end
+ end
+
+ assign full = (WR_FAST == 1) ? full_c : full_q;
+ assign afull = afull_c;
+
+ always @(posedge wr_clk) begin
+ if (wr_en) begin
+ mem[wr_ptr[AW-1:0]] <= wr_data;
+ end
+ end
+
+ wire [AW:0] grey_rd_ptr_dly ;
+ assign #1 grey_rd_ptr_dly = grey_rd_ptr;
+
+ // read pointer synchronizer
+ always @(posedge wr_clk or negedge wr_reset_n) begin
+ if (!wr_reset_n) begin
+ sync_rd_ptr_0 <= 0;
+ sync_rd_ptr_1 <= 0;
+ end
+ else begin
+ sync_rd_ptr_0 <= grey_rd_ptr_dly;
+ sync_rd_ptr_1 <= sync_rd_ptr_0;
+ end
+ end
+
+ assign sync_rd_ptr = grey2bin(sync_rd_ptr_1);
+
+ /************************ read side *****************************/
+ reg [AW:0] sync_wr_ptr_0, sync_wr_ptr_1;
+ wire [AW:0] sync_wr_ptr;
+ reg [AW:0] rd_ptr;
+ reg empty_q;
+ wire empty_c;
+ wire aempty_c;
+ wire [AW:0] rd_ptr_inc = rd_ptr + 1'b1;
+ wire [AW:0] sync_wr_ptr_dec = sync_wr_ptr - 1'b1;
+ wire [AW:0] rd_cnt = get_cnt(sync_wr_ptr, rd_ptr);
+
+ assign empty_c = (rd_cnt == 0) ? 1'b1 : 1'b0;
+ assign aempty_c = (rd_cnt == 1) ? 1'b1 : 1'b0;
+ //--------------------------
+ // Shows total number of words
+ // space available w.r.t write clock
+ //---------------------------
+ assign rd_total_aval = rd_cnt;
+
+ always @(posedge rd_clk or negedge rd_reset_n) begin
+ if (!rd_reset_n) begin
+ rd_ptr <= 0;
+ grey_rd_ptr <= 0;
+ empty_q <= 1'b1;
+ end
+ else begin
+ if (rd_en) begin
+ rd_ptr <= rd_ptr_inc;
+ grey_rd_ptr <= bin2grey(rd_ptr_inc);
+ if (rd_cnt==(EMPTY_DP+1)) begin
+ empty_q <= 1'b1;
+ end
+ end
+ else begin
+ if (empty_q && (rd_cnt!=EMPTY_DP)) begin
+ empty_q <= 1'b0;
+ end
+ end
+ end
+ end
+
+ assign empty = (RD_FAST == 1) ? empty_c : empty_q;
+ assign aempty = aempty_c;
+
+ assign rd_data = mem[rd_ptr[AW-1:0]];
+
+ wire [AW:0] grey_wr_ptr_dly ;
+ assign #1 grey_wr_ptr_dly = grey_wr_ptr;
+
+ // write pointer synchronizer
+ always @(posedge rd_clk or negedge rd_reset_n) begin
+ if (!rd_reset_n) begin
+ sync_wr_ptr_0 <= 0;
+ sync_wr_ptr_1 <= 0;
+ end
+ else begin
+ sync_wr_ptr_0 <= grey_wr_ptr_dly;
+ sync_wr_ptr_1 <= sync_wr_ptr_0;
+ end
+ end
+ assign sync_wr_ptr = grey2bin(sync_wr_ptr_1);
+
+
+/************************ functions ******************************/
+function [AW:0] bin2grey;
+input [AW:0] bin;
+reg [8:0] bin_8;
+reg [8:0] grey_8;
+begin
+ bin_8 = bin;
+ grey_8[1:0] = do_grey(bin_8[2:0]);
+ grey_8[3:2] = do_grey(bin_8[4:2]);
+ grey_8[5:4] = do_grey(bin_8[6:4]);
+ grey_8[7:6] = do_grey(bin_8[8:6]);
+ grey_8[8] = bin_8[8];
+ bin2grey = grey_8;
+end
+endfunction
+
+function [AW:0] grey2bin;
+input [AW:0] grey;
+reg [8:0] grey_8;
+reg [8:0] bin_8;
+begin
+ grey_8 = grey;
+ bin_8[8] = grey_8[8];
+ bin_8[7:6] = do_bin({bin_8[8], grey_8[7:6]});
+ bin_8[5:4] = do_bin({bin_8[6], grey_8[5:4]});
+ bin_8[3:2] = do_bin({bin_8[4], grey_8[3:2]});
+ bin_8[1:0] = do_bin({bin_8[2], grey_8[1:0]});
+ grey2bin = bin_8;
+end
+endfunction
+
+
+function [1:0] do_grey;
+input [2:0] bin;
+begin
+ if (bin[2]) begin // do reverse grey
+ case (bin[1:0])
+ 2'b00: do_grey = 2'b10;
+ 2'b01: do_grey = 2'b11;
+ 2'b10: do_grey = 2'b01;
+ 2'b11: do_grey = 2'b00;
+ endcase
+ end
+ else begin
+ case (bin[1:0])
+ 2'b00: do_grey = 2'b00;
+ 2'b01: do_grey = 2'b01;
+ 2'b10: do_grey = 2'b11;
+ 2'b11: do_grey = 2'b10;
+ endcase
+ end
+end
+endfunction
+
+function [1:0] do_bin;
+input [2:0] grey;
+begin
+ if (grey[2]) begin // actually bin[2]
+ case (grey[1:0])
+ 2'b10: do_bin = 2'b00;
+ 2'b11: do_bin = 2'b01;
+ 2'b01: do_bin = 2'b10;
+ 2'b00: do_bin = 2'b11;
+ endcase
+ end
+ else begin
+ case (grey[1:0])
+ 2'b00: do_bin = 2'b00;
+ 2'b01: do_bin = 2'b01;
+ 2'b11: do_bin = 2'b10;
+ 2'b10: do_bin = 2'b11;
+ endcase
+ end
+end
+endfunction
+
+function [AW:0] get_cnt;
+input [AW:0] wr_ptr, rd_ptr;
+begin
+ if (wr_ptr >= rd_ptr) begin
+ get_cnt = (wr_ptr - rd_ptr);
+ end
+ else begin
+ get_cnt = DP*2 - (rd_ptr - wr_ptr);
+ end
+end
+endfunction
+
+// synopsys translate_off
+always @(posedge wr_clk) begin
+ if (wr_en && full) begin
+ $display($time, "%m Error! afifo overflow!");
+ $stop;
+ end
+end
+
+always @(posedge rd_clk) begin
+ if (rd_en && empty) begin
+ $display($time, "%m error! afifo underflow!");
+ $stop;
+ end
+end
+
+// gray code monitor
+reg [AW:0] last_gwr_ptr;
+always @(posedge wr_clk or negedge wr_reset_n) begin
+ if (!wr_reset_n) begin
+ last_gwr_ptr <= #1 0;
+ end
+ else if (last_gwr_ptr !== grey_wr_ptr) begin
+ check_ptr_chg(last_gwr_ptr, grey_wr_ptr);
+ last_gwr_ptr <= #1 grey_wr_ptr;
+ end
+end
+
+reg [AW:0] last_grd_ptr;
+always @(posedge rd_clk or negedge rd_reset_n) begin
+ if (!rd_reset_n) begin
+ last_grd_ptr <= #1 0;
+ end
+ else if (last_grd_ptr !== grey_rd_ptr) begin
+ check_ptr_chg(last_grd_ptr, grey_rd_ptr);
+ last_grd_ptr <= #1 grey_rd_ptr;
+ end
+end
+
+task check_ptr_chg;
+input [AW:0] last_ptr;
+input [AW:0] cur_ptr;
+integer i;
+integer ptr_diff;
+begin
+ ptr_diff = 0;
+ for (i=0; i<= AW; i=i+ 1'b1) begin
+ if (last_ptr[i] != cur_ptr[i]) begin
+ ptr_diff = ptr_diff + 1'b1;
+ end
+ end
+ if (ptr_diff !== 1) begin
+ $display($time, "%m, ERROR! async fifo ptr has changed more than noe bit, last=%h, cur=%h",
+ last_ptr, cur_ptr);
+ $stop;
+ end
+end
+endtask
+ // synopsys translate_on
+
+endmodule
diff --git a/verilog/rtl/lib/async_fifo_th.sv b/verilog/rtl/lib/async_fifo_th.sv
new file mode 100755
index 0000000..05860f8
--- /dev/null
+++ b/verilog/rtl/lib/async_fifo_th.sv
@@ -0,0 +1,404 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// OMS 8051 cores common library Module ////
+//// ////
+//// This file is part of the OMS 8051 cores project ////
+//// https://github.com/dineshannayya/yifive_r0.git ////
+//// http://www.opencores.org/cores/oms8051mini/ ////
+//// ////
+//// Description ////
+//// Async Fifo with threshold tracking/status ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : Nov 26, 2016 ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+//-------------------------------------------
+// async_fifo:: async FIFO
+// Following two ports are newly added
+// 1. At write clock domain:
+// wr_total_free_space --> Indicate total free transfer available
+// 2. At read clock domain:
+// rd_total_aval --> Indicate total no of transfer available
+//-----------------------------------------------
+
+module async_fifo_th (
+ wr_clk,
+ wr_reset_n,
+ wr_en,
+ wr_data,
+ full, // sync'ed to wr_clk
+ afull, // sync'ed to wr_clk
+ wr_total_free_space,
+ rd_clk,
+ rd_reset_n,
+ rd_en,
+ empty, // sync'ed to rd_clk
+ aempty, // sync'ed to rd_clk
+ rd_total_aval,
+ rd_data);
+
+ parameter W = 4'd8;
+ parameter DP = 3'd4;
+ parameter WR_FAST = 1'b1;
+ parameter RD_FAST = 1'b1;
+ parameter FULL_DP = DP;
+ parameter EMPTY_DP = 1'b0;
+
+ parameter AW = (DP == 2) ? 1 :
+ (DP == 4) ? 2 :
+ (DP == 8) ? 3 :
+ (DP == 16) ? 4 :
+ (DP == 32) ? 5 :
+ (DP == 64) ? 6 :
+ (DP == 128) ? 7 :
+ (DP == 256) ? 8 : 0;
+
+ output [W-1 : 0] rd_data;
+ input [W-1 : 0] wr_data;
+ input wr_clk, wr_reset_n, wr_en, rd_clk, rd_reset_n,
+ rd_en;
+ output full, empty;
+ output afull, aempty; // about full and about to empty
+ output [AW:0] wr_total_free_space; // Total Number of free space aval
+ // w.r.t write clk
+ // note: Without accounting byte enables
+ output [AW:0] rd_total_aval; // Total Number of words avaialble
+ // w.r.t rd clock,
+ // note: Without accounting byte enables
+ // synopsys translate_off
+
+ initial begin
+ if (AW == 0) begin
+ $display ("%m : ERROR!!! Fifo depth %d not in range 2 to 256", DP);
+ end // if (AW == 0)
+ end // initial begin
+
+ // synopsys translate_on
+ reg [W-1 : 0] mem[DP-1 : 0];
+
+ /*********************** write side ************************/
+ reg [AW:0] sync_rd_ptr_0, sync_rd_ptr_1;
+ wire [AW:0] sync_rd_ptr;
+ reg [AW:0] wr_ptr, grey_wr_ptr;
+ reg [AW:0] grey_rd_ptr;
+ reg full_q;
+ wire full_c;
+ wire afull_c;
+ wire [AW:0] wr_ptr_inc = wr_ptr + 1'b1;
+ wire [AW:0] wr_cnt = get_cnt(wr_ptr, sync_rd_ptr);
+
+ assign full_c = (wr_cnt == FULL_DP) ? 1'b1 : 1'b0;
+ assign afull_c = (wr_cnt == FULL_DP-1) ? 1'b1 : 1'b0;
+
+ //--------------------------
+ // Shows total number of words
+ // of free space available w.r.t write clock
+ //---------------------------
+ assign wr_total_free_space = FULL_DP - wr_cnt;
+
+ always @(posedge wr_clk or negedge wr_reset_n) begin
+ if (!wr_reset_n) begin
+ wr_ptr <= 0;
+ grey_wr_ptr <= 0;
+ full_q <= 0;
+ end
+ else if (wr_en) begin
+ wr_ptr <= wr_ptr_inc;
+ grey_wr_ptr <= bin2grey(wr_ptr_inc);
+ if (wr_cnt == (FULL_DP-1)) begin
+ full_q <= 1'b1;
+ end
+ end
+ else begin
+ if (full_q && (wr_cnt<FULL_DP)) begin
+ full_q <= 1'b0;
+ end
+ end
+ end
+
+ assign full = (WR_FAST == 1) ? full_c : full_q;
+ assign afull = afull_c;
+
+ always @(posedge wr_clk) begin
+ if (wr_en) begin
+ mem[wr_ptr[AW-1:0]] <= wr_data;
+ end
+ end
+
+ wire [AW:0] grey_rd_ptr_dly ;
+ assign #1 grey_rd_ptr_dly = grey_rd_ptr;
+
+ // read pointer synchronizer
+ always @(posedge wr_clk or negedge wr_reset_n) begin
+ if (!wr_reset_n) begin
+ sync_rd_ptr_0 <= 0;
+ sync_rd_ptr_1 <= 0;
+ end
+ else begin
+ sync_rd_ptr_0 <= grey_rd_ptr_dly;
+ sync_rd_ptr_1 <= sync_rd_ptr_0;
+ end
+ end
+
+ assign sync_rd_ptr = grey2bin(sync_rd_ptr_1);
+
+ /************************ read side *****************************/
+ reg [AW:0] sync_wr_ptr_0, sync_wr_ptr_1;
+ wire [AW:0] sync_wr_ptr;
+ reg [AW:0] rd_ptr;
+ reg empty_q;
+ wire empty_c;
+ wire aempty_c;
+ wire [AW:0] rd_ptr_inc = rd_ptr + 1'b1;
+ wire [AW:0] sync_wr_ptr_dec = sync_wr_ptr - 1'b1;
+ wire [AW:0] rd_cnt = get_cnt(sync_wr_ptr, rd_ptr);
+
+ assign empty_c = (rd_cnt == 0) ? 1'b1 : 1'b0;
+ assign aempty_c = (rd_cnt == 1) ? 1'b1 : 1'b0;
+ //--------------------------
+ // Shows total number of words
+ // space available w.r.t write clock
+ //---------------------------
+ assign rd_total_aval = rd_cnt;
+
+ always @(posedge rd_clk or negedge rd_reset_n) begin
+ if (!rd_reset_n) begin
+ rd_ptr <= 0;
+ grey_rd_ptr <= 0;
+ empty_q <= 1'b1;
+ end
+ else begin
+ if (rd_en) begin
+ rd_ptr <= rd_ptr_inc;
+ grey_rd_ptr <= bin2grey(rd_ptr_inc);
+ if (rd_cnt==(EMPTY_DP+1)) begin
+ empty_q <= 1'b1;
+ end
+ end
+ else begin
+ if (empty_q && (rd_cnt!=EMPTY_DP)) begin
+ empty_q <= 1'b0;
+ end
+ end
+ end
+ end
+
+ assign empty = (RD_FAST == 1) ? empty_c : empty_q;
+ assign aempty = aempty_c;
+
+ assign rd_data = mem[rd_ptr[AW-1:0]];
+
+ wire [AW:0] grey_wr_ptr_dly ;
+ assign #1 grey_wr_ptr_dly = grey_wr_ptr;
+
+ // write pointer synchronizer
+ always @(posedge rd_clk or negedge rd_reset_n) begin
+ if (!rd_reset_n) begin
+ sync_wr_ptr_0 <= 0;
+ sync_wr_ptr_1 <= 0;
+ end
+ else begin
+ sync_wr_ptr_0 <= grey_wr_ptr_dly;
+ sync_wr_ptr_1 <= sync_wr_ptr_0;
+ end
+ end
+ assign sync_wr_ptr = grey2bin(sync_wr_ptr_1);
+
+
+/************************ functions ******************************/
+function [AW:0] bin2grey;
+input [AW:0] bin;
+reg [8:0] bin_8;
+reg [8:0] grey_8;
+begin
+ bin_8 = bin;
+ grey_8[1:0] = do_grey(bin_8[2:0]);
+ grey_8[3:2] = do_grey(bin_8[4:2]);
+ grey_8[5:4] = do_grey(bin_8[6:4]);
+ grey_8[7:6] = do_grey(bin_8[8:6]);
+ grey_8[8] = bin_8[8];
+ bin2grey = grey_8;
+end
+endfunction
+
+function [AW:0] grey2bin;
+input [AW:0] grey;
+reg [8:0] grey_8;
+reg [8:0] bin_8;
+begin
+ grey_8 = grey;
+ bin_8[8] = grey_8[8];
+ bin_8[7:6] = do_bin({bin_8[8], grey_8[7:6]});
+ bin_8[5:4] = do_bin({bin_8[6], grey_8[5:4]});
+ bin_8[3:2] = do_bin({bin_8[4], grey_8[3:2]});
+ bin_8[1:0] = do_bin({bin_8[2], grey_8[1:0]});
+ grey2bin = bin_8;
+end
+endfunction
+
+
+function [1:0] do_grey;
+input [2:0] bin;
+begin
+ if (bin[2]) begin // do reverse grey
+ case (bin[1:0])
+ 2'b00: do_grey = 2'b10;
+ 2'b01: do_grey = 2'b11;
+ 2'b10: do_grey = 2'b01;
+ 2'b11: do_grey = 2'b00;
+ endcase
+ end
+ else begin
+ case (bin[1:0])
+ 2'b00: do_grey = 2'b00;
+ 2'b01: do_grey = 2'b01;
+ 2'b10: do_grey = 2'b11;
+ 2'b11: do_grey = 2'b10;
+ endcase
+ end
+end
+endfunction
+
+function [1:0] do_bin;
+input [2:0] grey;
+begin
+ if (grey[2]) begin // actually bin[2]
+ case (grey[1:0])
+ 2'b10: do_bin = 2'b00;
+ 2'b11: do_bin = 2'b01;
+ 2'b01: do_bin = 2'b10;
+ 2'b00: do_bin = 2'b11;
+ endcase
+ end
+ else begin
+ case (grey[1:0])
+ 2'b00: do_bin = 2'b00;
+ 2'b01: do_bin = 2'b01;
+ 2'b11: do_bin = 2'b10;
+ 2'b10: do_bin = 2'b11;
+ endcase
+ end
+end
+endfunction
+
+function [AW:0] get_cnt;
+input [AW:0] wr_ptr, rd_ptr;
+begin
+ if (wr_ptr >= rd_ptr) begin
+ get_cnt = (wr_ptr - rd_ptr);
+ end
+ else begin
+ get_cnt = DP*2 - (rd_ptr - wr_ptr);
+ end
+end
+endfunction
+
+// synopsys translate_off
+always @(posedge wr_clk) begin
+ if (wr_en && full) begin
+ $display($time, "%m Error! afifo overflow!");
+ $stop;
+ end
+end
+
+always @(posedge rd_clk) begin
+ if (rd_en && empty) begin
+ $display($time, "%m error! afifo underflow!");
+ $stop;
+ end
+end
+
+// gray code monitor
+reg [AW:0] last_gwr_ptr;
+always @(posedge wr_clk or negedge wr_reset_n) begin
+ if (!wr_reset_n) begin
+ last_gwr_ptr <= #1 0;
+ end
+ else if (last_gwr_ptr !== grey_wr_ptr) begin
+ check_ptr_chg(last_gwr_ptr, grey_wr_ptr);
+ last_gwr_ptr <= #1 grey_wr_ptr;
+ end
+end
+
+reg [AW:0] last_grd_ptr;
+always @(posedge rd_clk or negedge rd_reset_n) begin
+ if (!rd_reset_n) begin
+ last_grd_ptr <= #1 0;
+ end
+ else if (last_grd_ptr !== grey_rd_ptr) begin
+ check_ptr_chg(last_grd_ptr, grey_rd_ptr);
+ last_grd_ptr <= #1 grey_rd_ptr;
+ end
+end
+
+task check_ptr_chg;
+input [AW:0] last_ptr;
+input [AW:0] cur_ptr;
+integer i;
+integer ptr_diff;
+begin
+ ptr_diff = 0;
+ for (i=0; i<= AW; i=i+ 1'b1) begin
+ if (last_ptr[i] != cur_ptr[i]) begin
+ ptr_diff = ptr_diff + 1'b1;
+ end
+ end
+ if (ptr_diff !== 1) begin
+ $display($time, "%m, ERROR! async fifo ptr has changed more than noe bit, last=%h, cur=%h",
+ last_ptr, cur_ptr);
+ $stop;
+ end
+end
+endtask
+ // synopsys translate_on
+
+endmodule
diff --git a/verilog/rtl/lib/async_reg_bus.sv b/verilog/rtl/lib/async_reg_bus.sv
new file mode 100644
index 0000000..2c02701
--- /dev/null
+++ b/verilog/rtl/lib/async_reg_bus.sv
@@ -0,0 +1,305 @@
+
+
+//----------------------------------------------------------------------------------------------
+// This block translate the Reg Bus transaction from in_clk clock domain to out_clk clock domain.
+// This block also generate and terminate the transfer if 512 cycle transaction is not completed
+// Assumption
+// 1. in_reg_cs will be asserted untill ack is received
+// 2. reg_addr/reg_wdata/reg_be will be available during reg_cs
+// 3. Ever after out_reg_ack de-asserted reg_rdata holds the old data
+//----------------------------------------------------------------------------------------------
+
+module async_reg_bus (
+ // Initiator declartion
+ in_clk ,
+ in_reset_n ,
+ // Reg Bus Master
+ // outputs
+ in_reg_rdata ,
+ in_reg_ack ,
+ in_reg_timeout ,
+
+ // Inputs
+ in_reg_cs ,
+ in_reg_addr ,
+ in_reg_wdata ,
+ in_reg_wr ,
+ in_reg_be ,
+
+ // Target Declaration
+ out_clk ,
+ out_reset_n ,
+ // Reg Bus Slave
+ // output
+ out_reg_cs ,
+ out_reg_addr ,
+ out_reg_wdata ,
+ out_reg_wr ,
+ out_reg_be ,
+
+ // Inputs
+ out_reg_rdata ,
+ out_reg_ack
+ );
+parameter AW = 26 ; // Address width
+parameter DW = 32 ; // DATA WIDTH
+parameter BEW = 4 ; // Byte enable width
+
+//----------------------------------------
+// Reg Bus reg inout declration
+//----------------------------------------
+input in_clk ; // Initiator domain clock
+input in_reset_n ; // Initiator domain reset
+
+input in_reg_cs ; // Initiator Chip Select
+input [AW-1:0] in_reg_addr ; // Address bus
+input [DW-1:0] in_reg_wdata ; // Write data
+input in_reg_wr ; // Read/write indication, 1-> write
+input [BEW-1:0] in_reg_be ; // Byte valid for write
+
+output [DW-1:0] in_reg_rdata ; // Read Data
+output in_reg_ack ; // Reg Access done
+output in_reg_timeout ; // Access error indication pulse
+ // Genererated if no target ack
+ // received
+ // within 512 cycle
+
+//---------------------------------------------
+// Reg Bus target inout declration
+//---------------------------------------------
+
+input out_clk ; // Target domain clock
+input out_reset_n ; // Traget domain reset
+
+input [DW-1:0] out_reg_rdata ; // Read data
+input out_reg_ack ; // target finish
+
+output out_reg_cs ; // Target Start indication
+output [AW-1:0] out_reg_addr ; // Target address
+output [DW-1:0] out_reg_wdata ; // Target write data
+output out_reg_wr ; // Target Read/write ind, 1-> Write
+output [BEW-1:0] out_reg_be ; // Target Byte enable
+
+//-----------------------------------
+// Initiator Local Declaration
+// ----------------------------------
+parameter INI_IDLE = 2'b00;
+parameter INI_WAIT_ACK = 2'b01;
+parameter INI_WAIT_TAR_DONE = 2'b10;
+
+reg [1:0] in_state ; // reg state
+reg [8:0] in_timer ; // reg timout monitor timer
+reg in_flag ; // reg handshake flag
+reg in_reg_ack ; // reg reg access finish ind
+reg [DW-1:0] in_reg_rdata ; // reg reg access read data
+reg in_reg_timeout ; // reg time out error pulse
+
+//-----------------------------------
+// Target Local Declaration
+// ----------------------------------
+parameter TAR_IDLE = 2'b00;
+parameter TAR_WAIT_ACK = 2'b01;
+parameter TAR_WAIT_INI_DONE = 2'b10;
+
+reg [1:0] out_state ; // target state machine
+reg out_flag ; // target handshake flag
+reg out_reg_cs ; // Target Start indication
+
+reg [8:0] inititaor_timer ; // timeout counter
+//-----------------------------------------------
+// Double sync local declaration
+// ----------------------------------------------
+
+reg in_flag_s ; // Initiator handshake flag sync
+ // with target clk
+reg in_flag_ss ; // Initiator handshake flag sync
+ // with target clk
+
+reg out_flag_s ; // target handshake flag sync
+ // with initiator clk
+reg out_flag_ss ; // target handshake flag sync
+ // with initiator clck
+
+
+
+
+assign out_reg_addr = in_reg_addr;
+assign out_reg_wdata = in_reg_wdata;
+assign out_reg_wr = in_reg_wr;
+assign out_reg_be = in_reg_be;
+//------------------------------------------------------
+// Initiator Domain logic
+//------------------------------------------------------
+
+always @(negedge in_reset_n or posedge in_clk)
+begin
+ if(in_reset_n == 1'b0)
+ begin
+ in_state <= INI_IDLE;
+ in_timer <= 9'h0;
+ in_flag <= 1'b0;
+ in_reg_ack <= 1'b0;
+ in_reg_rdata <= {DW {1'b0}};
+ in_reg_timeout<= 1'b0;
+ end
+ else
+ begin
+ case(in_state)
+ INI_IDLE :
+ begin
+ in_reg_ack <= 1'b0;
+ in_reg_timeout <= 1'b0;
+ in_timer <= 'h0;
+ // Wait for Initiator Start Indication
+ // Once the reg start is detected
+ // Set the reg flag and move to WAIT
+ // for ack from Target
+ if(in_reg_cs) begin
+ in_flag <= 1'b1;
+ in_state <= INI_WAIT_ACK;
+ end
+ end
+ INI_WAIT_ACK :
+ begin
+ //--------------------------------------------
+ // 1. Wait for Out Flag == 1
+ // 2. If the Out Flag =1 is not
+ // detected witin 512 cycle, exit with error indication
+ // 3. If Target flag detected, then de-assert
+ // reg_flag = 0 and move the tar_wait_done state
+ // ---------------------------------------------
+ if(out_flag_ss == 1'b1) begin
+ in_flag <= 1'b0;
+ in_reg_rdata <= out_reg_rdata;
+ in_reg_ack <= 1'b1;
+ in_state <= INI_WAIT_TAR_DONE;
+ end
+ else begin
+ if(in_timer == 9'h1FF) begin
+ in_flag <= 1'b0;
+ in_reg_ack <= 1'b1;
+ in_reg_rdata <= 32'h0;
+ in_reg_timeout <= 1'b1;
+ in_state <= INI_IDLE;
+ end
+ else begin
+ in_timer <= in_timer + 1;
+ end
+ end
+ end
+ INI_WAIT_TAR_DONE :
+ begin
+ in_reg_ack <= 1'b0;
+ //--------------------------------------------
+ // 1. Wait for Target Flag == 0
+ // 2. If Target flag = 0 detected, then remove
+ // move the idle state
+ // ---------------------------------------------
+ if(out_flag_ss == 1'b0) begin
+ in_state <= INI_IDLE;
+ end
+ end
+ default:
+ begin
+ in_state <= INI_IDLE;
+ in_timer <= 9'h0;
+ in_flag <= 1'b0;
+ in_reg_rdata <= {DW {1'b0}};
+ in_reg_timeout <= 1'b0;
+ end
+ endcase
+ end
+end
+
+
+//------------------------------------------------------
+// target Domain logic
+//------------------------------------------------------
+always @(negedge out_reset_n or posedge out_clk)
+begin
+ if(out_reset_n == 1'b0)
+ begin
+ out_state <= TAR_IDLE;
+ out_flag <= 1'b0;
+ out_reg_cs <= 1'b0;
+ end
+ else
+ begin
+ case(out_state)
+ TAR_IDLE :
+ begin
+ // 1. Wait for Initiator flag assertion
+ // 2. Once the reg flag = 1 is detected
+ // Set the target_flag and initiate the
+ // target reg bus access
+ out_flag <= 1'b0;
+ if(in_flag_ss) begin
+ out_reg_cs <= 1'b1;
+ out_state <= TAR_WAIT_ACK;
+ end
+ end
+ TAR_WAIT_ACK :
+ begin
+ //--------------------------------------------
+ // 1. Wait for reg Flag == 0
+ // 2. If reg flag = 0 detected, then
+ // move the idle state
+ // ---------------------------------------------
+ if(out_reg_ack == 1'b1)
+ begin
+ out_reg_cs <= 1'b0;
+ out_flag <= 1'b1;
+ out_state <= TAR_WAIT_INI_DONE;
+ end
+ end
+ TAR_WAIT_INI_DONE :
+ begin
+ if(in_flag_ss == 1'b0) begin
+ out_flag <= 1'b0;
+ out_state <= TAR_IDLE;
+ end
+ end
+ default:
+ begin
+ out_state <= TAR_IDLE;
+ out_reg_cs <= 1'b0;
+ out_flag <= 1'b0;
+ end
+ endcase
+ end
+end
+
+//-------------------------------------------------------
+// Double Sync Logic
+// ------------------------------------------------------
+always @(negedge in_reset_n or posedge in_clk)
+begin
+ if(in_reset_n == 1'b0)
+ begin
+ out_flag_s <= 1'b0;
+ out_flag_ss <= 1'b0;
+ end
+ else
+ begin
+ out_flag_s <= out_flag;
+ out_flag_ss <= out_flag_s;
+ end
+end
+
+
+always @(negedge out_reset_n or posedge out_clk)
+begin
+ if(out_reset_n == 1'b0)
+ begin
+ in_flag_s <= 1'b0;
+ in_flag_ss <= 1'b0;
+ end
+ else
+ begin
+ in_flag_s <= in_flag;
+ in_flag_ss <= in_flag_s;
+ end
+end
+
+
+endmodule
diff --git a/verilog/rtl/lib/async_wb.sv b/verilog/rtl/lib/async_wb.sv
new file mode 100644
index 0000000..53eb575
--- /dev/null
+++ b/verilog/rtl/lib/async_wb.sv
@@ -0,0 +1,234 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Async Wishbone Interface ////
+//// ////
+//// This file is part of the YIFive cores project ////
+//// http://www.opencores.org/cores/yifive/ ////
+//// ////
+//// Description ////
+//// This block does async Wishbone from one clock to other ////
+//// clock domain
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.1 - 25th Feb 2021, Dinesh A ////
+//// initial version ////
+//// 0.2 - 28th Feb 2021, Dinesh A ////
+//// reduced the response FIFO path depth to 2 as ////
+//// return path used by only read logic and read is ////
+//// blocking request and expect only one location will ////
+//// be used ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+module async_wb
+ #(parameter AW = 32,
+ parameter BW = 4,
+ parameter DW = 32)
+ (
+
+ // Master Port
+ input logic wbm_rst_n , // Regular Reset signal
+ input logic wbm_clk_i , // System clock
+ input logic wbm_cyc_i , // strobe/request
+ input logic wbm_stb_i , // strobe/request
+ input logic [AW-1:0] wbm_adr_i , // address
+ input logic wbm_we_i , // write
+ input logic [DW-1:0] wbm_dat_i , // data output
+ input logic [BW-1:0] wbm_sel_i , // byte enable
+ output logic [DW-1:0] wbm_dat_o , // data input
+ output logic wbm_ack_o , // acknowlegement
+ output logic wbm_err_o , // error
+
+ // Slave Port
+ input logic wbs_rst_n , // Regular Reset signal
+ input logic wbs_clk_i , // System clock
+ output logic wbs_cyc_o , // strobe/request
+ output logic wbs_stb_o , // strobe/request
+ output logic [AW-1:0] wbs_adr_o , // address
+ output logic wbs_we_o , // write
+ output logic [DW-1:0] wbs_dat_o , // data output
+ output logic [BW-1:0] wbs_sel_o , // byte enable
+ input logic [DW-1:0] wbs_dat_i , // data input
+ input logic wbs_ack_i , // acknowlegement
+ input logic wbs_err_i // error
+
+ );
+
+
+
+parameter CFW = AW+DW+BW+1 ; // COMMAND FIFO WIDTH
+
+//-------------------------------------------------
+// Master Interface
+// -------------------------------------------------
+logic PendingRd ; // Pending Read Transaction
+logic m_cmd_wr_en ;
+logic [CFW-1:0] m_cmd_wr_data ;
+logic m_cmd_wr_full ;
+logic m_cmd_wr_afull ;
+
+logic m_resp_rd_empty ;
+logic m_resp_rd_aempty ;
+logic m_resp_rd_en ;
+logic [DW:0] m_resp_rd_data ;
+
+// Master Write Interface
+
+
+assign m_cmd_wr_en = (!PendingRd) && wbm_stb_i && !m_cmd_wr_full && !m_cmd_wr_afull;
+
+assign m_cmd_wr_data = {wbm_adr_i,wbm_we_i,wbm_dat_i,wbm_sel_i};
+
+always@(negedge wbm_rst_n or posedge wbm_clk_i)
+begin
+ if(wbm_rst_n == 0) begin
+ PendingRd <= 1'b0;
+ end else begin
+ if((!PendingRd) && wbm_stb_i && (!wbm_we_i) && m_cmd_wr_en) begin
+ PendingRd <= 1'b1;
+ end else if(PendingRd && wbm_stb_i && (!wbm_we_i) && wbm_ack_o) begin
+ PendingRd <= 1'b0;
+ end
+ end
+end
+
+
+// Master Read Interface
+// For Write is feed through, if there is space in fifo the ack
+// For Read, Wait for Response Path FIFO status
+assign wbm_ack_o = (wbm_stb_i && wbm_we_i) ? m_cmd_wr_en : // Write Logic
+ (wbm_stb_i && (!wbm_we_i)) ? !m_resp_rd_empty : 1'b0; // Read Logic
+
+assign m_resp_rd_en = !m_resp_rd_empty;
+assign wbm_dat_o = m_resp_rd_data[DW-1:0];
+assign wbm_err_o = m_resp_rd_data[DW];
+
+
+//------------------------------
+// Slave Interface
+//-------------------------------
+
+logic [CFW-1:0] s_cmd_rd_data ;
+logic s_cmd_rd_empty ;
+logic s_cmd_rd_aempty ;
+logic s_cmd_rd_en ;
+logic s_resp_wr_en ;
+logic [DW:0] s_resp_wr_data ;
+logic s_resp_wr_full ;
+logic s_resp_wr_afull ;
+logic wbs_ack_f ;
+
+
+always@(negedge wbs_rst_n or posedge wbs_clk_i)
+begin
+ if(wbs_rst_n == 0) begin
+ wbs_ack_f <= 1'b0;
+ end else begin
+ wbs_ack_f <= wbs_ack_i;
+ end
+end
+
+
+// Read Interface
+assign {wbs_adr_o,wbs_we_o,wbs_dat_o,wbs_sel_o} = (s_cmd_rd_empty) ? '0: s_cmd_rd_data;
+// All the downstream logic expect Stobe is getting de-asserted
+// atleast for 1 cycle after ack is generated
+assign wbs_stb_o = (wbs_ack_f) ? 1'b0 : (s_cmd_rd_empty) ? 1'b0: 1'b1;
+assign wbs_cyc_o = (wbs_ack_f) ? 1'b0 : (s_cmd_rd_empty) ? 1'b0: 1'b1;
+
+assign s_cmd_rd_en = wbs_ack_i;
+
+// Write Interface
+// response send only for read logic
+assign s_resp_wr_en = wbs_stb_o & (!wbs_we_o) & wbs_ack_i & !s_resp_wr_full;
+assign s_resp_wr_data = {wbs_err_i,wbs_dat_i};
+
+async_fifo #(.W(CFW), .DP(4), .WR_FAST(1), .RD_FAST(1)) u_cmd_if (
+ // Sync w.r.t WR clock
+ .wr_clk (wbm_clk_i ),
+ .wr_reset_n (wbm_rst_n ),
+ .wr_en (m_cmd_wr_en ),
+ .wr_data (m_cmd_wr_data ),
+ .full (m_cmd_wr_full ),
+ .afull (m_cmd_wr_afull ),
+
+ // Sync w.r.t RD Clock
+ .rd_clk (wbs_clk_i ),
+ .rd_reset_n (wbs_rst_n ),
+ .rd_en (s_cmd_rd_en ),
+ .empty (s_cmd_rd_empty ), // sync'ed to rd_clk
+ .aempty (s_cmd_rd_aempty ), // sync'ed to rd_clk
+ .rd_data (s_cmd_rd_data )
+ );
+
+
+// Response used only read path, read is blocking access, expect
+// only one location used in return path - reduced the depth to 2
+async_fifo #(.W(DW+1), .DP(2), .WR_FAST(1), .RD_FAST(0)) u_resp_if (
+ // Sync w.r.t WR clock
+ .wr_clk (wbs_clk_i ),
+ .wr_reset_n (wbs_rst_n ),
+ .wr_en (s_resp_wr_en ),
+ .wr_data (s_resp_wr_data ),
+ .full (s_resp_wr_full ),
+ .afull (s_resp_wr_afull ),
+
+ // Sync w.r.t RD Clock
+ .rd_clk (wbm_clk_i ),
+ .rd_reset_n (wbm_rst_n ),
+ .rd_en (m_resp_rd_en ),
+ .empty (m_resp_rd_empty ), // sync'ed to rd_clk
+ .aempty (m_resp_rd_aempty ), // sync'ed to rd_clk
+ .rd_data (m_resp_rd_data )
+ );
+
+
+
+endmodule
diff --git a/verilog/rtl/lib/clk_buf.v b/verilog/rtl/lib/clk_buf.v
new file mode 100644
index 0000000..dad8fc6
--- /dev/null
+++ b/verilog/rtl/lib/clk_buf.v
@@ -0,0 +1,85 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Clk Buf ////
+//// ////
+//// This file is part of the YIFive cores project ////
+//// https://github.com/dineshannayya/yifive_r0.git ////
+//// http://www.opencores.org/cores/yifive/ ////
+//// ////
+//// Description ////
+//// Adding clock buf for manual clock tree at SOC level ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+
+module clk_buf (
+ // Outputs
+ clk_o,
+ // Inputs
+ clk_i
+ );
+
+//---------------------------------------------
+// All the input to this block are declared here
+// --------------------------------------------
+ input clk_i ;//
+
+//---------------------------------------------
+// All the output to this block are declared here
+// --------------------------------------------
+ output clk_o ; // clock out
+
+
+
+sky130_fd_sc_hd__clkbuf_16 u_buf (.A(clk_i),.X(clk_o));
+
+endmodule
+
diff --git a/verilog/rtl/lib/clk_ctl.v b/verilog/rtl/lib/clk_ctl.v
new file mode 100644
index 0000000..7e4478b
--- /dev/null
+++ b/verilog/rtl/lib/clk_ctl.v
@@ -0,0 +1,147 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+////////////////////////////////////////////////////////////////////////
+//// ////
+//// Tubo 8051 cores common library Module ////
+//// ////
+//// This file is part of the Turbo 8051 cores project ////
+//// https://github.com/dineshannayya/yifive_r0.git ////
+//// http://www.opencores.org/cores/turbo8051/ ////
+//// ////
+//// Description ////
+//// Turbo 8051 definitions. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 1.0 Mar 2, 2011,Dinesh.A ////
+//// Initial Version ////
+//// 1.1 Nov 15,2021,Dinesh A ////
+//// Bug fix in High and Low count width ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+// #################################################################
+// Module: clk_ctl
+//
+// Description: Generic clock control logic , clk-out = mclk/(2+clk_div_ratio)
+//
+//
+// #################################################################
+
+
+module clk_ctl (
+ // Outputs
+ clk_o,
+ // Inputs
+ mclk,
+ reset_n,
+ clk_div_ratio
+ );
+
+//---------------------------------
+// CLOCK Default Divider value.
+// This value will be change from outside
+//---------------------------------
+parameter WD = 'h1;
+
+//---------------------------------------------
+// All the input to this block are declared here
+// --------------------------------------------
+ input mclk ;//
+ input reset_n ;// primary reset signal
+ input [WD:0] clk_div_ratio ;// primary clock divide ratio
+ // output clock = selected clock / (div_ratio+1)
+
+//---------------------------------------------
+// All the output to this block are declared here
+// --------------------------------------------
+ output clk_o ; // clock out
+
+
+
+//------------------------------------
+// Clock Divide func is done here
+//------------------------------------
+reg [WD:0] high_count ; // high level counter
+reg [WD:0] low_count ; // low level counter
+reg mclk_div ; // divided clock
+
+
+assign clk_o = mclk_div;
+
+always @ (posedge mclk or negedge reset_n)
+begin // {
+ if(reset_n == 1'b0)
+ begin
+ high_count <= 'h0;
+ low_count <= 'h0;
+ mclk_div <= 'b0;
+ end
+ else
+ begin
+ if(high_count != 0)
+ begin // {
+ high_count <= high_count - 1;
+ mclk_div <= 1'b1;
+ end // }
+ else if(low_count != 0)
+ begin // {
+ low_count <= low_count - 1;
+ mclk_div <= 1'b0;
+ end // }
+ else
+ begin // {
+ high_count <= clk_div_ratio[WD:1] + clk_div_ratio[0];
+ low_count <= clk_div_ratio[WD:1] + 1;
+ mclk_div <= ~mclk_div;
+ end // }
+ end // }
+end // }
+
+
+endmodule
+
diff --git a/verilog/rtl/lib/clk_div8.v b/verilog/rtl/lib/clk_div8.v
new file mode 100644
index 0000000..d4731b7
--- /dev/null
+++ b/verilog/rtl/lib/clk_div8.v
@@ -0,0 +1,62 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesh.annayya@gmail.com>
+////////////////////////////////////////////////////////////////////////
+
+// #################################################################
+// Module: clock div by 2,4,8 supported
+//
+//
+//
+// #################################################################
+
+
+module clk_div8 (
+ // Outputs
+ output logic clk_div_8,
+ output logic clk_div_4,
+ output logic clk_div_2,
+ // Inputs
+ input logic mclk,
+ input logic reset_n
+ );
+
+
+
+
+//------------------------------------
+// Clock Divide func is done here
+//------------------------------------
+reg [2:0] clk_cnt ; // high level counter
+
+
+assign clk_div_2 = clk_cnt[0];
+assign clk_div_4 = clk_cnt[1];
+assign clk_div_8 = clk_cnt[2];
+
+always @ (posedge mclk or negedge reset_n)
+begin // {
+ if(reset_n == 1'b0)
+ begin
+ clk_cnt <= 'h0;
+ end else begin
+ clk_cnt <= clk_cnt + 1;
+ end // }
+end // }
+
+
+endmodule
+
diff --git a/verilog/rtl/lib/clk_gate.sv b/verilog/rtl/lib/clk_gate.sv
new file mode 100644
index 0000000..b7600f4
--- /dev/null
+++ b/verilog/rtl/lib/clk_gate.sv
@@ -0,0 +1,57 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Clock Gate with Scan over-ride ////
+//// ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.1 - 28 Nov 2021, Dinesh A ////
+//// Initial Version ////
+//////////////////////////////////////////////////////////////////////
+module clk_gate (
+ output logic GCLK, // Gated Clock Out
+
+ input logic CLK, // Functional Clock
+ input logic EN, // Functional Enable
+ input logic TE // SCAN MODE/SCAN Enable
+ );
+
+`ifndef SYNTHESIS
+ reg clk_enb;
+ always_latch begin
+ if(CLK == 0)
+ clk_enb = EN | TE;
+ end
+
+ assign GCLK = clk_enb & CLK;
+`else
+ sky130_fd_sc_hd__sdlclkp_2 u_clk_gate (
+ .GCLK (GCLK),
+ .SCE (TE),
+ .GATE (EN),
+ .CLK (CLK)
+ );
+
+`endif
+
+endmodule
+
diff --git a/verilog/rtl/lib/clk_skew_adjust.gv b/verilog/rtl/lib/clk_skew_adjust.gv
new file mode 100644
index 0000000..fc811c0
--- /dev/null
+++ b/verilog/rtl/lib/clk_skew_adjust.gv
@@ -0,0 +1,205 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// clock skew adjust ////
+//// ////
+//// This file is part of the YIFive cores project ////
+//// https://github.com/dineshannayya/yifive_r0.git ////
+//// http://www.opencores.org/cores/yifive/ ////
+//// ////
+//// Description ////
+//// This block is useful for global clock skew adjustment ////
+//// logic implementation: ////
+//// clk_out = (sel=0) ? clk_in : ////
+//// (sel=1) ? clk_d1 : ////
+//// (sel=1) ? clk_d2 : ////
+//// ..... ////
+//// (sel=15)? clk_d15 :clk_in ////
+//// ////
+//// Note: each d* indicate clk buf delay ////
+//// ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.0 - 29th Feb 2021, Dinesh A ////
+//// Initial version ////
+///
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+// Clock-in is east pad direction
+// clock out give in other three direction for better placement
+/////////////////////////////////////////////////////////////////////
+module clk_skew_adjust(
+`ifdef USE_POWER_PINS
+ vccd1,// User area 1 1.8V supply
+ vssd1,// User area 1 digital ground
+`endif
+clk_in, sel, clk_out);
+
+
+`ifdef USE_POWER_PINS
+ input vccd1;// User area 1 1.8V supply
+ input vssd1;// User area 1 digital ground
+`endif
+ input clk_in;
+ output clk_out;
+ input [3:0] sel;
+ wire in0;
+ wire in1;
+ wire in2;
+ wire in3;
+ wire in4;
+ wire in5;
+ wire in6;
+ wire in7;
+ wire in8;
+ wire in9;
+ wire in10;
+ wire in11;
+ wire in12;
+ wire in13;
+ wire in14;
+ wire in15;
+
+ wire clk_d1;
+ wire clk_d2;
+ wire clk_d3;
+ wire clk_d4;
+ wire clk_d5;
+ wire clk_d6;
+ wire clk_d7;
+ wire clk_d8;
+ wire clk_d9;
+ wire clk_d10;
+ wire clk_d11;
+ wire clk_d12;
+ wire clk_d13;
+ wire clk_d14;
+ wire clk_d15;
+
+ wire d00;
+ wire d01;
+ wire d02;
+ wire d03;
+ wire d04;
+ wire d05;
+ wire d06;
+ wire d07;
+ wire d10;
+ wire d11;
+ wire d12;
+ wire d13;
+ wire d20;
+ wire d21;
+ wire d30;
+
+
+ ctech_delay_clkbuf clkbuf_1 (.A(clk_in), .X(clk_d1));
+ ctech_delay_clkbuf clkbuf_2 (.A(clk_d1), .X(clk_d2));
+ ctech_delay_clkbuf clkbuf_3 (.A(clk_d2), .X(clk_d3));
+ ctech_delay_clkbuf clkbuf_4 (.A(clk_d3), .X(clk_d4));
+ ctech_delay_clkbuf clkbuf_5 (.A(clk_d4), .X(clk_d5));
+ ctech_delay_clkbuf clkbuf_6 (.A(clk_d5), .X(clk_d6));
+ ctech_delay_clkbuf clkbuf_7 (.A(clk_d6), .X(clk_d7));
+ ctech_delay_clkbuf clkbuf_8 (.A(clk_d7), .X(clk_d8));
+ ctech_delay_clkbuf clkbuf_9 (.A(clk_d8), .X(clk_d9));
+ ctech_delay_clkbuf clkbuf_10 (.A(clk_d9), .X(clk_d10));
+ ctech_delay_clkbuf clkbuf_11 (.A(clk_d10), .X(clk_d11));
+ ctech_delay_clkbuf clkbuf_12 (.A(clk_d11), .X(clk_d12));
+ ctech_delay_clkbuf clkbuf_13 (.A(clk_d12), .X(clk_d13));
+ ctech_delay_clkbuf clkbuf_14 (.A(clk_d13), .X(clk_d14));
+ ctech_delay_clkbuf clkbuf_15 (.A(clk_d14), .X(clk_d15));
+
+
+ // Tap point selection
+ assign in0 = clk_in;
+ assign in1 = clk_d1;
+ assign in2 = clk_d2;
+ assign in3 = clk_d3;
+ assign in4 = clk_d4;
+ assign in5 = clk_d5;
+ assign in6 = clk_d6;
+ assign in7 = clk_d7;
+ assign in8 = clk_d8;
+ assign in9 = clk_d9;
+ assign in10 = clk_d10;
+ assign in11 = clk_d11;
+ assign in12 = clk_d12;
+ assign in13 = clk_d13;
+ assign in14 = clk_d14;
+ assign in15 = clk_d15;
+
+
+ // first level mux - 8
+ ctech_mux2x1_2 u_mux_level_00 ( .X (d00) , .A0 (in0), .A1(in1), .S(sel[0]));
+ ctech_mux2x1_2 u_mux_level_01 ( .X (d01) , .A0 (in2), .A1(in3), .S(sel[0]));
+ ctech_mux2x1_2 u_mux_level_02 ( .X (d02) , .A0 (in4), .A1(in5), .S(sel[0]));
+ ctech_mux2x1_2 u_mux_level_03 ( .X (d03) , .A0 (in6), .A1(in7), .S(sel[0]));
+ ctech_mux2x1_2 u_mux_level_04 ( .X (d04) , .A0 (in8), .A1(in9), .S(sel[0]));
+ ctech_mux2x1_2 u_mux_level_05 ( .X (d05) , .A0 (in10), .A1(in11), .S(sel[0]));
+ ctech_mux2x1_2 u_mux_level_06 ( .X (d06) , .A0 (in12), .A1(in13), .S(sel[0]));
+ ctech_mux2x1_2 u_mux_level_07 ( .X (d07) , .A0 (in14), .A1(in15), .S(sel[0]));
+
+ // second level mux - 4
+ ctech_mux2x1_2 u_mux_level_10 ( .X (d10) , .A0 (d00), .A1(d01), .S(sel[1]));
+ ctech_mux2x1_2 u_mux_level_11 ( .X (d11) , .A0 (d02), .A1(d03), .S(sel[1]));
+ ctech_mux2x1_2 u_mux_level_12 ( .X (d12) , .A0 (d04), .A1(d05), .S(sel[1]));
+ ctech_mux2x1_2 u_mux_level_13 ( .X (d13) , .A0 (d06), .A1(d07), .S(sel[1]));
+
+ // third level mux - 2
+ ctech_mux2x1_2 u_mux_level_20 ( .X (d20) , .A0 (d10), .A1(d11), .S(sel[2]));
+ ctech_mux2x1_2 u_mux_level_21 ( .X (d21) , .A0 (d12), .A1(d13), .S(sel[2]));
+
+ // fourth level mux - 1
+ ctech_mux2x1_4 u_mux_level_30 ( .X (d30) , .A0 (d20), .A1(d21), .S(sel[3]));
+
+
+ assign clk_out = d30;
+
+endmodule
diff --git a/verilog/rtl/lib/crc_32.sv b/verilog/rtl/lib/crc_32.sv
new file mode 100755
index 0000000..db0d1c7
--- /dev/null
+++ b/verilog/rtl/lib/crc_32.sv
@@ -0,0 +1,194 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// crc_32.v: CRC is generated on when run is asserted. ////
+//// The 32-bit crc shift register is reset to ////
+//// all 1's when either clear asserted ////
+//// ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.1 - 28 Nov 2021, Dinesh A ////
+//// Initial Version ////
+//////////////////////////////////////////////////////////////////////
+
+module crc_32 (
+ // List of outputs.
+ output logic [31:0] crc_out,
+
+ // List of inputs
+ input logic run, // when asserted, crc is generated
+ input logic clear , // When asserted crc is re-initialized
+ input logic [7:0] data_in,
+ input logic mclk,
+ input logic reset_n
+ );
+
+
+//----------------------------------
+// define local signals here.
+//----------------------------------
+
+ logic[31:0] current_crc, next_crc;
+
+
+ assign crc_out = ~current_crc;
+
+ // 32-bit crc shift register for crc calculation.
+
+ always @(posedge mclk or negedge reset_n)
+ begin
+ if (!reset_n)
+ begin
+ current_crc <= 32'hffffffff;
+ end
+ else
+ begin
+ if (clear )
+ begin
+ current_crc <= 32'hffffffff;
+ end
+ else if (run) // generate crc
+ begin
+ current_crc <= next_crc;
+ end // else: !if(tx_reset_crc )
+ end // else: !if(reset_n)
+ end // always @ (posedge mclk or negedge reset_n)
+
+ // combinational logic to generate next_crc
+
+ always_comb
+ begin
+
+ next_crc[0] = current_crc[8] ^ current_crc[2] ^ data_in[2];
+ next_crc[1] = current_crc[9] ^ current_crc[0] ^ data_in[0] ^
+ current_crc[3] ^ data_in[3];
+ next_crc[2] = current_crc[10] ^ current_crc[0] ^ data_in[0] ^
+ current_crc[1] ^ data_in[1] ^ current_crc[4] ^
+ data_in[4];
+ next_crc[3] = current_crc[11] ^ current_crc[1] ^ data_in[1] ^
+ current_crc[2] ^ data_in[2] ^ current_crc[5] ^
+ data_in[5];
+ next_crc[4] = current_crc[12] ^ current_crc[2] ^ data_in[2] ^
+ current_crc[3] ^ data_in[3] ^ current_crc[6] ^
+ current_crc[0] ^ data_in[0] ^ data_in[6];
+ next_crc[5] = current_crc[13] ^ current_crc[3] ^ data_in[3] ^
+ current_crc[4] ^ data_in[4] ^ current_crc[7] ^
+ current_crc[1] ^ data_in[1] ^ data_in[7];
+ next_crc[6] = current_crc[14] ^ current_crc[4] ^ data_in[4] ^
+ current_crc[5] ^ data_in[5];
+ next_crc[7] = current_crc[15] ^ current_crc[5] ^ data_in[5] ^
+ current_crc[6] ^ current_crc[0] ^ data_in[0] ^
+ data_in[6];
+ next_crc[8] = current_crc[16] ^ current_crc[0] ^ data_in[0] ^
+ current_crc[6] ^ current_crc[0] ^ data_in[0] ^
+ data_in[6] ^ current_crc[7] ^ current_crc[1] ^
+ data_in[1] ^ data_in[7];
+ next_crc[9] = current_crc[17] ^ current_crc[1] ^ data_in[1] ^
+ current_crc[7] ^ current_crc[1] ^ data_in[1] ^
+ data_in[7];
+ next_crc[10] = current_crc[18] ^ current_crc[2] ^ data_in[2];
+ next_crc[11] = current_crc[19] ^ current_crc[3] ^ data_in[3];
+ next_crc[12] = current_crc[20] ^ current_crc[0] ^ data_in[0] ^
+ current_crc[4] ^ data_in[4];
+ next_crc[13] = current_crc[21] ^ current_crc[0] ^ data_in[0] ^
+ current_crc[1] ^ data_in[1] ^ current_crc[5] ^
+ data_in[5];
+ next_crc[14] = current_crc[22] ^ current_crc[0] ^ data_in[0] ^
+ current_crc[1] ^ data_in[1] ^ current_crc[2] ^
+ data_in[2] ^ current_crc[6] ^ current_crc[0] ^
+ data_in[0] ^ data_in[6];
+ next_crc[15] = current_crc[23] ^ current_crc[1] ^ data_in[1] ^
+ current_crc[2] ^ data_in[2] ^ current_crc[3] ^
+ data_in[3] ^ current_crc[7] ^ current_crc[1] ^
+ data_in[1] ^ data_in[7];
+ next_crc[16] = current_crc[24] ^ current_crc[0] ^ data_in[0] ^
+ current_crc[2] ^ data_in[2] ^ current_crc[3] ^
+ data_in[3] ^ current_crc[4] ^ data_in[4];
+ next_crc[17] = current_crc[25] ^ current_crc[0] ^ data_in[0] ^
+ current_crc[1] ^ data_in[1] ^ current_crc[3] ^
+ data_in[3] ^ current_crc[4] ^ data_in[4] ^
+ current_crc[5] ^ data_in[5];
+ next_crc[18] = current_crc[26] ^ current_crc[1] ^ data_in[1] ^
+ current_crc[2] ^ data_in[2] ^ current_crc[4] ^
+ data_in[4] ^ current_crc[5] ^ data_in[5] ^
+ current_crc[6] ^ current_crc[0] ^ data_in[0] ^
+ data_in[6];
+ next_crc[19] = current_crc[27] ^ current_crc[0] ^ data_in[0] ^
+ current_crc[2] ^ data_in[2] ^ current_crc[3] ^
+ data_in[3] ^ current_crc[5] ^ data_in[5] ^
+ current_crc[6] ^ current_crc[0] ^ data_in[0] ^
+ data_in[6] ^ current_crc[7] ^ current_crc[1] ^
+ data_in[1] ^ data_in[7];
+ next_crc[20] = current_crc[28] ^ current_crc[0] ^ data_in[0] ^
+ current_crc[1] ^ data_in[1] ^ current_crc[3] ^
+ data_in[3] ^ current_crc[4] ^ data_in[4] ^
+ current_crc[6] ^ current_crc[0] ^ data_in[0] ^
+ data_in[6] ^ current_crc[7] ^ current_crc[1] ^
+ data_in[1] ^ data_in[7];
+ next_crc[21] = current_crc[29] ^ current_crc[1] ^ data_in[1] ^
+ current_crc[2] ^ data_in[2] ^ current_crc[4] ^
+ data_in[4] ^ current_crc[5] ^ data_in[5] ^
+ current_crc[7] ^ current_crc[1] ^ data_in[1] ^
+ data_in[7];
+ next_crc[22] = current_crc[30] ^ current_crc[0] ^ data_in[0] ^
+ current_crc[2] ^ data_in[2] ^ current_crc[3] ^
+ data_in[3] ^ current_crc[5] ^ data_in[5] ^
+ current_crc[6] ^ current_crc[0] ^ data_in[0] ^
+ data_in[6];
+ next_crc[23] = current_crc[31] ^ current_crc[0] ^ data_in[0] ^
+ current_crc[1] ^ data_in[1] ^ current_crc[3] ^
+ data_in[3] ^ current_crc[4] ^ data_in[4] ^
+ current_crc[6] ^ current_crc[0] ^ data_in[0] ^
+ data_in[6] ^ current_crc[7] ^ current_crc[1] ^
+ data_in[1] ^ data_in[7];
+ next_crc[24] = current_crc[0] ^ data_in[0] ^ current_crc[1] ^
+ data_in[1] ^ current_crc[2] ^ data_in[2] ^
+ current_crc[4] ^ data_in[4] ^ current_crc[5] ^
+ data_in[5] ^ current_crc[7] ^ current_crc[1] ^
+ data_in[1] ^ data_in[7];
+ next_crc[25] = current_crc[1] ^ data_in[1] ^ current_crc[2] ^
+ data_in[2] ^ current_crc[3] ^ data_in[3] ^
+ current_crc[5] ^ data_in[5] ^ current_crc[6] ^
+ current_crc[0] ^ data_in[0] ^ data_in[6];
+ next_crc[26] = current_crc[2] ^ data_in[2] ^ current_crc[3] ^
+ data_in[3] ^ current_crc[4] ^ data_in[4] ^
+ current_crc[6] ^ current_crc[0] ^ data_in[0] ^
+ data_in[6] ^ current_crc[7] ^ current_crc[1] ^
+ data_in[1] ^ data_in[7];
+ next_crc[27] = current_crc[3] ^ data_in[3] ^ current_crc[4] ^
+ data_in[4] ^ current_crc[5] ^ data_in[5] ^
+ current_crc[7] ^ current_crc[1] ^ data_in[1] ^
+ data_in[7];
+ next_crc[28] = current_crc[4] ^data_in[4] ^ current_crc[5] ^
+ data_in[5] ^ current_crc[6] ^ current_crc[0] ^
+ data_in[0] ^ data_in[6];
+ next_crc[29] = current_crc[5] ^ data_in[5] ^ current_crc[6] ^
+ current_crc[0] ^ data_in[0] ^ data_in[6] ^
+ current_crc[7] ^ current_crc[1] ^ data_in[1] ^
+ data_in[7];
+ next_crc[30] = current_crc[6] ^ current_crc[0] ^ data_in[0] ^
+ data_in[6] ^ current_crc[7] ^ current_crc[1] ^
+ data_in[1] ^ data_in[7];
+ next_crc[31] = current_crc[7] ^ current_crc[1] ^ data_in[1] ^
+ data_in[7];
+ end // always
+
+endmodule
diff --git a/verilog/rtl/lib/ctech_cells.sv b/verilog/rtl/lib/ctech_cells.sv
new file mode 100644
index 0000000..8e3b0de
--- /dev/null
+++ b/verilog/rtl/lib/ctech_cells.sv
@@ -0,0 +1,51 @@
+
+module ctech_mux2x1 (
+ input logic A0,
+ input logic A1,
+ input logic S ,
+ output logic X);
+
+`ifndef SYNTHESIS
+assign X = (S) ? A1 : A0;
+`else
+sky130_fd_sc_hd__mux2_8 u_mux (.A0 (A0), .A1 (A1), .S (S), .X (X));
+`endif
+
+endmodule
+
+module ctech_buf (
+ input logic A,
+ output logic X);
+
+`ifndef SYNTHESIS
+assign X = A;
+`else
+ sky130_fd_sc_hd__bufbuf_8 u_buf (.A(A),.X(X));
+`endif
+
+endmodule
+
+module ctech_clk_buf (
+ input logic A,
+ output logic X);
+
+`ifndef SYNTHESIS
+assign X = A;
+`else
+ sky130_fd_sc_hd__clkbuf_8 u_buf (.A(A),.X(X));
+`endif
+
+endmodule
+
+module ctech_delay_buf (
+ input logic A,
+ output logic X);
+
+`ifndef SYNTHESIS
+ assign X = A;
+`else
+ sky130_fd_sc_hd__dlygate4sd3_1 u_dly (.X(X),.A(A));
+`endif
+
+endmodule
+
diff --git a/verilog/rtl/lib/dble_reg.v b/verilog/rtl/lib/dble_reg.v
new file mode 100755
index 0000000..b8364f8
--- /dev/null
+++ b/verilog/rtl/lib/dble_reg.v
@@ -0,0 +1,92 @@
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Tubo 8051 cores common library Module ////
+//// ////
+//// This file is part of the Turbo 8051 cores project ////
+//// http://www.opencores.org/cores/turbo8051/ ////
+//// ////
+//// Description ////
+//// Turbo 8051 definitions. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : Mar 2, 2011 ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+
+/***************************************************************
+ Description:
+ Synchronizes the pulse from one clock to another
+ * clock domain
+***********************************************************************/
+module half_dup_dble_reg (
+ //outputs
+ sync_out_pulse,
+ //inputs
+ in_pulse,
+ dest_clk,
+ reset_n);
+
+ output sync_out_pulse; //output synchronised to slow clock
+ input in_pulse; //input based on fast clock, pulse
+ input dest_clk; //slow clock
+ input reset_n;
+
+ reg s1_sync_out,d_sync_out,s2_sync_out;
+
+ //double register the data in the slow clock domain
+ always @(posedge dest_clk or negedge reset_n)
+ begin
+ if (!reset_n)
+ begin
+ s1_sync_out <= 0;
+ s2_sync_out <= 0;
+ d_sync_out <= 0;
+ end // if (reset_n)
+ else
+ begin
+ s1_sync_out <= in_pulse;
+ s2_sync_out <= s1_sync_out;
+ d_sync_out <= s2_sync_out;
+ end // else: !if(reset_n)
+ end // always @ (posedge dest_clk or negedge reset_n)
+
+ assign sync_out_pulse = d_sync_out;
+
+endmodule // dble_reg
+
+
+
+
+
+
diff --git a/verilog/rtl/lib/double_sync_high.v b/verilog/rtl/lib/double_sync_high.v
new file mode 100755
index 0000000..d1d2ca6
--- /dev/null
+++ b/verilog/rtl/lib/double_sync_high.v
@@ -0,0 +1,106 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// OMS 8051 cores common library Module ////
+//// ////
+//// This file is part of the OMS 8051 cores project ////
+//// http://www.opencores.org/cores/oms8051mini/ ////
+//// https://github.com/dineshannayya/yifive_r0.git ////
+//// ////
+//// Description ////
+//// OMS 8051 definitions. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : Nov 26, 2016 ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//----------------------------------------------------------------------------
+// Simple Double sync logic with Reset value = 0
+// This double signal should be used for signal transiting from low to high
+//----------------------------------------------------------------------------
+
+module double_sync_high (
+ in_data ,
+ out_clk ,
+ out_rst_n ,
+ out_data
+ );
+
+parameter WIDTH = 1;
+
+input [WIDTH-1:0] in_data ; // Input from Different clock domain
+input out_clk ; // Output clock
+input out_rst_n ; // Active low Reset
+output[WIDTH-1:0] out_data ; // Output Data
+
+
+reg [WIDTH-1:0] in_data_s ; // One Cycle sync
+reg [WIDTH-1:0] in_data_2s ; // two Cycle sync
+reg [WIDTH-1:0] in_data_3s ; // three Cycle sync
+
+assign out_data = in_data_3s;
+
+always @(negedge out_rst_n or posedge out_clk)
+begin
+ if(out_rst_n == 1'b0)
+ begin
+ in_data_s <= {WIDTH{1'b0}};
+ in_data_2s <= {WIDTH{1'b0}};
+ in_data_3s <= {WIDTH{1'b0}};
+ end
+ else
+ begin
+ in_data_s <= in_data;
+ in_data_2s <= in_data_s;
+ in_data_3s <= in_data_2s;
+ end
+end
+
+
+endmodule
diff --git a/verilog/rtl/lib/double_sync_low.v b/verilog/rtl/lib/double_sync_low.v
new file mode 100755
index 0000000..efd4269
--- /dev/null
+++ b/verilog/rtl/lib/double_sync_low.v
@@ -0,0 +1,106 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// OMS 8051 cores common library Module ////
+//// ////
+//// This file is part of the OMS 8051 cores project ////
+//// http://www.opencores.org/cores/oms8051mini/ ////
+//// https://github.com/dineshannayya/yifive_r0.git ////
+//// ////
+//// Description ////
+//// OMS 8051 definitions. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : Nov 26, 2016 ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//----------------------------------------------------------------------------
+// Simple Double sync logic with Reset value = 1
+// This double signal should be used for signal transiting from low to high
+//----------------------------------------------------------------------------
+
+module double_sync_low (
+ in_data ,
+ out_clk ,
+ out_rst_n ,
+ out_data
+ );
+
+parameter WIDTH = 1;
+
+input [WIDTH-1:0] in_data ; // Input from Different clock domain
+input out_clk ; // Output clock
+input out_rst_n ; // Active low Reset
+output[WIDTH-1:0] out_data ; // Output Data
+
+
+reg [WIDTH-1:0] in_data_s ; // One Cycle sync
+reg [WIDTH-1:0] in_data_2s ; // two Cycle sync
+reg [WIDTH-1:0] in_data_3s ; // three Cycle sync
+
+assign out_data = in_data_3s;
+
+always @(negedge out_rst_n or posedge out_clk)
+begin
+ if(out_rst_n == 1'b0)
+ begin
+ in_data_s <= {WIDTH{1'b1}};
+ in_data_2s <= {WIDTH{1'b1}};
+ in_data_3s <= {WIDTH{1'b1}};
+ end
+ else
+ begin
+ in_data_s <= in_data;
+ in_data_2s <= in_data_s;
+ in_data_3s <= in_data_2s;
+ end
+end
+
+
+endmodule
diff --git a/verilog/rtl/lib/g_dpath_ctrl.v b/verilog/rtl/lib/g_dpath_ctrl.v
new file mode 100644
index 0000000..846d65b
--- /dev/null
+++ b/verilog/rtl/lib/g_dpath_ctrl.v
@@ -0,0 +1,168 @@
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Tubo 8051 cores Data Path controller ////
+//// ////
+//// This file is part of the Turbo 8051 cores project ////
+//// http://www.opencores.org/cores/turbo8051/ ////
+//// ////
+//// Description ////
+//// Turbo 8051 definitions. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : Mar 2, 2011 ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+module g_dpath_ctrl (
+ rst_n ,
+ clk ,
+
+ rx_buf_base_addr ,
+ tx_buf_base_addr ,
+
+ // gmac core to memory write interface
+ g_rx_mem_rd ,
+ g_rx_mem_eop ,
+ g_rx_mem_addr ,
+ g_rx_block_rxrd ,
+
+ // descr handshake
+ g_rx_desc_req ,
+ g_rx_desc_discard ,
+ g_rx_desc_data ,
+ g_rx_desc_ack ,
+
+ g_rx_pkt_done ,
+ g_rx_pkt_len ,
+ g_rx_pkt_status ,
+ g_rx_pkt_drop
+
+
+ );
+
+
+input rst_n ;
+input clk ;
+
+input [3:0] rx_buf_base_addr ; // 8K Rx Base Address
+input [3:0] tx_buf_base_addr ; // 8K tx Base Address
+
+// gmac core to memory write interface
+input g_rx_mem_rd ;
+input g_rx_mem_eop ;
+output [15:0] g_rx_mem_addr ;
+output g_rx_block_rxrd ; // Block Rx Read between EOP and PktDone
+
+input g_rx_pkt_done ; // End of current Packet
+input [11:0] g_rx_pkt_len ; // Packet Length
+input [15:0] g_rx_pkt_status ; // Packet Status
+input g_rx_pkt_drop ; // Packet drop and rewind the pointer
+
+
+//-----------------------------------
+// Descriptor handshake
+//----------------------------------
+output g_rx_desc_req ; // rx desc request
+output g_rx_desc_discard ; // rx desc discard indication
+output [31:0] g_rx_desc_data ; // rx desc data
+input g_rx_desc_ack ; // rx desc ack
+
+
+reg g_rx_desc_req ;
+reg g_rx_desc_discard ; // rx desc discard indication
+reg [31:0] g_rx_desc_data ; // rx desc data
+
+reg [11:0] g_rx_mem_addr_int ;
+
+wire [15:0] g_rx_mem_addr = {rx_buf_base_addr,g_rx_mem_addr_int[11:0]};
+
+
+reg bStartFlag; // Indicate a SOP transaction, used for registering Start Address
+reg g_rx_block_rxrd; // Block Rx Read at the end of EOP and Enable on Packet Done
+reg [11:0] g_rx_saddr;
+
+always @(negedge rst_n or posedge clk) begin
+ if(rst_n == 0) begin
+ g_rx_mem_addr_int <= 0;
+ bStartFlag <= 1;
+ g_rx_block_rxrd <= 0;
+ g_rx_saddr <= 0;
+ g_rx_desc_discard <= 0;
+ g_rx_desc_data <= 0;
+ g_rx_desc_req <= 0;
+ end
+ else begin
+ if(bStartFlag && g_rx_mem_rd) begin
+ g_rx_saddr <= g_rx_mem_addr_int[11:0];
+ bStartFlag <= 0;
+ end else if (g_rx_mem_rd && g_rx_mem_eop) begin
+ bStartFlag <= 1;
+ end
+
+ if(g_rx_mem_rd && g_rx_mem_eop)
+ g_rx_block_rxrd <= 1;
+ else if(g_rx_pkt_done)
+ g_rx_block_rxrd <= 0;
+
+ //-----------------------------
+ // Finding the Frame Size
+ //----------------------------
+ if(g_rx_pkt_done && g_rx_pkt_drop) begin
+ g_rx_mem_addr_int <= g_rx_saddr;
+ end else if(g_rx_mem_rd && g_rx_mem_eop) begin
+ // Realign to 32 bit boundary and add one free space at eop
+ g_rx_mem_addr_int[1:0] <= 0;
+ g_rx_mem_addr_int[11:2] <= g_rx_mem_addr_int[11:2]+1;
+ end else if(g_rx_mem_rd ) begin
+ g_rx_mem_addr_int <= g_rx_mem_addr_int+1;
+ end
+ // Descriptor Request Generation
+ if(g_rx_pkt_done) begin
+ g_rx_desc_req <= 1;
+ if(g_rx_pkt_drop) begin
+ g_rx_desc_discard <= 1;
+ end else begin
+ g_rx_desc_discard <= 0;
+ g_rx_desc_data <= {g_rx_pkt_status[5:0],rx_buf_base_addr[3:0],
+ g_rx_saddr[11:2],g_rx_pkt_len[11:0]};
+ end
+ end
+ else if (g_rx_desc_ack) begin
+ g_rx_desc_req <= 0;
+ g_rx_desc_discard <= 0;
+ end
+ end
+end
+
+
+endmodule
diff --git a/verilog/rtl/lib/pulse_gen_type1.sv b/verilog/rtl/lib/pulse_gen_type1.sv
new file mode 100644
index 0000000..b209ca0
--- /dev/null
+++ b/verilog/rtl/lib/pulse_gen_type1.sv
@@ -0,0 +1,54 @@
+///////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//------------------------------------------------------------------------
+// This module is used to generate 1ms and 1sec pulse based on 1us trigger
+// pulse
+//------------------------------------------------------------------------
+
+module pulse_gen_type1(
+ output logic clk_pulse,
+
+ input logic clk,
+ input logic reset_n,
+ input logic trigger
+);
+
+parameter WD= 10; // This will count from 0 to 1023
+parameter MAX_CNT = 999;
+
+logic [WD-1:0] cnt;
+
+assign clk_pulse = (cnt == 0) && trigger;
+
+always @ (posedge clk or negedge reset_n)
+begin
+ if (reset_n == 1'b0) begin
+ cnt <= 'b0;
+ end else begin
+ if(trigger) begin
+ if(cnt >= MAX_CNT)
+ cnt <= 0;
+ else
+ cnt <= cnt +1;
+ end
+ end
+end
+
+endmodule
+
diff --git a/verilog/rtl/lib/pulse_gen_type2.sv b/verilog/rtl/lib/pulse_gen_type2.sv
new file mode 100644
index 0000000..f9bcae3
--- /dev/null
+++ b/verilog/rtl/lib/pulse_gen_type2.sv
@@ -0,0 +1,53 @@
+///////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//------------------------------------------------------------------------
+// This module is used to generate 1us based on config value
+//------------------------------------------------------------------------
+
+module pulse_gen_type2 #(parameter WD = 10)
+ (
+ output logic clk_pulse,
+
+ input logic clk,
+ input logic reset_n,
+ input logic [WD-1:0] cfg_max_cnt
+);
+
+
+logic [WD-1:0] cnt;
+
+
+always @ (posedge clk or negedge reset_n)
+begin
+ if (reset_n == 1'b0) begin
+ cnt <= 'b0;
+ clk_pulse <= 'b0;
+ end else begin
+ if(cnt == cfg_max_cnt) begin
+ cnt <= 0;
+ clk_pulse <= 1'b1;
+ end else begin
+ cnt <= cnt +1;
+ clk_pulse <= 1'b0;
+ end
+ end
+end
+
+endmodule
+
diff --git a/verilog/rtl/lib/registers.v b/verilog/rtl/lib/registers.v
new file mode 100755
index 0000000..e4a87a1
--- /dev/null
+++ b/verilog/rtl/lib/registers.v
@@ -0,0 +1,329 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Tubo 8051 cores common library Module ////
+//// ////
+//// This file is part of the Turbo 8051 cores project ////
+//// http://www.opencores.org/cores/turbo8051/ ////
+//// ////
+//// Description ////
+//// Turbo 8051 definitions. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : Mar 2, 2011 ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+/*********************************************************************
+** module: bit register
+
+** description: infers a register, make it modular
+ ***********************************************************************/
+module bit_register (
+ //inputs
+ we,
+ clk,
+ reset_n,
+ data_in,
+
+ //outputs
+ data_out
+ );
+
+//---------------------------------
+// Reset Default value
+//---------------------------------
+parameter RESET_DEFAULT = 1'h0;
+
+ input we;
+ input clk;
+ input reset_n;
+ input data_in;
+ output data_out;
+
+ reg data_out;
+
+ //infer the register
+ always @(posedge clk or negedge reset_n)
+ begin
+ if (!reset_n)
+ data_out <= RESET_DEFAULT;
+ else if (we)
+ data_out <= data_in;
+ end // always @ (posedge clk or negedge reset_n)
+endmodule // register
+
+
+/*********************************************************************
+** module: req register.
+
+** description: This register is set by cpu writting 1 and reset by
+ harward req = 1
+
+ Note: When there is a clash between cpu and hardware, cpu is given higher
+ priority
+
+ ***********************************************************************/
+module req_register (
+ //inputs
+ clk,
+ reset_n,
+ cpu_we,
+ cpu_req,
+ hware_ack,
+
+ //outputs
+ data_out
+ );
+
+//---------------------------------
+// Reset Default value
+//---------------------------------
+parameter RESET_DEFAULT = 1'h0;
+
+ input clk ;
+ input reset_n ;
+ input cpu_we ; // cpu write enable
+ input cpu_req ; // CPU Request
+ input hware_ack; // Hardware Ack
+ output data_out ;
+
+ reg data_out;
+
+ //infer the register
+ always @(posedge clk or negedge reset_n)
+ begin
+ if (!reset_n)
+ data_out <= RESET_DEFAULT;
+ else if (cpu_we & cpu_req) // Set on CPU Request
+ data_out <= 1'b1;
+ else if (hware_ack) // Reset the flag on Hardware ack
+ data_out <= 1'b0;
+ end // always @ (posedge clk or negedge reset_n)
+endmodule // register
+
+
+/*********************************************************************
+** module: req register.
+
+** description: This register is cleared by cpu writting 1 and set by
+ harward req = 1
+
+ Note: When there is a clash between cpu and hardware,
+ hardware is given higher priority
+
+ ***********************************************************************/
+module stat_register (
+ //inputs
+ clk,
+ reset_n,
+ cpu_we,
+ cpu_ack,
+ hware_req,
+
+ //outputs
+ data_out
+ );
+
+//---------------------------------
+// Reset Default value
+//---------------------------------
+parameter RESET_DEFAULT = 1'h0;
+
+ input clk ;
+ input reset_n ;
+ input cpu_we ; // cpu write enable
+ input cpu_ack ; // CPU Ack
+ input hware_req; // Hardware Req
+ output data_out ;
+
+ reg data_out;
+
+ //infer the register
+ always @(posedge clk or negedge reset_n)
+ begin
+ if (!reset_n)
+ data_out <= RESET_DEFAULT;
+ else if (hware_req) // Set the flag on Hardware Req
+ data_out <= 1'b1;
+ else if (cpu_we & cpu_ack) // Clear on CPU Ack
+ data_out <= 1'b0;
+ end // always @ (posedge clk or negedge reset_n)
+endmodule // register
+
+
+
+
+
+/*********************************************************************
+ module: generic register
+***********************************************************************/
+module generic_register (
+ //List of Inputs
+ we,
+ data_in,
+ reset_n,
+ clk,
+
+ //List of Outs
+ data_out
+ );
+
+ parameter WD = 1;
+ parameter RESET_DEFAULT = 0;
+ input [WD-1:0] we;
+ input [WD-1:0] data_in;
+ input reset_n;
+ input clk;
+ output [WD-1:0] data_out;
+
+
+generate
+ genvar i;
+ for (i = 0; i < WD; i = i + 1) begin : gen_bit_reg
+ bit_register #(RESET_DEFAULT[i]) u_bit_reg (
+ .we (we[i]),
+ .clk (clk),
+ .reset_n (reset_n),
+ .data_in (data_in[i]),
+ .data_out (data_out[i])
+ );
+ end
+endgenerate
+
+
+endmodule
+
+
+/*********************************************************************
+ module: generic interrupt status
+***********************************************************************/
+module generic_intr_stat_reg (
+ //inputs
+ clk,
+ reset_n,
+ reg_we,
+ reg_din,
+ hware_req,
+
+ //outputs
+ data_out
+ );
+
+ parameter WD = 1;
+ parameter RESET_DEFAULT = 0;
+ input [WD-1:0] reg_we;
+ input [WD-1:0] reg_din;
+ input [WD-1:0] hware_req;
+ input reset_n;
+ input clk;
+ output [WD-1:0] data_out;
+
+
+generate
+ genvar i;
+ for (i = 0; i < WD; i = i + 1) begin : gen_bit_reg
+ stat_register #(RESET_DEFAULT[i]) u_bit_reg (
+ //inputs
+ . clk (clk ),
+ . reset_n (reset_n ),
+ . cpu_we (reg_we[i] ),
+ . cpu_ack (reg_din[i] ),
+ . hware_req (hware_req[i] ),
+
+ //outputs
+ . data_out (data_out[i] )
+ );
+
+ end
+endgenerate
+
+
+endmodule
+
+/*********************************************************************
+ module: generic 32b register
+***********************************************************************/
+module gen_32b_reg (
+ //List of Inputs
+ cs,
+ we,
+ data_in,
+ reset_n,
+ clk,
+
+ //List of Outs
+ data_out
+ );
+
+ parameter RESET_DEFAULT = 32'h0;
+ input [3:0] we;
+ input cs;
+ input [31:0] data_in;
+ input reset_n;
+ input clk;
+ output [31:0] data_out;
+
+
+ reg [31:0] data_out;
+
+always @ (posedge clk or negedge reset_n) begin
+ if (reset_n == 1'b0) begin
+ data_out <= RESET_DEFAULT ;
+ end
+ else begin
+ if(cs && we[0]) data_out[7:0] <= data_in[7:0];
+ if(cs && we[1]) data_out[15:8] <= data_in[15:8];
+ if(cs && we[2]) data_out[23:16] <= data_in[23:16];
+ if(cs && we[3]) data_out[31:24] <= data_in[31:24];
+ end
+end
+
+
+endmodule
diff --git a/verilog/rtl/lib/reset_sync.sv b/verilog/rtl/lib/reset_sync.sv
new file mode 100644
index 0000000..d96c719
--- /dev/null
+++ b/verilog/rtl/lib/reset_sync.sv
@@ -0,0 +1,101 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Active low reset synchronization ////
+//// ////
+//// This file is part of the yifive cores project ////
+//// https://github.com/dineshannayya/yifive_r0.git ////
+//// http://www.opencores.org/cores/yifive/ ////
+//// ////
+//// Description: ////
+//// Synchronize the active low reset to destination clock ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// v0: June 17, 2021, Dinesh A ////
+//// Initial version ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+module reset_sync (
+ scan_mode ,
+ dclk , // Destination clock domain
+ arst_n , // active low async reset
+ srst_n
+ );
+
+parameter WIDTH = 1;
+
+input scan_mode ; // test mode
+input dclk ; // Destination clock
+input arst_n ; // Async Reset
+output srst_n ; // Sync Reset w.r.t dclk
+
+
+reg in_data_s ; // One Cycle sync
+reg in_data_2s ; // two Cycle sync
+
+assign srst_n = (scan_mode) ? arst_n : in_data_2s;
+
+always @(negedge arst_n or posedge dclk)
+begin
+ if(arst_n == 1'b0)
+ begin
+ in_data_s <= 1'b0;
+ in_data_2s <= 1'b0;
+ end
+ else
+ begin
+ in_data_s <= 1'b1;
+ in_data_2s <= in_data_s;
+ end
+end
+
+
+endmodule
diff --git a/verilog/rtl/lib/ser_inf_32b.sv b/verilog/rtl/lib/ser_inf_32b.sv
new file mode 100644
index 0000000..8228852
--- /dev/null
+++ b/verilog/rtl/lib/ser_inf_32b.sv
@@ -0,0 +1,121 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// ser_inf_32 ////
+//// ////
+//// This file is part of the mbist_ctrl cores project ////
+//// https://github.com/dineshannayya/mbist_ctrl.git ////
+//// ////
+//// Description ////
+//// This block manages the serial to Parallel conversion ////
+//// This block usefull for Bist SDI/SDO access ////
+//// Function: ////
+//// 1. When reg_wr=1, this block set shift=1 and shift ////
+//// reg_wdata serial through sdi for 32 cycles and ////
+//// asserts Reg Ack ////
+//// 2. When reg_rd=1, this block set shoft=1 and serial ////
+//// capture the sdo to reg_rdata for 32 cycles and ////
+//// asserts Reg Ack ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.0 - 20th Oct 2021, Dinesh A ////
+//// Initial integration ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+module ser_inf_32b
+ (
+
+ // Master Port
+ input logic rst_n , // Regular Reset signal
+ input logic clk , // System clock
+ input logic reg_wr , // Write Request
+ input logic reg_rd , // Read Request
+ input logic [31:0] reg_wdata , // data output
+ output logic [31:0] reg_rdata , // data input
+ output logic reg_ack , // acknowlegement
+
+ // Slave Port
+ output logic sdi , // Serial SDI
+ output logic shift , // Shift Signal
+ input logic sdo // Serial SDO
+
+ );
+
+
+ parameter IDLE = 1'b0;
+ parameter SHIFT_DATA = 1'b1;
+
+ logic state;
+ logic [5:0] bit_cnt;
+ logic [31:0] shift_data;
+
+
+always@(negedge rst_n or posedge clk)
+begin
+ if(rst_n == 0) begin
+ state <= IDLE;
+ reg_rdata <= 'h0;
+ reg_ack <= 1'b0;
+ sdi <= 1'b0;
+ bit_cnt <= 6'h0;
+ shift <= 'b0;
+ shift_data <= 32'h0;
+ end else begin
+ case(state)
+ IDLE: begin
+ reg_ack <= 1'b0;
+ bit_cnt <= 6'h0;
+ if(reg_wr) begin
+ shift <= 'b1;
+ shift_data <= reg_wdata;
+ state <= SHIFT_DATA;
+ end else if(reg_rd) begin
+ shift <= 'b1;
+ shift_data <= 'h0;
+ state <= SHIFT_DATA;
+ end
+ end
+ SHIFT_DATA: begin
+ shift_data <= {1'b0,shift_data[31:1]};
+ reg_rdata <= {sdo,reg_rdata[31:1]};
+ sdi <= shift_data[0];
+ if(bit_cnt < 31) begin
+ bit_cnt <= bit_cnt +1;
+ end else begin
+ reg_ack <= 1'b1;
+ shift <= 'b0;
+ state <= IDLE;
+ end
+ end
+ endcase
+ end
+end
+
+
+
+
+endmodule
diff --git a/verilog/rtl/lib/ser_shift.sv b/verilog/rtl/lib/ser_shift.sv
new file mode 100644
index 0000000..21ef9dc
--- /dev/null
+++ b/verilog/rtl/lib/ser_shift.sv
@@ -0,0 +1,76 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// ser_shift ////
+//// ////
+//// This file is part of the mbist_ctrl cores project ////
+//// https://github.com/dineshannayya/riscdunio.git ////
+//// ////
+//// Description ////
+//// This block manages the parallel to serial conversion ////
+//// This block usefull for Bist SDI/SDO access ////
+//// asserts Reg Ack ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.0 - 16th Dec 2021, Dinesh A ////
+//// Initial integration ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+module ser_shift
+ #(parameter WD = 32)
+ (
+
+ // Master Port
+ input logic rst_n , // Regular Reset signal
+ input logic clk , // System clock
+ input logic load , // load request
+ input logic shift , // shift
+ input logic [WD-1:0] load_data , // load data
+ input logic sdi , // sdi
+ output logic sdo // sdo
+
+
+ );
+
+logic [WD-1:0] shift_reg;
+
+always@(negedge rst_n or posedge clk)
+begin
+ if(rst_n == 0) begin
+ shift_reg <= 'h0;
+ end else if(load) begin
+ shift_reg <= load_data;
+ end else if(shift) begin
+ shift_reg <= {sdi,shift_reg[WD-1:1]};
+ end
+end
+
+assign sdo = shift_reg[0];
+
+
+
+endmodule
diff --git a/verilog/rtl/lib/sfifo.v b/verilog/rtl/lib/sfifo.v
new file mode 100644
index 0000000..b0ea8c1
--- /dev/null
+++ b/verilog/rtl/lib/sfifo.v
@@ -0,0 +1,77 @@
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Tubo 8051 cores common library Module ////
+//// ////
+//// This file is part of the Turbo 8051 cores project ////
+//// http://www.opencores.org/cores/turbo8051/ ////
+//// ////
+//// Description ////
+//// Turbo 8051 definitions. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : Mar 2, 2011 ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+module sfifo (QA,CLKA,CENA,AA,CLKB,CENB,AB,DB);
+
+parameter DW = 10; // Data Width
+parameter AW = 5; // Address Width
+parameter FW = 32; // FIFO DEPTH
+
+output [DW-1:0] QA;
+
+input CLKA;
+input CENA;
+input [AW-1:0] AA;
+input CLKB;
+input CENB;
+input [AW-1:0] AB;
+input [DW-1:0] DB;
+
+reg [DW-1:0] QA;
+reg [DW-1:0] ram [FW-1:0];
+
+always @ (posedge CLKB)
+begin
+ if (!CENB)
+ ram[AB] <= DB;
+end
+
+always @ (posedge CLKA)
+begin
+ if (!CENA)
+ QA <= ram[AA];
+end
+
+endmodule
diff --git a/verilog/rtl/lib/stat_counter.v b/verilog/rtl/lib/stat_counter.v
new file mode 100755
index 0000000..60c121f
--- /dev/null
+++ b/verilog/rtl/lib/stat_counter.v
@@ -0,0 +1,127 @@
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Tubo 8051 cores common library Module ////
+//// ////
+//// This file is part of the Turbo 8051 cores project ////
+//// http://www.opencores.org/cores/turbo8051/ ////
+//// ////
+//// Description ////
+//// Turbo 8051 definitions. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : Mar 2, 2011 ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+// -----------------------------------------------------------------------
+// Module Name : stat_counter.v
+// Company :
+// Creation date :
+// -----------------------------------------------------------------------
+// Description : This is the general purpose statistics counter.
+//
+//
+// References :
+// ------------------------------------------------------------------------
+
+//----------------- compiler directives -----------------------------------
+
+// ------------------------------------------------------------------------
+module stat_counter
+ (
+ // Clock and Reset Signals
+ sys_clk,
+ s_reset_n,
+
+ count_inc,
+ count_dec,
+
+ reg_sel,
+ reg_wr_data,
+ reg_wr,
+
+ cntr_intr,
+ cntrout
+
+
+ );
+
+parameter CWD = 1; // Counter Width
+ //-------------------- Parameters -------------------------------------
+
+ // ------------------- Clock and Reset Signals ------------------------
+ input sys_clk;
+ input s_reset_n;
+ input count_inc; // Counter Increment
+ input count_dec; // counter decrement, assuption does not under flow
+ input reg_sel;
+ input reg_wr;
+ input [CWD-1:0] reg_wr_data;
+ output cntr_intr;
+ output [CWD-1:0] cntrout;
+ // ------------------- Register Declarations --------------------------
+ reg [CWD-1:0] reg_trig_cntr;
+
+
+// ------------------- Logic Starts Here ----------------------------------
+
+
+
+always @ (posedge sys_clk or negedge s_reset_n)
+begin
+ if (s_reset_n == 1'b0) begin
+ reg_trig_cntr <= 'b0;
+ end
+ else begin
+ if (reg_sel && reg_wr) begin
+ reg_trig_cntr <= reg_wr_data;
+ end
+ else begin
+ if (count_inc && count_dec)
+ reg_trig_cntr <= reg_trig_cntr;
+ else if (count_inc)
+ reg_trig_cntr <= reg_trig_cntr + 1'b1;
+ else if (count_dec)
+ reg_trig_cntr <= reg_trig_cntr - 1'b1;
+ else
+ reg_trig_cntr <= reg_trig_cntr;
+ end
+ end
+end
+// only increment overflow is assumed
+// decrement underflow is not handled
+assign cntr_intr = ((reg_trig_cntr + 1) == 'h0 && count_inc) ;
+
+assign cntrout = reg_trig_cntr;
+
+endmodule // must_stat_counter
diff --git a/verilog/rtl/lib/sync_fifo.sv b/verilog/rtl/lib/sync_fifo.sv
new file mode 100644
index 0000000..464a26c
--- /dev/null
+++ b/verilog/rtl/lib/sync_fifo.sv
@@ -0,0 +1,167 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+/*********************************************************************
+
+ This file is part of the sdram controller project
+ http://www.opencores.org/cores/sdr_ctrl/
+ https://github.com/dineshannayya/yifive_r0.git
+
+ Description: SYNC FIFO
+ Parameters:
+ W : Width (integer)
+ D : Depth (integer, power of 2, 4 to 256)
+
+ To Do:
+ nothing
+
+ Author(s): Dinesh Annayya, dinesha@opencores.org
+
+ Copyright (C) 2000 Authors and OPENCORES.ORG
+
+ This source file may be used and distributed without
+ restriction provided that this copyright statement is not
+ removed from the file and that any derivative work contains
+ the original copyright notice and the associated disclaimer.
+
+ This source file is free software; you can redistribute it
+ and/or modify it under the terms of the GNU Lesser General
+ Public License as published by the Free Software Foundation;
+ either version 2.1 of the License, or (at your option) any
+later version.
+
+ This source is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied
+ warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ PURPOSE. See the GNU Lesser General Public License for more
+ details.
+
+ You should have received a copy of the GNU Lesser General
+ Public License along with this source; if not, download it
+ from http://www.opencores.org/lgpl.shtml
+
+*******************************************************************/
+
+
+module sync_fifo (clk,
+ reset_n,
+ wr_en,
+ wr_data,
+ full,
+ empty,
+ rd_en,
+ rd_data);
+
+ parameter W = 8;
+ parameter D = 4;
+
+ parameter AW = (D == 2) ? 1 :
+ (D == 4) ? 2 :
+ (D == 8) ? 3 :
+ (D == 16) ? 4 :
+ (D == 32) ? 5 :
+ (D == 64) ? 6 :
+ (D == 128) ? 7 :
+ (D == 256) ? 8 : 0;
+
+ output [W-1 : 0] rd_data;
+ input [W-1 : 0] wr_data;
+ input clk, reset_n, wr_en, rd_en;
+ output full, empty;
+
+ // synopsys translate_off
+
+ initial begin
+ if (AW == 0) begin
+ $display ("%m : ERROR!!! Fifo depth %d not in range 4 to 256", D);
+ end // if (AW == 0)
+ end // initial begin
+
+ // synopsys translate_on
+
+
+ reg [W-1 : 0] mem[D-1 : 0];
+ reg [AW-1 : 0] rd_ptr, wr_ptr;
+ reg full, empty;
+
+ wire [W-1 : 0] rd_data;
+
+ always @ (posedge clk or negedge reset_n)
+ if (reset_n == 1'b0) begin
+ wr_ptr <= {AW{1'b0}} ;
+ end
+ else begin
+ if (wr_en & !full) begin
+ wr_ptr <= wr_ptr + 1'b1 ;
+ end
+ end
+
+ always @ (posedge clk or negedge reset_n)
+ if (reset_n == 1'b0) begin
+ rd_ptr <= {AW{1'b0}} ;
+ end
+ else begin
+ if (rd_en & !empty) begin
+ rd_ptr <= rd_ptr + 1'b1 ;
+ end
+ end
+
+
+ always @ (posedge clk or negedge reset_n)
+ if (reset_n == 1'b0) begin
+ empty <= 1'b1 ;
+ end
+ else begin
+ empty <= (((wr_ptr - rd_ptr) == {{(AW-1){1'b0}}, 1'b1}) & rd_en & ~wr_en) ? 1'b1 :
+ ((wr_ptr == rd_ptr) & ~rd_en & wr_en) ? 1'b0 : empty ;
+ end
+
+ always @ (posedge clk or negedge reset_n)
+ if (reset_n == 1'b0) begin
+ full <= 1'b0 ;
+ end
+ else begin
+ full <= (((wr_ptr - rd_ptr) == {{(AW-1){1'b1}}, 1'b0}) & ~rd_en & wr_en) ? 1'b1 :
+ (((wr_ptr - rd_ptr) == {AW{1'b1}}) & rd_en & ~wr_en) ? 1'b0 : full ;
+ end
+
+ always @ (posedge clk)
+ if (wr_en)
+ mem[wr_ptr] <= wr_data;
+
+assign rd_data = mem[rd_ptr];
+
+
+// synopsys translate_off
+ always @(posedge clk) begin
+ if (wr_en && full) begin
+ $display("%m : Error! sfifo overflow!");
+ end
+ end
+
+ always @(posedge clk) begin
+ if (rd_en && empty) begin
+ $display("%m : error! sfifo underflow!");
+ end
+ end
+
+// synopsys translate_on
+//---------------------------------------
+
+endmodule
+
+
diff --git a/verilog/rtl/lib/sync_fifo2.sv b/verilog/rtl/lib/sync_fifo2.sv
new file mode 100755
index 0000000..f71ad30
--- /dev/null
+++ b/verilog/rtl/lib/sync_fifo2.sv
@@ -0,0 +1,222 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+/*********************************************************************
+
+ SYNC FIFO with empty,aempty,full,afull
+
+
+ Description: SYNC FIFO
+
+ To Do:
+ nothing
+
+ Author(s): Dinesh Annayya, dinesha@opencores.org
+
+ Copyright (C) 2000 Authors and OPENCORES.ORG
+
+ This source file may be used and distributed without
+ restriction provided that this copyright statement is not
+ removed from the file and that any derivative work contains
+ the original copyright notice and the associated disclaimer.
+
+ This source file is free software; you can redistribute it
+ and/or modify it under the terms of the GNU Lesser General
+ Public License as published by the Free Software Foundation;
+ either version 2.1 of the License, or (at your option) any
+later version.
+
+ This source is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied
+ warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ PURPOSE. See the GNU Lesser General Public License for more
+ details.
+
+ You should have received a copy of the GNU Lesser General
+ Public License along with this source; if not, download it
+ from http://www.opencores.org/lgpl.shtml
+
+*******************************************************************/
+
+//-------------------------------------------
+// sync FIFO
+//-----------------------------------------------
+//`timescale 1ns/1ps
+
+module sync_fifo2 (clk,
+ reset_n,
+ wr_en,
+ wr_data,
+ full,
+ afull,
+ rd_en,
+ empty,
+ aempty,
+ rd_data);
+
+ parameter W = 4'd8;
+ parameter DP = 3'd4;
+ parameter WR_FAST = 1'b1;
+ parameter RD_FAST = 1'b1;
+ parameter FULL_DP = DP;
+ parameter EMPTY_DP = 1'b0;
+
+ parameter AW = (DP == 2) ? 1 :
+ (DP == 4) ? 2 :
+ (DP == 8) ? 3 :
+ (DP == 16) ? 4 :
+ (DP == 32) ? 5 :
+ (DP == 64) ? 6 :
+ (DP == 128) ? 7 :
+ (DP == 256) ? 8 : 0;
+
+ output [W-1 : 0] rd_data;
+ input [W-1 : 0] wr_data;
+ input clk, reset_n, wr_en, rd_en;
+ output full, empty;
+ output afull, aempty; // about full and about to empty
+
+
+ // synopsys translate_off
+
+ initial begin
+ if (AW == 0) begin
+ $display ("%m : ERROR!!! Fifo depth %d not in range 2 to 256", DP);
+ end // if (AW == 0)
+ end // initial begin
+
+ // synopsys translate_on
+
+ reg [W-1 : 0] mem[DP-1 : 0];
+
+ /*********************** write side ************************/
+ reg [AW:0] wr_ptr;
+ reg full_q;
+ wire full_c;
+ wire afull_c;
+ wire [AW:0]wr_ptr_inc = wr_ptr + 1'b1;
+ wire [AW:0]wr_cnt = get_cnt(wr_ptr, rd_ptr);
+
+ assign full_c = (wr_cnt == FULL_DP) ? 1'b1 : 1'b0;
+ assign afull_c = (wr_cnt == FULL_DP-1) ? 1'b1 : 1'b0;
+
+
+ always @(posedge clk or negedge reset_n) begin
+ if (!reset_n) begin
+ wr_ptr <= 0;
+ full_q <= 0;
+ end
+ else if (wr_en) begin
+ wr_ptr <= wr_ptr_inc;
+ if (wr_cnt == (FULL_DP-1)) begin
+ full_q <= 1'b1;
+ end
+ end
+ else begin
+ if (full_q && (wr_cnt<FULL_DP)) begin
+ full_q <= 1'b0;
+ end
+ end
+ end
+
+ assign full = (WR_FAST == 1) ? full_c : full_q;
+ assign afull = afull_c;
+
+ always @(posedge clk) begin
+ if (wr_en) begin
+ mem[wr_ptr[AW-1:0]] <= wr_data;
+ end
+ end
+
+
+
+ /************************ read side *****************************/
+ reg [AW:0] rd_ptr;
+ reg empty_q;
+ wire empty_c;
+ wire aempty_c;
+ wire [AW:0] rd_ptr_inc = rd_ptr + 1'b1;
+ wire [AW:0] rd_cnt = get_cnt(wr_ptr, rd_ptr);
+
+ assign empty_c = (rd_cnt == 0) ? 1'b1 : 1'b0;
+ assign aempty_c = (rd_cnt == 1) ? 1'b1 : 1'b0;
+
+ always @(posedge clk or negedge reset_n) begin
+ if (!reset_n) begin
+ rd_ptr <= 0;
+ empty_q <= 1'b1;
+ end
+ else begin
+ if (rd_en) begin
+ rd_ptr <= rd_ptr_inc;
+ if (rd_cnt==(EMPTY_DP+1)) begin
+ empty_q <= 1'b1;
+ end
+ end
+ else begin
+ if (empty_q && (rd_cnt!=EMPTY_DP)) begin
+ empty_q <= 1'b0;
+ end
+ end
+ end
+ end
+
+ assign empty = (RD_FAST == 1) ? empty_c : empty_q;
+ assign aempty = aempty_c;
+
+ reg [W-1 : 0] rd_data_q;
+
+ wire [W-1 : 0] rd_data_c = mem[rd_ptr[AW-1:0]];
+
+
+ always @(posedge clk) begin
+ rd_data_q <= rd_data_c;
+ end
+ assign rd_data = (RD_FAST == 1) ? rd_data_c : rd_data_q;
+
+
+
+
+function [AW:0] get_cnt;
+input [AW:0] wr_ptr, rd_ptr;
+begin
+ if (wr_ptr >= rd_ptr) begin
+ get_cnt = (wr_ptr - rd_ptr);
+ end
+ else begin
+ get_cnt = DP*2 - (rd_ptr - wr_ptr);
+ end
+end
+endfunction
+
+// synopsys translate_off
+always @(posedge clk) begin
+ if (wr_en && full) begin
+ $display($time, "%m Error! afifo overflow!");
+ $stop;
+ end
+end
+
+always @(posedge clk) begin
+ if (rd_en && empty) begin
+ $display($time, "%m error! afifo underflow!");
+ $stop;
+ end
+end
+// synopsys translate_on
+
+endmodule
diff --git a/verilog/rtl/lib/sync_wbb.sv b/verilog/rtl/lib/sync_wbb.sv
new file mode 100644
index 0000000..e2cc794
--- /dev/null
+++ b/verilog/rtl/lib/sync_wbb.sv
@@ -0,0 +1,336 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// sync Wishbone Interface iBurst Enable and lack ////
+//// ////
+//// This file is part of the YIFive cores project ////
+//// http://www.opencores.org/cores/yifive/ ////
+//// ////
+//// Description ////
+//// This block does async Wishbone from one clock to other ////
+//// clock domain
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.1 - 25th Feb 2021, Dinesh A ////
+//// initial version ////
+//// 0.2 - 28th Feb 2021, Dinesh A ////
+//// reduced the response FIFO path depth to 2 as ////
+//// return path used by only read logic and read is ////
+//// blocking request and expect only one location will ////
+//// be used ////
+//// 0.3 - 20 Jan 2022, Dinesh A ////
+//// added wishbone burst mode. Additional signal added ////
+//// A. *bl - 10 Bit word Burst count, 1 - 1 DW(32 bit)////
+//// B. *lack - Last Burst ack ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+module sync_wbb
+ #(parameter AW = 32,
+ parameter BW = 4,
+ parameter BL = 10,
+ parameter DW = 32)
+ (
+
+ // Master Port
+ input logic rst_n , // Regular Reset signal
+ input logic clk_i , // System clock
+ input logic wbm_cyc_i , // strobe/request
+ input logic wbm_stb_i , // strobe/request
+ input logic [AW-1:0] wbm_adr_i , // address
+ input logic wbm_we_i , // write
+ input logic [DW-1:0] wbm_dat_i , // data output
+ input logic [BW-1:0] wbm_sel_i , // byte enable
+ input logic [3:0] wbm_tid_i ,
+ input logic [BL-1:0] wbm_bl_i , // Burst Count
+ input logic wbm_bry_i , // Burst Ready
+ output logic [DW-1:0] wbm_dat_o , // data input
+ output logic wbm_ack_o , // acknowlegement
+ output logic wbm_lack_o , // Last Burst access
+ output logic wbm_err_o , // error
+
+ // Slave Port
+ output logic wbs_cyc_o , // strobe/request
+ output logic wbs_stb_o , // strobe/request
+ output logic [AW-1:0] wbs_adr_o , // address
+ output logic wbs_we_o , // write
+ output logic [DW-1:0] wbs_dat_o , // data output
+ output logic [BW-1:0] wbs_sel_o , // byte enable
+ output logic [3:0] wbs_tid_o ,
+ output logic [BL-1:0] wbs_bl_o , // Burst Count
+ output logic wbs_bry_o , // Busrt WData Avialble Or Ready To accept Rdata
+ input logic [DW-1:0] wbs_dat_i , // data input
+ input logic wbs_ack_i , // acknowlegement
+ input logic wbs_lack_i , // Last Ack
+ input logic wbs_err_i // error
+
+ );
+
+
+
+parameter CFW = AW+DW+BW+BL+4+1 ; // COMMAND FIFO WIDTH
+parameter RFW = DW+1+1 ; // RESPONSE FIFO WIDTH
+
+parameter IDLE = 2'b00;
+parameter WRITE_DATA = 2'b01;
+parameter READ_DATA = 2'b10;
+
+
+//-------------------------------------------------
+// Master Interface
+// -------------------------------------------------
+logic m_cmd_wr_en ;
+logic [CFW-1:0] m_cmd_wr_data ;
+logic m_cmd_wr_full ;
+logic m_cmd_wr_afull ;
+
+logic m_resp_rd_empty ;
+logic m_resp_rd_aempty ;
+logic m_resp_rd_en ;
+logic [RFW-1:0] m_resp_rd_data ;
+logic [BL-1:0] m_bl_cnt ;
+logic [1:0] m_state ;
+
+// Master Write Interface
+
+
+
+assign m_cmd_wr_data = {wbm_adr_i,wbm_we_i,wbm_dat_i,wbm_sel_i,wbm_tid_i,wbm_bl_i};
+
+assign wbm_dat_o = m_resp_rd_data[DW-1:0];
+assign wbm_err_o = 'b0;
+
+always@(negedge rst_n or posedge clk_i)
+begin
+ if(rst_n == 0) begin
+ m_cmd_wr_en <= 'b0;
+ m_resp_rd_en <= 'b0;
+ m_state <= 'h0;
+ m_bl_cnt <= 'h0;
+ wbm_ack_o <= 'b0;
+ wbm_lack_o <= 'b0;
+ end else begin
+ case(m_state)
+ IDLE: begin
+ // Read DATA
+ // Make sure that FIFO is not overflow and there is no previous
+ // pending write + fifo is about to full
+ if(wbm_stb_i && !wbm_we_i && wbm_bry_i && !m_cmd_wr_full && !(m_cmd_wr_afull && m_cmd_wr_en) && !wbm_lack_o) begin
+ m_bl_cnt <= wbm_bl_i;
+ m_cmd_wr_en <= 'b1;
+ m_state <= READ_DATA;
+ end else if(wbm_stb_i && wbm_we_i && wbm_bry_i && !m_cmd_wr_full && !(m_cmd_wr_afull && m_cmd_wr_en) && !wbm_lack_o) begin
+ wbm_ack_o <= 'b1;
+ m_cmd_wr_en <= 'b1;
+ m_bl_cnt <= wbm_bl_i-1;
+ if(wbm_bl_i == 'h1) begin
+ wbm_lack_o <= 'b1;
+ m_state <= IDLE;
+ end else begin
+ m_bl_cnt <= wbm_bl_i-1;
+ m_state <= WRITE_DATA;
+ end
+ end else begin
+ m_resp_rd_en <= 'b0;
+ m_cmd_wr_en <= 'b0;
+ wbm_ack_o <= 'b0;
+ wbm_lack_o <= 'b0;
+ end
+ end
+
+ // Write next Transaction
+ WRITE_DATA: begin
+ if(m_cmd_wr_full != 1 && !(m_cmd_wr_afull && m_cmd_wr_en) && wbm_bry_i) begin
+ wbm_ack_o <= 'b1;
+ m_cmd_wr_en <= 'b1;
+ if(m_bl_cnt == 1) begin
+ wbm_lack_o <= 'b1;
+ m_state <= IDLE;
+ end else begin
+ m_bl_cnt <= m_bl_cnt-1;
+ end
+ end else begin
+ m_cmd_wr_en <= 'b0;
+ wbm_ack_o <= 'b0;
+ wbm_lack_o <= 'b0;
+ end
+ end
+
+ // Read Transaction
+ READ_DATA: begin
+ // Check Back to Back Ack and last Location case
+ if(((wbm_ack_o == 0 && m_resp_rd_empty != 1) ||
+ (wbm_ack_o == 1 && m_resp_rd_aempty != 1)) && wbm_bry_i) begin
+ m_resp_rd_en <= 'b1;
+ wbm_ack_o <= 'b1;
+ if(m_bl_cnt == 1) begin
+ wbm_lack_o <= 'b1;
+ m_state <= IDLE;
+ end else begin
+ m_bl_cnt <= m_bl_cnt-1;
+ end
+ end else begin
+ m_resp_rd_en <= 'b0;
+ m_cmd_wr_en <= 'b0;
+ wbm_ack_o <= 'b0;
+ wbm_lack_o <= 'b0;
+ end
+ end
+ endcase
+ end
+end
+
+
+//------------------------------
+// Slave Interface
+//-------------------------------
+
+logic [CFW-1:0] s_cmd_rd_data ;
+logic [CFW-1:0] s_cmd_rd_data_l ;
+logic s_cmd_rd_empty ;
+logic s_cmd_rd_aempty ;
+logic s_cmd_rd_en ;
+logic s_resp_wr_en ;
+logic [RFW-1:0] s_resp_wr_data ;
+logic s_resp_wr_full ;
+logic s_resp_wr_afull ;
+logic wbs_ack_f ;
+logic wbs_stb_l ;
+logic wbs_burst ;
+
+wire wbs_stb_pedge = (wbs_stb_l == 1'b0) && wbs_stb_o;
+
+
+always@(negedge rst_n or posedge clk_i)
+begin
+ if(rst_n == 0) begin
+ wbs_ack_f <= 1'b0;
+ wbs_stb_l <= 1'b0;
+ wbs_burst <= 'h0;
+ s_cmd_rd_data_l <= 'h0;
+ end else begin
+ wbs_ack_f <= wbs_lack_i;
+ wbs_stb_l <= wbs_stb_o;
+ if(s_cmd_rd_en)
+ s_cmd_rd_data_l <= s_cmd_rd_data;
+ if(wbs_stb_pedge && wbs_bl_o > 'h1)
+ wbs_burst <= 1'b1;
+ else if(wbs_lack_i)
+ wbs_burst <= 1'b0;
+ end
+end
+
+
+// Read Interface
+
+
+assign {wbs_adr_o,wbs_we_o,wbs_dat_o,wbs_sel_o,wbs_tid_o,wbs_bl_o} = (s_cmd_rd_empty) ? s_cmd_rd_data_l: s_cmd_rd_data;
+// All the downstream logic expect Stobe is getting de-asserted
+// atleast for 1 cycle after ack is generated
+assign wbs_stb_o = (wbs_burst) ? 1'b1 : ((wbs_ack_f) ? 1'b0 : (s_cmd_rd_empty) ? 1'b0: 1'b1);
+assign wbs_cyc_o = (wbs_burst) ? 1'b1 : ((wbs_ack_f) ? 1'b0 : (s_cmd_rd_empty) ? 1'b0: 1'b1);
+
+// Generate bust ready only we have space inside response fifo
+// In Write Phase,
+// Generate burst ready, only when we have wdata & space in response fifo
+// In Read Phase
+// Generate burst ready, only when space in response fifo
+//
+assign wbs_bry_o = (wbs_we_o) ? ((s_cmd_rd_empty || (s_cmd_rd_en && s_cmd_rd_aempty)) ? 1'b0: 1'b1) :
+ (s_resp_wr_full || (s_resp_wr_en && s_resp_wr_afull)) ? 1'b0: 1'b1;
+
+// During Write phase, cmd fifo will have wdata, so dequeue for every ack
+// During Read Phase, cmd fifo will be written only one time, hold the bus
+// untill last ack received
+assign s_cmd_rd_en = (wbs_stb_o && wbs_we_o) ? wbs_ack_i: wbs_lack_i;
+
+// Write Interface
+// response send only for read logic
+assign s_resp_wr_en = wbs_stb_o & (!wbs_we_o) & wbs_ack_i ;
+assign s_resp_wr_data = {wbs_err_i,wbs_lack_i,wbs_dat_i};
+
+sync_fifo2 #(.W(CFW), .DP(4),.WR_FAST(1), .RD_FAST(1)) u_cmd_if (
+ // Sync w.r.t WR clock
+ .clk (clk_i ),
+ .reset_n (rst_n ),
+ .wr_en (m_cmd_wr_en ),
+ .wr_data (m_cmd_wr_data ),
+ .full (m_cmd_wr_full ),
+ .afull (m_cmd_wr_afull ),
+
+ // Sync w.r.t RD Clock
+ .rd_en (s_cmd_rd_en ),
+ .empty (s_cmd_rd_empty ), // sync'ed to rd_clk
+ .aempty (s_cmd_rd_aempty ), // sync'ed to rd_clk
+ .rd_data (s_cmd_rd_data )
+ );
+
+
+// Response used only for read path,
+// As cache access will be busrt of 512 location, To
+// support continous ack, depth is increase to 8 location
+sync_fifo2 #(.W(RFW), .DP(4), .WR_FAST(1), .RD_FAST(1)) u_resp_if (
+ // Sync w.r.t WR clock
+ .clk (clk_i ),
+ .reset_n (rst_n ),
+ .wr_en (s_resp_wr_en ),
+ .wr_data (s_resp_wr_data ),
+ .full (s_resp_wr_full ),
+ .afull (s_resp_wr_afull ),
+
+ // Sync w.r.t RD Clock
+ .rd_en (m_resp_rd_en ),
+ .empty (m_resp_rd_empty ), // sync'ed to rd_clk
+ .aempty (m_resp_rd_aempty ), // sync'ed to rd_clk
+ .rd_data (m_resp_rd_data )
+ );
+
+
+
+endmodule
diff --git a/verilog/rtl/lib/toggle_sync.v b/verilog/rtl/lib/toggle_sync.v
new file mode 100755
index 0000000..1280374
--- /dev/null
+++ b/verilog/rtl/lib/toggle_sync.v
@@ -0,0 +1,93 @@
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Tubo 8051 cores common library Module ////
+//// ////
+//// This file is part of the Turbo 8051 cores project ////
+//// http://www.opencores.org/cores/turbo8051/ ////
+//// ////
+//// Description ////
+//// Turbo 8051 definitions. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : Mar 2, 2011 ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+module toggle_sync (in_clk,
+ in_rst_n,
+ out_clk,
+ out_rst_n,
+ in,
+ out_req,
+ out_ack);
+
+ output out_req;
+ input in_clk, in_rst_n, out_clk, out_rst_n, in, out_ack;
+
+ reg in_flag, out_flag;
+
+ always @ (posedge in_clk or negedge in_rst_n)
+ if (~in_rst_n)
+ in_flag <= 1'b0;
+ else
+ in_flag <= (in) ? ~in_flag : in_flag;
+
+ always @ (posedge out_clk or negedge out_rst_n)
+ if (~out_rst_n)
+ out_flag <= 1'b0;
+ else
+ out_flag <= (out_ack & out_req) ? ~out_flag : out_flag;
+
+
+ wire raw_req_pend;
+
+ assign raw_req_pend = in_flag ^ out_flag;
+
+ reg s1_out_req, s2_out_req;
+
+ always @ (posedge out_clk or negedge out_rst_n)
+ if (~out_rst_n) begin
+ s1_out_req <= 1'b0;
+ s2_out_req <= 1'b0;
+ end // if (~out_rst_n)
+ else begin
+ s1_out_req <= ~out_ack & raw_req_pend;
+ s2_out_req <= ~out_ack & s1_out_req;
+ end // else: !if(~out_rst_n)
+
+ wire out_req;
+
+ assign out_req = s2_out_req;
+
+endmodule // toggle_sync
+
diff --git a/verilog/rtl/lib/wb_arb.sv b/verilog/rtl/lib/wb_arb.sv
new file mode 100644
index 0000000..0ad8bbf
--- /dev/null
+++ b/verilog/rtl/lib/wb_arb.sv
@@ -0,0 +1,135 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Wishbone Arbitor ////
+//// ////
+//// This file is part of the YIFive cores project ////
+//// https://github.com/dineshannayya/yifive_r0.git ////
+//// http://www.opencores.org/cores/yifive/ ////
+//// ////
+//// Description ////
+//// This block implement simple round robine request ////
+// arbitor for wishbone interface. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.1 - 12th June 2021, Dinesh A ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+
+module wb_arb(clk, rstn, req, gnt);
+
+input clk;
+input rstn;
+input [2:0] req; // Req input
+output [1:0] gnt; // Grant output
+
+///////////////////////////////////////////////////////////////////////
+//
+// Parameters
+//
+
+
+parameter [1:0]
+ grant0 = 3'h0,
+ grant1 = 3'h1,
+ grant2 = 3'h2;
+
+///////////////////////////////////////////////////////////////////////
+// Local Registers and Wires
+//////////////////////////////////////////////////////////////////////
+
+reg [1:0] state, next_state;
+
+///////////////////////////////////////////////////////////////////////
+// Misc Logic
+//////////////////////////////////////////////////////////////////////
+
+assign gnt = state;
+
+always@(posedge clk or negedge rstn)
+ if(!rstn) state <= grant0;
+ else state <= next_state;
+
+///////////////////////////////////////////////////////////////////////
+//
+// Next State Logic
+// - implements round robin arbitration algorithm
+// - switches grant if current req is dropped or next is asserted
+// - parks at last grant
+//////////////////////////////////////////////////////////////////////
+
+always_comb
+ begin
+ next_state = state; // Default Keep State
+ case(state)
+ grant0:
+ // if this req is dropped or next is asserted, check for other req's
+ if(!req[0] ) begin
+ if(req[1]) next_state = grant1;
+ else if(req[2]) next_state = grant2;
+ end
+ grant1:
+ // if this req is dropped or next is asserted, check for other req's
+ if(!req[1] ) begin
+ if(req[2]) next_state = grant2;
+ else if(req[0]) next_state = grant0;
+ end
+ grant2:
+ // if this req is dropped or next is asserted, check for other req's
+ if(!req[2] ) begin
+ if(req[0]) next_state = grant0;
+ else if(req[1]) next_state = grant1;
+ end
+ endcase
+ end
+
+endmodule
+
diff --git a/verilog/rtl/lib/wb_crossbar.v b/verilog/rtl/lib/wb_crossbar.v
new file mode 100644
index 0000000..07aeb3e
--- /dev/null
+++ b/verilog/rtl/lib/wb_crossbar.v
@@ -0,0 +1,384 @@
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Tubo 8051 cores common library Module ////
+//// ////
+//// This file is part of the Turbo 8051 cores project ////
+//// http://www.opencores.org/cores/turbo8051/ ////
+//// ////
+//// Description ////
+//// Turbo 8051 definitions. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : Mar 2, 2011 ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+/**********************************************
+ Web-bone cross bar M-Master By S-Slave
+**********************************************/
+
+module wb_crossbar (
+
+ rst_n ,
+ clk ,
+
+
+ // Master Interface Signal
+ wbd_taddr_master ,
+ wbd_din_master ,
+ wbd_dout_master ,
+ wbd_adr_master ,
+ wbd_be_master ,
+ wbd_we_master ,
+ wbd_ack_master ,
+ wbd_stb_master ,
+ wbd_cyc_master ,
+ wbd_err_master ,
+ wbd_rty_master ,
+
+ // Slave Interface Signal
+ wbd_din_slave ,
+ wbd_dout_slave ,
+ wbd_adr_slave ,
+ wbd_be_slave ,
+ wbd_we_slave ,
+ wbd_ack_slave ,
+ wbd_stb_slave ,
+ wbd_cyc_slave ,
+ wbd_err_slave ,
+ wbd_rty_slave
+ );
+
+parameter WB_SLAVE = 4 ;
+parameter WB_MASTER = 4 ;
+
+parameter D_WD = 16; // Data Width
+parameter BE_WD = 2; // Byte Enable
+parameter ADR_WD = 28; // Address Width
+parameter TAR_WD = 4; // Target Width
+
+input clk; // CLK_I The clock input [CLK_I] coordinates all activities
+ // for the internal logic within the WISHBONE interconnect.
+ // All WISHBONE output signals are registered at the
+ // rising edge of [CLK_I].
+ // All WISHBONE input signals must be stable before the
+ // rising edge of [CLK_I].
+input rst_n; // RST_I The reset input [RST_I] forces the WISHBONE interface
+ // to restart. Furthermore, all internal self-starting state
+ // machines will be forced into an initial state.
+
+input [(WB_MASTER *TAR_WD)-1:0] wbd_taddr_master; // target address from master
+input [WB_MASTER-1:0] wbd_stb_master;
+ // STB_O The strobe output [STB_O] indicates a valid data
+ // transfer cycle. It is used to qualify various other signals
+ // on the interface such as [SEL_O(7..0)]. The SLAVE must
+ // assert either the [ACK_I], [ERR_I] or [RTY_I] signals in
+ // response to every assertion of the [STB_O] signal.
+output [WB_SLAVE-1:0] wbd_stb_slave;
+ // STB_O The strobe output [STB_O] indicates a valid data
+ // transfer cycle. It is used to qualify various other signals
+ // on the interface such as [SEL_O(7..0)]. The SLAVE must
+ // assert either the [ACK_I], [ERR_I] or [RTY_I] signals in
+ // response to every assertion of the [STB_O] signal.
+
+input [WB_MASTER-1:0] wbd_we_master;
+ // WE_O The write enable output [WE_O] indicates whether the
+ // current local bus cycle is a READ or WRITE cycle. The
+ // signal is negated during READ cycles, and is asserted
+ // during WRITE cycles.
+output [WB_SLAVE-1:0] wbd_we_slave;
+ // WE_O The write enable output [WE_O] indicates whether the
+ // current local bus cycle is a READ or WRITE cycle. The
+ // signal is negated during READ cycles, and is asserted
+ // during WRITE cycles.
+
+output [WB_MASTER-1:0] wbd_ack_master;
+ // The acknowledge input [ACK_I], when asserted,
+ // indicates the termination of a normal bus cycle.
+ // Also see the [ERR_I] and [RTY_I] signal descriptions.
+input [WB_SLAVE-1:0] wbd_ack_slave;
+ // The acknowledge input [ACK_I], when asserted,
+ // indicates the termination of a normal bus cycle.
+ // Also see the [ERR_I] and [RTY_I] signal descriptions.
+
+input [(WB_MASTER *ADR_WD)-1:0] wbd_adr_master;
+ // The address output array [ADR_O(63..0)] is used
+ // to pass a binary address, with the most significant
+ // address bit at the higher numbered end of the signal array.
+ // The lower array boundary is specific to the data port size.
+ // The higher array boundary is core-specific.
+ // In some cases (such as FIFO interfaces)
+ // the array may not be present on the interface.
+
+output [(WB_SLAVE *ADR_WD)-1:0] wbd_adr_slave;
+ // The address output array [ADR_O(63..0)] is used
+ // to pass a binary address, with the most significant
+ // address bit at the higher numbered end of the signal array.
+ // The lower array boundary is specific to the data port size.
+ // The higher array boundary is core-specific.
+ // In some cases (such as FIFO interfaces)
+ // the array may not be present on the interface.
+
+input [(WB_MASTER * BE_WD)-1:0] wbd_be_master; // Byte Enable
+ // SEL_O(7..0) The select output array [SEL_O(7..0)] indicates
+ // where valid data is expected on the [DAT_I(63..0)] signal
+ // array during READ cycles, and where it is placed on the
+ // [DAT_O(63..0)] signal array during WRITE cycles.
+ // Also see the [DAT_I(63..0)], [DAT_O(63..0)] and [STB_O]
+ // signal descriptions.
+output [(WB_SLAVE * BE_WD)-1:0] wbd_be_slave; // Byte Enable
+ // SEL_O(7..0) The select output array [SEL_O(7..0)] indicates
+ // where valid data is expected on the [DAT_I(63..0)] signal
+ // array during READ cycles, and where it is placed on the
+ // [DAT_O(63..0)] signal array during WRITE cycles.
+ // Also see the [DAT_I(63..0)], [DAT_O(63..0)] and [STB_O]
+ // signal descriptions.
+
+input [WB_SLAVE -1:0] wbd_cyc_master;
+ // CYC_O The cycle output [CYC_O], when asserted,
+ // indicates that a valid bus cycle is in progress.
+ // The signal is asserted for the duration of all bus cycles.
+ // For example, during a BLOCK transfer cycle there can be
+ // multiple data transfers. The [CYC_O] signal is asserted
+ // during the first data transfer, and remains asserted
+ // until the last data transfer. The [CYC_O] signal is useful
+ // for interfaces with multi-port interfaces
+ // (such as dual port memories). In these cases,
+ // the [CYC_O] signal requests use of a common bus from an
+ // arbiter. Once the arbiter grants the bus to the MASTER,
+ // it is held until [CYC_O] is negated.
+output [WB_SLAVE -1:0] wbd_cyc_slave;
+ // CYC_O The cycle output [CYC_O], when asserted,
+ // indicates that a valid bus cycle is in progress.
+ // The signal is asserted for the duration of all bus cycles.
+ // For example, during a BLOCK transfer cycle there can be
+ // multiple data transfers. The [CYC_O] signal is asserted
+ // during the first data transfer, and remains asserted
+ // until the last data transfer. The [CYC_O] signal is useful
+ // for interfaces with multi-port interfaces
+ // (such as dual port memories). In these cases,
+ // the [CYC_O] signal requests use of a common bus from an
+ // arbiter. Once the arbiter grants the bus to the MASTER,
+ // it is held until [CYC_O] is negated.
+
+input [(WB_MASTER * D_WD)-1:0] wbd_din_master;
+ // DAT_I(63..0) The data input array [DAT_I(63..0)] is
+ // used to pass binary data. The array boundaries are
+ // determined by the port size. Also see the [DAT_O(63..0)]
+ // and [SEL_O(7..0)] signal descriptions.
+
+output [(WB_SLAVE * D_WD)-1:0] wbd_din_slave;
+ // DAT_I(63..0) The data input array [DAT_I(63..0)] is
+ // used to pass binary data. The array boundaries are
+ // determined by the port size. Also see the [DAT_O(63..0)]
+ // and [SEL_O(7..0)] signal descriptions.
+
+output [(WB_MASTER * D_WD)-1:0] wbd_dout_master;
+ // DAT_O(63..0) The data output array [DAT_O(63..0)] is
+ // used to pass binary data. The array boundaries are
+ // determined by the port size. Also see the [DAT_I(63..0)]
+ // and [SEL_O(7..0)] signal descriptions.
+input [(WB_SLAVE * D_WD)-1:0] wbd_dout_slave;
+ // DAT_O(63..0) The data output array [DAT_O(63..0)] is
+ // used to pass binary data. The array boundaries are
+ // determined by the port size. Also see the [DAT_I(63..0)]
+ // and [SEL_O(7..0)] signal descriptions.
+
+output [WB_MASTER -1:0] wbd_err_master;
+ // ERR_I The error input [ERR_I] indicates an abnormal
+ // cycle termination. The source of the error, and the
+ // response generated by the MASTER is defined by the IP core
+ // supplier in the WISHBONE DATASHEET. Also see the [ACK_I]
+ // and [RTY_I] signal descriptions.
+input [WB_SLAVE -1:0] wbd_err_slave;
+ // ERR_I The error input [ERR_I] indicates an abnormal
+ // cycle termination. The source of the error, and the
+ // response generated by the MASTER is defined by the IP core
+ // supplier in the WISHBONE DATASHEET. Also see the [ACK_I]
+ // and [RTY_I] signal descriptions.
+
+output [WB_MASTER -1:0] wbd_rty_master;
+ // RTY_I The retry input [RTY_I] indicates that the indicates
+ // that the interface is not ready to accept or send data, and
+ // that the cycle should be retried. When and how the cycle is
+ // retried is defined by the IP core supplier in the WISHBONE
+ // DATASHEET. Also see the [ERR_I] and [RTY_I] signal
+ // descriptions.
+input [WB_SLAVE -1:0] wbd_rty_slave;
+ // RTY_I The retry input [RTY_I] indicates that the indicates
+ // that the interface is not ready to accept or send data, and
+ // that the cycle should be retried. When and how the cycle is
+ // retried is defined by the IP core supplier in the WISHBONE
+ // DATASHEET. Also see the [ERR_I] and [RTY_I] signal
+ // descriptions.
+
+
+reg [WB_MASTER-1:0] wbd_ack_master;
+reg [WB_MASTER-1:0] wbd_err_master;
+reg [WB_MASTER-1:0] wbd_rty_master;
+
+
+reg [WB_MASTER-1:0] master_busy; // master busy flag
+reg [WB_SLAVE-1:0] slave_busy; // slave busy flag
+reg [TAR_WD -1:0] master_mx_id[WB_MASTER-1:0];
+reg [TAR_WD -1:0] slave_mx_id [WB_SLAVE-1:0];
+
+reg [TAR_WD-1 :0] cur_target_id;
+wire [TAR_WD-1:0] wbd_taddr_master_t[WB_MASTER:0]; // target address from master
+wire [D_WD-1:0] wbd_din_master_t[WB_MASTER-1:0]; // target address from master
+reg [D_WD-1:0] wbd_dout_master_t[WB_MASTER-1:0]; // target address from master
+wire [ADR_WD-1:0] wbd_adr_master_t[WB_MASTER-1:0]; // target address from master
+wire [BE_WD-1:0] wbd_be_master_t[WB_MASTER-1:0]; // target address from master
+
+
+reg [WB_SLAVE-1:0] wbd_stb_slave;
+reg [WB_SLAVE-1:0] wbd_we_slave;
+reg [WB_SLAVE-1:0] wbd_cyc_slave;
+wire [D_WD-1:0] wbd_dout_slave_t[WB_SLAVE-1:0]; // target data towards master
+
+
+reg [D_WD-1:0] wbd_din_slave_t[WB_SLAVE-1:0]; // target address from master
+reg [ADR_WD-1:0] wbd_adr_slave_t[WB_SLAVE-1:0]; // target address from master
+reg [BE_WD-1:0] wbd_be_slave_t[WB_SLAVE-1:0]; // target address from master
+
+integer i,k,l;
+
+
+/**********************************************************
+ Re-Arraging the array in seperate two dimensional information
+***********************************************************/
+
+genvar j,m;
+generate
+
+ // Connect the Master Mux
+ for(j=0; j < WB_MASTER ; j = j + 1) begin : master_expand
+ assign wbd_taddr_master_t[j] = wbd_taddr_master[((j+1)*TAR_WD)-1:j * TAR_WD];
+ assign wbd_din_master_t[j] = wbd_din_master[((j+1)*D_WD)-1:j * D_WD];
+ assign wbd_adr_master_t[j] = wbd_adr_master[((j+1)*ADR_WD)-1:j * ADR_WD];
+ assign wbd_be_master_t[j] = wbd_be_master[((j+1)*BE_WD)-1:j * BE_WD];
+
+ assign wbd_dout_master[((j+1)*D_WD)-1:j * D_WD] = wbd_dout_master_t[j];
+ end
+
+ // Connect the Slave Mux
+ for(m=0; m < WB_SLAVE ; m = m + 1) begin : slave_expand
+ assign wbd_din_slave[((m+1)*D_WD)-1:m * D_WD] = wbd_din_slave_t[m];
+ assign wbd_adr_slave[((m+1)*ADR_WD)-1:m * ADR_WD] = wbd_adr_slave_t[m];
+ assign wbd_be_slave[((m+1)*BE_WD)-1:m * BE_WD] = wbd_be_slave_t[m];
+
+ assign wbd_dout_slave_t[m] = wbd_dout_slave[((m+1)*D_WD)-1:m * D_WD];
+
+ end
+endgenerate
+
+always @* begin
+ for(k = 0; k < WB_MASTER; k = k + 1) begin
+ if(master_busy[k] == 1) begin
+ wbd_dout_master_t[k] = wbd_dout_slave_t[master_mx_id[k]];
+ wbd_ack_master[k] = wbd_ack_slave[master_mx_id[k]];
+ wbd_err_master[k] = wbd_err_slave[master_mx_id[k]];
+ wbd_rty_master[k] = wbd_rty_slave[master_mx_id[k]];
+ end else begin
+ wbd_dout_master_t[k] = 0;
+ wbd_ack_master[k] = 0;
+ wbd_err_master[k] = 0;
+ wbd_rty_master[k] = 0;
+ end
+ end
+ for(l = 0; l < WB_SLAVE; l = l + 1) begin
+ if(slave_busy[l] == 1) begin
+ wbd_din_slave_t[l] = wbd_din_master_t[slave_mx_id[l]];
+ wbd_adr_slave_t[l] = wbd_adr_master_t[slave_mx_id[l]];
+ wbd_be_slave_t[l] = wbd_be_master_t[slave_mx_id[l]];
+ wbd_stb_slave[l] = wbd_stb_master[slave_mx_id[l]];
+ wbd_we_slave[l] = wbd_we_master[slave_mx_id[l]];
+ wbd_cyc_slave[l] = wbd_cyc_master[slave_mx_id[l]];
+ end else begin
+ wbd_din_slave_t[l] = 0;
+ wbd_adr_slave_t[l] = 0;
+ wbd_be_slave_t[l] = 0;
+ wbd_stb_slave[l] = 0;
+ wbd_we_slave[l] = 0;
+ wbd_cyc_slave[l] = 0;
+ end
+ end
+end
+
+/*******************************************************
+ Parsing through the master and deciding on mux connectio
+ Step-1: analysis the master from 0 to total master
+ Step-2: If the previously master is not busy,
+ Then check for any new request from the master and
+ check corresponding slave is free or not. If there is
+ master request and requesting slave is free.
+ Then set the master max id to slave id &
+ requesting slave to master number & set the master
+ and slave busy flag
+ Step-3: If the previous state of master is busy and bus-cycle
+ is de-asserted, then reset the master and corresponding
+ slave busy flag
+
+*********************************************************/
+
+always @(negedge rst_n or posedge clk) begin
+ if(rst_n == 0) begin
+ master_busy = 0;
+ slave_busy = 0;
+ cur_target_id = 0;
+
+ end
+ else begin
+ for(i = 0; i < WB_MASTER; i = i + 1) begin
+ cur_target_id = wbd_taddr_master_t[i];
+ if(master_busy[i] == 0) begin
+ if(wbd_stb_master[i] & slave_busy[cur_target_id] == 0) begin
+ master_mx_id[i] <= cur_target_id;
+ slave_mx_id [cur_target_id] = i;
+ slave_busy[cur_target_id] = 1;
+ master_busy[i] = 1;
+ // synopsys translate_off
+ // $display("%m:%t: Locking Master : %d with Slave : %d",$time,i,cur_target_id);
+ // synopsys translate_on
+ end
+ end else if(wbd_cyc_master[i] == 0) begin
+ master_busy[i] = 0;
+ slave_busy[cur_target_id] = 0;
+ end
+ end
+ end
+end
+
+
+
+endmodule
diff --git a/verilog/rtl/lib/wb_interface.v b/verilog/rtl/lib/wb_interface.v
new file mode 100644
index 0000000..f25b147
--- /dev/null
+++ b/verilog/rtl/lib/wb_interface.v
@@ -0,0 +1,404 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// yifive common library Module ////
+//// ////
+//// This file is part of the yifive cores project ////
+//// https://github.com/dineshannayya/yifive_r0.git ////
+//// http://www.opencores.org/cores/yifive/ ////
+//// ////
+//// Description: ////
+//// This module does the DMA to wishbone I/f ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// v0: Nov 26, 2016, Dinesh A ////
+//// This files copied from my open core ////
+//// turbo8051 project ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+module wb_interface (
+ rst ,
+ clk ,
+
+ dma_req_i ,
+ dma_write_i ,
+ dma_addr_i ,
+ dma_length_i ,
+ dma_ack_o ,
+ dma_done_o ,
+
+ dma_start_o ,
+ dma_wr_o ,
+ dma_rd_o ,
+ dma_last_o ,
+ dma_wdata_i ,
+ dma_rdata_o ,
+
+ // external memory
+ wbd_dat_i ,
+ wbd_dat_o ,
+ wbd_adr_o ,
+ wbd_be_o ,
+ wbd_we_o ,
+ wbd_ack_i ,
+ wbd_stb_o ,
+ wbd_cyc_o ,
+ wbd_err_i
+
+
+ );
+
+
+
+input rst ;
+input clk ;
+
+input dma_req_i ;
+input dma_write_i ;
+input [25:0] dma_addr_i ;
+input [7:0] dma_length_i ;
+output dma_ack_o ;
+output dma_done_o ; // indicates end of DMA transaction
+
+output dma_start_o ;
+output dma_wr_o ;
+output dma_rd_o ;
+output dma_last_o ;
+input [31:0] dma_wdata_i ;
+output [31:0] dma_rdata_o ;
+
+//--------------------------------
+// WB interface
+//--------------------------------
+input [31:0] wbd_dat_i ; // data input
+output [31:0] wbd_dat_o ; // data output
+output [23:0] wbd_adr_o ; // address
+output [3:0] wbd_be_o ; // byte enable
+output wbd_we_o ; // write
+input wbd_ack_i ; // acknowlegement
+output wbd_stb_o ; // strobe/request
+output wbd_cyc_o ; // wb cycle
+input wbd_err_i ; // we error
+
+//------------------------------------
+// Reg Declaration
+//--------------------------------
+reg [2:0] state ;
+reg [2:0] state_d ;
+reg [7:0] preq_len ; // pending request length in bytes
+reg wbd_we_o ; // westbone write req
+reg [23:0] wbd_adr_o ; // westnone address
+reg dma_ack_o ; // dma ack
+reg [7:0] twbtrans ; // total westbone transaction
+reg dma_wr_o ; // dma write request
+reg dma_rd_o ; // dma read request
+reg [31:0] temp_data ; // temp holding data
+reg [1:0] be_sof ; // Byte enable starting alignment
+reg [31:0] wbd_dat_o ; // westbone data out
+reg [3:0] wbd_be_o ; // west bone byte enable
+reg [31:0] dma_rdata_o ; // dma read data
+reg wbd_stb_o ;
+reg dma_start_o ; // dma first transfer
+reg dma_last_o ; // dma last transfer
+
+parameter WB_IDLE = 3'b000;
+parameter WB_REQ = 3'b001;
+parameter WB_WR_PHASE = 3'b010;
+parameter WB_RD_PHASE_SOF = 3'b011;
+parameter WB_RD_PHASE_CONT = 3'b100;
+
+assign dma_done_o = (state == WB_IDLE) && (state_d != WB_IDLE);
+
+always @(posedge rst or posedge clk)
+begin
+ if(rst) begin
+ state <= WB_IDLE;
+ state_d <= WB_IDLE;
+ wbd_we_o <= 0;
+ wbd_adr_o <= 0;
+ preq_len <= 0;
+ dma_ack_o <= 0;
+ twbtrans <= 0;
+ dma_wr_o <= 0;
+ dma_rd_o <= 0;
+ temp_data <= 0;
+ be_sof <= 0;
+ wbd_dat_o <= 0;
+ wbd_be_o <= 0;
+ dma_rdata_o <= 0;
+ wbd_stb_o <= 0;
+ dma_start_o <= 0;
+ dma_last_o <= 0;
+ end
+ else begin
+ state_d <= state;
+ case(state)
+ WB_IDLE :
+ begin
+ if(dma_req_i)
+ begin
+ dma_ack_o <= 1;
+ wbd_we_o <= dma_write_i;
+ wbd_adr_o <= dma_addr_i[25:2];
+ be_sof <= dma_addr_i[1] << 1 + dma_addr_i[0];
+ preq_len <= dma_length_i;
+ // total wb transfer
+ twbtrans <= dma_length_i[7:2] +
+ |(dma_length_i[1:0]) +
+ |(dma_addr_i[1:0]);
+ state <= WB_REQ;
+ end
+ dma_wr_o <= 0;
+ dma_rd_o <= 0;
+ wbd_stb_o <= 0;
+ dma_start_o <= 0;
+ end
+ WB_REQ :
+ begin
+ dma_ack_o <= 0;
+ wbd_stb_o <= 1;
+ if(wbd_we_o) begin
+ dma_wr_o <= 1;
+ dma_start_o <= 1;
+ temp_data <= dma_wdata_i;
+ if(be_sof == 0) begin
+ wbd_dat_o <= dma_wdata_i;
+ wbd_be_o <= 4'b1111;
+ preq_len <= preq_len - 4;
+ end
+ else if(be_sof == 1) begin
+ wbd_dat_o <= {dma_wdata_i[23:0],8'h0};
+ wbd_be_o <= 4'b1110;
+ preq_len <= preq_len - 3;
+ end
+ else if(be_sof == 2) begin
+ wbd_dat_o <= {dma_wdata_i[15:0],16'h0};
+ wbd_be_o <= 4'b1100;
+ preq_len <= preq_len - 2;
+ end
+ else begin
+ wbd_dat_o <= {dma_wdata_i[7:0],23'h0};
+ wbd_be_o <= 4'b1000;
+ preq_len <= preq_len - 1;
+ end
+ twbtrans <= twbtrans -1;
+ state <= WB_WR_PHASE;
+ if(twbtrans == 1)
+ dma_last_o <= 1;
+ end
+ else begin
+ state <= WB_RD_PHASE_SOF;
+ end
+ end
+ WB_WR_PHASE :
+ begin
+ dma_start_o <= 0;
+ if(wbd_ack_i) begin
+ if(twbtrans == 1)
+ dma_last_o <= 1;
+ else
+ dma_last_o <= 0;
+ if(twbtrans > 0) begin
+ temp_data <= dma_wdata_i;
+ twbtrans <= twbtrans -1;
+ if(be_sof == 0) begin
+ wbd_dat_o <= dma_wdata_i;
+ end
+ else if(be_sof == 1) begin
+ wbd_dat_o <= {dma_wdata_i[23:0],temp_data[31:24]};
+ end
+ else if(be_sof == 2) begin
+ wbd_dat_o <= {dma_wdata_i[15:0],temp_data[31:16]};
+ end
+ else begin
+ wbd_dat_o <= {dma_wdata_i[7:0],temp_data[31:8]};
+ end
+
+ if(twbtrans > 1) begin // If the Pending Transfer is more than 1
+ dma_wr_o <= 1;
+ wbd_be_o <= 4'b1111;
+ preq_len <= preq_len - 4;
+ end
+ else begin // for last write access
+ wbd_be_o <= preq_len[1:0] == 2'b00 ? 4'b1111:
+ preq_len[1:0] == 2'b01 ? 4'b0001:
+ preq_len[1:0] == 2'b10 ? 4'b0011: 4'b0111;
+
+ case({be_sof[1:0],preq_len[1:0]})
+ // Start alignment = 0
+ 4'b0001 : dma_wr_o <= 1;
+ 4'b0010 : dma_wr_o <= 1;
+ 4'b0011 : dma_wr_o <= 1;
+ 4'b0000 : dma_wr_o <= 1;
+ // Start alignment = 1
+ 4'b0101 : dma_wr_o <= 0;
+ 4'b0110 : dma_wr_o <= 1;
+ 4'b0111 : dma_wr_o <= 1;
+ 4'b0100 : dma_wr_o <= 1;
+ // Start alignment = 2
+ 4'b1001 : dma_wr_o <= 0;
+ 4'b1010 : dma_wr_o <= 0;
+ 4'b1011 : dma_wr_o <= 1;
+ 4'b1000 : dma_wr_o <= 1;
+ // Start alignment = 3
+ 4'b1101 : dma_wr_o <= 0;
+ 4'b1110 : dma_wr_o <= 0;
+ 4'b1111 : dma_wr_o <= 0;
+ 4'b1100 : dma_wr_o <= 1;
+ endcase
+ end
+ end
+ else begin
+ dma_wr_o <= 0;
+ wbd_stb_o <= 0;
+ state <= WB_IDLE;
+ end
+ end
+ else begin
+ dma_last_o <= 0;
+ dma_wr_o <= 0;
+ end
+ end
+ WB_RD_PHASE_SOF :
+ begin
+ if(wbd_ack_i) begin
+ twbtrans <= twbtrans -1;
+ if(twbtrans == 1) begin // If the Pending Transfer is 1
+ dma_rd_o <= 1;
+ dma_start_o<= 1;
+ if(be_sof == 0) begin
+ dma_rdata_o <= wbd_dat_i;
+ preq_len <= preq_len - 4;
+ end
+ else if(be_sof == 1) begin
+ dma_rdata_o <= {8'h0,wbd_dat_i[31:24]};
+ preq_len <= preq_len - 3;
+ end
+ else if(be_sof == 2) begin
+ dma_rdata_o <= {16'h0,wbd_dat_i[31:16]};
+ preq_len <= preq_len - 2;
+ end
+ else begin
+ dma_rdata_o <= {23'h0,wbd_dat_i[31:8]};
+ preq_len <= preq_len - 0;
+ end
+ dma_last_o <= 1;
+ state <= WB_IDLE;
+ end
+ else begin // pending transction is more than 1
+ if(be_sof == 0) begin
+ dma_rdata_o <= wbd_dat_i;
+ dma_rd_o <= 1;
+ dma_start_o <= 1;
+ preq_len <= preq_len - 4;
+ end
+ else if(be_sof == 1) begin
+ temp_data <= {8'h0,wbd_dat_i[31:24]};
+ dma_rd_o <= 0;
+ preq_len <= preq_len - 3;
+ end
+ else if(be_sof == 2) begin
+ temp_data <= {16'h0,wbd_dat_i[31:16]};
+ preq_len <= preq_len - 2;
+ end
+ else begin
+ temp_data <= {23'h0,wbd_dat_i[31:8]};
+ preq_len <= preq_len - 0;
+ end
+ state <= WB_RD_PHASE_CONT;
+ end
+ end
+ else begin
+ dma_rd_o <= 0;
+ end
+ end
+ WB_RD_PHASE_CONT:
+ begin
+ dma_start_o <= 0;
+ if(wbd_ack_i) begin
+ dma_rd_o <= 1;
+ twbtrans <= twbtrans -1;
+ if(be_sof == 0) begin
+ dma_rdata_o <= wbd_dat_i;
+ preq_len <= preq_len - 4;
+ end
+ else if(be_sof == 1) begin
+ dma_rdata_o <= {wbd_dat_i[7:0],temp_data[23:0]};
+ temp_data <= {8'h0,wbd_dat_i[31:8]};
+ preq_len <= preq_len - 3;
+ end
+ else if(be_sof == 2) begin
+ dma_rdata_o <= {wbd_dat_i[15:0],temp_data[15:0]};
+ temp_data <= {16'h0,wbd_dat_i[31:16]};
+ preq_len <= preq_len - 2;
+ end
+ else begin
+ dma_rdata_o <= {wbd_dat_i[23:0],temp_data[7:0]};
+ temp_data <= {24'h0,wbd_dat_i[31:23]};
+ preq_len <= preq_len - 1;
+ end
+ if(twbtrans == 1) begin // If the it's last transfer
+ dma_last_o <= 1;
+ state <= WB_IDLE;
+ end
+ end
+ else begin
+ dma_last_o <= 0;
+ dma_rd_o <= 0;
+ end
+ end
+ endcase
+ end
+end
+
+
+
+endmodule
diff --git a/verilog/rtl/lib/wb_rd_mem2mem.v b/verilog/rtl/lib/wb_rd_mem2mem.v
new file mode 100644
index 0000000..d7c20b1
--- /dev/null
+++ b/verilog/rtl/lib/wb_rd_mem2mem.v
@@ -0,0 +1,348 @@
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Tubo 8051 cores common library Module ////
+//// ////
+//// This file is part of the Turbo 8051 cores project ////
+//// http://www.opencores.org/cores/turbo8051/ ////
+//// ////
+//// Description ////
+//// Turbo 8051 definitions. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : Mar 2, 2011 ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+/**********************************************
+ Web-bone , Read from Wishbone Memory and Write to internal Memory
+
+ This block handles following task
+ 1. Check the Descriptor Q for not empty
+ 2. If the Descriptor Q is not empty, the read the 32 bit descriptor
+ 3. The 32 bit descriptor holds following information
+ [11:0] - Packet Length
+ [25:12] - MSB [15:2] of Packet Start Location
+ [31:26] - Packet Status
+ 4. Based on the Packet Length, Read the data from external Data memory
+ and write it to Internal Memory
+
+**********************************************/
+
+module wb_rd_mem2mem (
+
+ rst_n ,
+ clk ,
+
+ // descriptor handshake
+ cfg_desc_baddr ,
+ desc_q_empty ,
+
+ // Master Interface Signal
+ mem_taddr ,
+ mem_full ,
+ mem_afull ,
+ mem_wr ,
+ mem_din ,
+
+ // Slave Interface Signal
+ wbo_dout ,
+ wbo_taddr ,
+ wbo_addr ,
+ wbo_be ,
+ wbo_we ,
+ wbo_ack ,
+ wbo_stb ,
+ wbo_cyc ,
+ wbo_err ,
+ wbo_rty
+ );
+
+
+parameter D_WD = 16; // Data Width
+parameter BE_WD = 2; // Byte Enable
+parameter ADR_WD = 28; // Address Width
+parameter TAR_WD = 4; // Target Width
+
+//---------------------
+// State Machine Parameter
+//--------------------
+
+parameter IDLE = 0;
+parameter DESC_RD = 1;
+parameter DATA_WAIT = 2;
+parameter TXFR = 3;
+parameter MEM_WRITE2 = 4;
+parameter MEM_WRITE3 = 5;
+parameter MEM_WRITE4 = 6;
+
+
+//-------------------------------------------
+// Input Declaration
+//------------------------------------------
+
+input clk ; // CLK_I The clock input [CLK_I] coordinates all activities
+ // for the internal logic within the WISHBONE interconnect.
+ // All WISHBONE output signals are registered at the
+ // rising edge of [CLK_I].
+ // All WISHBONE input signals must be stable before the
+ // rising edge of [CLK_I].
+input rst_n ; // RST_I The reset input [RST_I] forces the WISHBONE interface
+ // to restart. Furthermore, all internal self-starting state
+ // machines will be forced into an initial state.
+
+//---------------------------------
+// Descriptor Interface
+//---------------------------------
+input [15:6] cfg_desc_baddr ; // descriptor Base Address
+input desc_q_empty ;
+
+//------------------------------------------
+// Stanard Memory Interface
+//------------------------------------------
+
+input [TAR_WD-1:0] mem_taddr ; // target address
+input mem_full ; // memory full
+input mem_afull ; // memory afull
+output mem_wr ; // memory Write
+output [8:0] mem_din ; // memory read data
+
+//------------------------------------------
+// External Memory WB Interface
+//------------------------------------------
+output wbo_stb ; // STB_O The strobe output [STB_O] indicates a valid data
+ // transfer cycle. It is used to qualify various other signals
+ // on the interface such as [SEL_O(7..0)]. The SLAVE must
+ // assert either the [ACK_I], [ERR_I] or [RTY_I] signals in
+ // response to every assertion of the [STB_O] signal.
+output wbo_we ; // WE_O The write enable output [WE_O] indicates whether the
+ // current local bus cycle is a READ or WRITE cycle. The
+ // signal is negated during READ cycles, and is asserted
+ // during WRITE cycles.
+input wbo_ack ; // The acknowledge input [ACK_I], when asserted,
+ // indicates the termination of a normal bus cycle.
+ // Also see the [ERR_I] and [RTY_I] signal descriptions.
+
+output [TAR_WD-1:0] wbo_taddr;
+output [ADR_WD-1:0] wbo_addr ; // The address output array [ADR_O(63..0)] is used
+ // to pass a binary address, with the most significant
+ // address bit at the higher numbered end of the signal array.
+ // The lower array boundary is specific to the data port size.
+ // The higher array boundary is core-specific.
+ // In some cases (such as FIFO interfaces)
+ // the array may not be present on the interface.
+
+output [BE_WD-1:0] wbo_be ; // Byte Enable
+ // SEL_O(7..0) The select output array [SEL_O(7..0)] indicates
+ // where valid data is expected on the [DAT_I(63..0)] signal
+ // array during READ cycles, and where it is placed on the
+ // [DAT_O(63..0)] signal array during WRITE cycles.
+ // Also see the [DAT_I(63..0)], [DAT_O(63..0)] and [STB_O]
+ // signal descriptions.
+
+output wbo_cyc ; // CYC_O The cycle output [CYC_O], when asserted,
+ // indicates that a valid bus cycle is in progress.
+ // The signal is asserted for the duration of all bus cycles.
+ // For example, during a BLOCK transfer cycle there can be
+ // multiple data transfers. The [CYC_O] signal is asserted
+ // during the first data transfer, and remains asserted
+ // until the last data transfer. The [CYC_O] signal is useful
+ // for interfaces with multi-port interfaces
+ // (such as dual port memories). In these cases,
+ // the [CYC_O] signal requests use of a common bus from an
+ // arbiter. Once the arbiter grants the bus to the MASTER,
+ // it is held until [CYC_O] is negated.
+
+input [D_WD-1:0] wbo_dout; // DAT_I(63..0) The data input array [DAT_I(63..0)] is
+ // used to pass binary data. The array boundaries are
+ // determined by the port size. Also see the [DAT_O(63..0)]
+ // and [SEL_O(7..0)] signal descriptions.
+
+input wbo_err; // ERR_I The error input [ERR_I] indicates an abnormal
+ // cycle termination. The source of the error, and the
+ // response generated by the MASTER is defined by the IP core
+ // supplier in the WISHBONE DATASHEET. Also see the [ACK_I]
+ // and [RTY_I] signal descriptions.
+
+input wbo_rty; // RTY_I The retry input [RTY_I] indicates that the indicates
+ // that the interface is not ready to accept or send data, and
+ // that the cycle should be retried. When and how the cycle is
+ // retried is defined by the IP core supplier in the WISHBONE
+ // DATASHEET. Also see the [ERR_I] and [RTY_I] signal
+ // descriptions.
+
+//----------------------------------------
+// Register Declration
+//----------------------------------------
+
+reg [2:0] state ;
+reg [15:0] cnt ;
+reg [TAR_WD-1:0] wbo_taddr ;
+reg [ADR_WD-1:0] wbo_addr ;
+reg wbo_stb ;
+reg wbo_we ;
+reg [BE_WD-1:0] wbo_be ;
+reg wbo_cyc ;
+reg [15:0] mem_addr ;
+
+
+
+
+reg [3:0] desc_ptr;
+reg [23:0] tWrData; // Temp Write Data
+reg [8:0] mem_din;
+reg mem_wr;
+
+always @(negedge rst_n or posedge clk) begin
+ if(rst_n == 0) begin
+ state <= IDLE;
+ wbo_taddr <= 0;
+ wbo_addr <= 0;
+ wbo_stb <= 0;
+ wbo_we <= 0;
+ wbo_be <= 0;
+ wbo_cyc <= 0;
+ desc_ptr <= 0;
+ mem_addr <= 0;
+ mem_din <= 0;
+ tWrData <= 0;
+ mem_wr <= 0;
+ end
+ else begin
+ case(state)
+ IDLE: begin
+ mem_wr <= 0;
+ // Check for Descriptor Q not empty
+ if(!desc_q_empty) begin
+ wbo_taddr <= mem_taddr;
+ wbo_addr <= {cfg_desc_baddr[15:6],desc_ptr[3:0]};
+ wbo_be <= 4'hF;
+ wbo_we <= 1'b0;
+ wbo_stb <= 1'b1;
+ wbo_cyc <= 1;
+ state <= DESC_RD;
+ desc_ptr <= desc_ptr+1;
+ end
+ end
+ DESC_RD: begin
+ // wait for web-bone ack
+ if(wbo_ack) begin
+ wbo_cyc <= 1'b0;
+ wbo_stb <= 1'b0;
+ state <= IDLE;
+ cnt <= wbo_dout[11:0];
+ mem_addr <= {wbo_dout[27:12],2'b0};
+ state <= DATA_WAIT;
+ end
+ end
+
+ DATA_WAIT: begin
+ mem_wr <= 0; // Reset the write for handling interburst
+ // check for internal memory not full and initiate
+ // the transfer
+ if(!(mem_full || mem_afull)) begin
+ wbo_taddr <= mem_taddr;
+ wbo_addr <= mem_addr[14:2];
+ wbo_stb <= 1'b1;
+ wbo_we <= 1'b0;
+ wbo_be <= 4'hF;
+ wbo_cyc <= 1'b1;
+ state <= TXFR;
+ end
+ end
+ TXFR: begin
+ if(wbo_ack) begin
+ wbo_cyc <= 1'b0;
+ wbo_stb <= 1'b0;
+ mem_addr <= mem_addr+4;
+ mem_din[7:0] <= wbo_dout[7:0]; // Write First Byte
+ tWrData <= wbo_dout[31:8];
+ mem_din[8] <= (cnt == 1) ? 1'b1 : 1'b0; // EOP generation at last transfer
+ mem_wr <= 1;
+ cnt <= cnt-1;
+ if(cnt == 1) begin
+ state <= IDLE;
+ end else begin
+ state <= MEM_WRITE2;
+ end
+ end
+ end
+ MEM_WRITE2: begin // Write 2nd Byte
+ if(!(mem_full || mem_afull)) begin // to handle the interburst fifo full case
+ mem_din[7:0] <= tWrData[7:0];
+ mem_din[8] <= (cnt == 1) ? 1'b1 : 1'b0; // EOP generation at last transfer
+ mem_wr <= 1;
+ cnt <= cnt-1;
+ if(cnt == 1) begin
+ state <= IDLE;
+ end else begin
+ state <= MEM_WRITE3;
+ end
+ end else begin
+ mem_wr <= 0;
+ end
+ end
+ MEM_WRITE3: begin // Write 3rd Byte
+ if(!(mem_full || mem_afull)) begin // to handle the interburst fifo full case
+ mem_din[7:0] <= tWrData[15:8];
+ mem_din[8] <= (cnt == 1) ? 1'b1 : 1'b0; // EOP generation at last transfer
+ mem_wr <= 1;
+ cnt <= cnt-1;
+ if(cnt == 1) begin
+ state <= IDLE;
+ end else begin
+ state <= MEM_WRITE4;
+ end
+ end else begin
+ mem_wr <= 0;
+ end
+ end
+ MEM_WRITE4: begin // Write 4th Byte
+ if(!(mem_full || mem_afull)) begin // to handle the interburst fifo full case
+ mem_din[7:0] <= tWrData[23:16];
+ mem_din[8] <= (cnt == 1) ? 1'b1 : 1'b0; // EOP generation at last transfer
+ mem_wr <= 1;
+ cnt <= cnt-1;
+ if(cnt == 1) begin
+ state <= IDLE;
+ end else begin
+ state <= DATA_WAIT;
+ end
+ end else begin
+ mem_wr <= 0;
+ end
+ end
+ endcase
+ end
+end
+
+endmodule
diff --git a/verilog/rtl/lib/wb_stagging.sv b/verilog/rtl/lib/wb_stagging.sv
new file mode 100644
index 0000000..8f54f0f
--- /dev/null
+++ b/verilog/rtl/lib/wb_stagging.sv
@@ -0,0 +1,173 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//----------------------------------------------------------------------
+// This logic create a holding register for Wishbone interface.
+// This is usefull to break timing issue at interconnect
+//
+// Limitation: Due to stagging FF, Continous Burst of Wishbone will have one
+// cycle break between each transaction
+//----------------------------------------------------------------------
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Wishbone Stagging FF ////
+//// ////
+//// This file is part of the YIFive cores project ////
+//// https://github.com/dineshannayya/yifive_r0.git ////
+//// http://www.opencores.org/cores/yifive/ ////
+//// ////
+//// Description ////
+//// This logic create a holding FF for Wishbone interface. ////
+//// This is usefull to break timing issue at interconnect ////
+//// ////
+//// Limitation: Due to stagging FF, Continous Burst of ////
+//// Wishbone will have one cycle break between each transaction ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.1 - 12th June 2021, Dinesh A ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+
+module wb_stagging (
+ input logic clk_i,
+ input logic rst_n,
+ // WishBone Input master I/P
+ input logic [31:0] m_wbd_dat_i,
+ input logic [31:0] m_wbd_adr_i,
+ input logic [3:0] m_wbd_sel_i,
+ input logic m_wbd_we_i,
+ input logic m_wbd_cyc_i,
+ input logic m_wbd_stb_i,
+ input logic [3:0] m_wbd_tid_i,
+ output logic [31:0] m_wbd_dat_o,
+ output logic m_wbd_ack_o,
+ output logic m_wbd_err_o,
+
+ // Slave Interface
+ input logic [31:0] s_wbd_dat_i,
+ input logic s_wbd_ack_i,
+ input logic s_wbd_err_i,
+ output logic [31:0] s_wbd_dat_o,
+ output logic [31:0] s_wbd_adr_o,
+ output logic [3:0] s_wbd_sel_o,
+ output logic s_wbd_we_o,
+ output logic s_wbd_cyc_o,
+ output logic s_wbd_stb_o,
+ output logic [3:0] s_wbd_tid_o
+
+);
+
+logic holding_busy ; // Indicate Stagging for Free or not
+logic [31:0] m_wbd_dat_i_ff ; // Flopped vesion of m_wbd_dat_i
+logic [31:0] m_wbd_adr_i_ff ; // Flopped vesion of m_wbd_adr_i
+logic [3:0] m_wbd_sel_i_ff ; // Flopped vesion of m_wbd_sel_i
+logic m_wbd_we_i_ff ; // Flopped vesion of m_wbd_we_i
+logic m_wbd_cyc_i_ff ; // Flopped vesion of m_wbd_cyc_i
+logic m_wbd_stb_i_ff ; // Flopped vesion of m_wbd_stb_i
+logic [3:0] m_wbd_tid_i_ff ; // Flopped vesion of m_wbd_tid_i
+logic [31:0] s_wbd_dat_i_ff ; // Flopped vesion of s_wbd_dat_i
+logic s_wbd_ack_i_ff ; // Flopped vesion of s_wbd_ack_i
+logic s_wbd_err_i_ff ; // Flopped vesion of s_wbd_err_i
+
+
+assign s_wbd_dat_o = m_wbd_dat_i_ff;
+assign s_wbd_adr_o = m_wbd_adr_i_ff;
+assign s_wbd_sel_o = m_wbd_sel_i_ff;
+assign s_wbd_we_o = m_wbd_we_i_ff;
+assign s_wbd_cyc_o = m_wbd_cyc_i_ff;
+assign s_wbd_stb_o = m_wbd_stb_i_ff;
+assign s_wbd_tid_o = m_wbd_tid_i_ff;
+
+assign m_wbd_dat_o = s_wbd_dat_i_ff;
+assign m_wbd_ack_o = s_wbd_ack_i_ff;
+assign m_wbd_err_o = s_wbd_err_i_ff;
+
+always @(negedge rst_n or posedge clk_i)
+begin
+ if(rst_n == 1'b0) begin
+ holding_busy <= 1'b0;
+ m_wbd_dat_i_ff <= 'h0;
+ m_wbd_adr_i_ff <= 'h0;
+ m_wbd_sel_i_ff <= 'h0;
+ m_wbd_we_i_ff <= 'h0;
+ m_wbd_cyc_i_ff <= 'h0;
+ m_wbd_stb_i_ff <= 'h0;
+ m_wbd_tid_i_ff <= 'h0;
+ s_wbd_dat_i_ff <= 'h0;
+ s_wbd_ack_i_ff <= 'h0;
+ s_wbd_err_i_ff <= 'h0;
+ end else begin
+ s_wbd_dat_i_ff <= s_wbd_dat_i;
+ s_wbd_ack_i_ff <= s_wbd_ack_i;
+ s_wbd_err_i_ff <= s_wbd_err_i;
+ if(m_wbd_stb_i && holding_busy == 0 && m_wbd_ack_o == 0) begin
+ holding_busy <= 1'b1;
+ m_wbd_dat_i_ff <= m_wbd_dat_i;
+ m_wbd_adr_i_ff <= m_wbd_adr_i;
+ m_wbd_sel_i_ff <= m_wbd_sel_i;
+ m_wbd_we_i_ff <= m_wbd_we_i;
+ m_wbd_cyc_i_ff <= m_wbd_cyc_i;
+ m_wbd_stb_i_ff <= m_wbd_stb_i;
+ m_wbd_tid_i_ff <= m_wbd_tid_i;
+ end else if (holding_busy && s_wbd_ack_i) begin
+ holding_busy <= 1'b0;
+ m_wbd_dat_i_ff <= 'h0;
+ m_wbd_adr_i_ff <= 'h0;
+ m_wbd_sel_i_ff <= 'h0;
+ m_wbd_we_i_ff <= 'h0;
+ m_wbd_cyc_i_ff <= 'h0;
+ m_wbd_stb_i_ff <= 'h0;
+ m_wbd_tid_i_ff <= 'h0;
+ end
+ end
+end
+
+
+endmodule
+
diff --git a/verilog/rtl/lib/wb_wr_mem2mem.v b/verilog/rtl/lib/wb_wr_mem2mem.v
new file mode 100644
index 0000000..0972b4f
--- /dev/null
+++ b/verilog/rtl/lib/wb_wr_mem2mem.v
@@ -0,0 +1,370 @@
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Tubo 8051 cores common library Module ////
+//// ////
+//// This file is part of the Turbo 8051 cores project ////
+//// http://www.opencores.org/cores/turbo8051/ ////
+//// ////
+//// Description ////
+//// Turbo 8051 definitions. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : Mar 2, 2011 ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+/**********************************************
+ Web-bone , Read from Memory and Write to WebBone External Memory
+**********************************************/
+
+module wb_wr_mem2mem (
+
+ rst_n ,
+ clk ,
+
+
+ // Master Interface Signal
+ mem_taddr ,
+ mem_addr ,
+ mem_empty ,
+ mem_aempty ,
+ mem_rd ,
+ mem_dout ,
+ mem_eop ,
+
+ cfg_desc_baddr ,
+ desc_req ,
+ desc_ack ,
+ desc_disccard ,
+ desc_data ,
+
+
+ // Slave Interface Signal
+ wbo_din ,
+ wbo_taddr ,
+ wbo_addr ,
+ wbo_be ,
+ wbo_we ,
+ wbo_ack ,
+ wbo_stb ,
+ wbo_cyc ,
+ wbo_err ,
+ wbo_rty
+ );
+
+
+parameter D_WD = 16; // Data Width
+parameter BE_WD = 2; // Byte Enable
+parameter ADR_WD = 28; // Address Width
+parameter TAR_WD = 4; // Target Width
+
+// State Machine
+parameter IDLE = 3'h0;
+parameter RD_BYTE1 = 3'h1;
+parameter RD_BYTE2 = 3'h2;
+parameter RD_BYTE3 = 3'h3;
+parameter RD_BYTE4 = 3'h4;
+parameter WB_XFR = 3'h5;
+parameter DESC_WAIT = 3'h6;
+parameter DESC_XFR = 3'h7;
+
+input clk ; // CLK_I The clock input [CLK_I] coordinates all activities
+ // for the internal logic within the WISHBONE interconnect.
+ // All WISHBONE output signals are registered at the
+ // rising edge of [CLK_I].
+ // All WISHBONE input signals must be stable before the
+ // rising edge of [CLK_I].
+input rst_n ; // RST_I The reset input [RST_I] forces the WISHBONE interface
+ // to restart. Furthermore, all internal self-starting state
+ // machines will be forced into an initial state.
+
+//------------------------------------------
+// Stanard Memory Interface
+//------------------------------------------
+input [TAR_WD-1:0] mem_taddr; // target address
+input [15:0] mem_addr; // memory address
+input mem_empty; // memory empty
+input mem_aempty; // memory empty
+output mem_rd; // memory read
+input [7:0] mem_dout; // memory read data
+input mem_eop; // Last Transfer indication
+
+//----------------------------------------
+// Discriptor defination
+//----------------------------------------
+input desc_req; // descriptor request
+output desc_ack; // descriptor ack
+input desc_disccard;// descriptor discard
+input [15:6] cfg_desc_baddr; // descriptor memory base address
+input [31:0] desc_data; // descriptor data
+
+//------------------------------------------
+// External Memory WB Interface
+//------------------------------------------
+output [TAR_WD-1:0] wbo_taddr ;
+output wbo_stb ; // STB_O The strobe output [STB_O] indicates a valid data
+ // transfer cycle. It is used to qualify various other signals
+ // on the interface such as [SEL_O(7..0)]. The SLAVE must
+ // assert either the [ACK_I], [ERR_I] or [RTY_I] signals in
+ // response to every assertion of the [STB_O] signal.
+output wbo_we ; // WE_O The write enable output [WE_O] indicates whether the
+ // current local bus cycle is a READ or WRITE cycle. The
+ // signal is negated during READ cycles, and is asserted
+ // during WRITE cycles.
+input wbo_ack ; // The acknowledge input [ACK_I], when asserted,
+ // indicates the termination of a normal bus cycle.
+ // Also see the [ERR_I] and [RTY_I] signal descriptions.
+
+output [ADR_WD-1:0] wbo_addr ; // The address output array [ADR_O(63..0)] is used
+ // to pass a binary address, with the most significant
+ // address bit at the higher numbered end of the signal array.
+ // The lower array boundary is specific to the data port size.
+ // The higher array boundary is core-specific.
+ // In some cases (such as FIFO interfaces)
+ // the array may not be present on the interface.
+
+output [BE_WD-1:0] wbo_be ; // Byte Enable
+ // SEL_O(7..0) The select output array [SEL_O(7..0)] indicates
+ // where valid data is expected on the [DAT_I(63..0)] signal
+ // array during READ cycles, and where it is placed on the
+ // [DAT_O(63..0)] signal array during WRITE cycles.
+ // Also see the [DAT_I(63..0)], [DAT_O(63..0)] and [STB_O]
+ // signal descriptions.
+
+output wbo_cyc ; // CYC_O The cycle output [CYC_O], when asserted,
+ // indicates that a valid bus cycle is in progress.
+ // The signal is asserted for the duration of all bus cycles.
+ // For example, during a BLOCK transfer cycle there can be
+ // multiple data transfers. The [CYC_O] signal is asserted
+ // during the first data transfer, and remains asserted
+ // until the last data transfer. The [CYC_O] signal is useful
+ // for interfaces with multi-port interfaces
+ // (such as dual port memories). In these cases,
+ // the [CYC_O] signal requests use of a common bus from an
+ // arbiter. Once the arbiter grants the bus to the MASTER,
+ // it is held until [CYC_O] is negated.
+
+output [D_WD-1:0] wbo_din; // DAT_I(63..0) The data input array [DAT_I(63..0)] is
+ // used to pass binary data. The array boundaries are
+ // determined by the port size. Also see the [DAT_O(63..0)]
+ // and [SEL_O(7..0)] signal descriptions.
+
+input wbo_err; // ERR_I The error input [ERR_I] indicates an abnormal
+ // cycle termination. The source of the error, and the
+ // response generated by the MASTER is defined by the IP core
+ // supplier in the WISHBONE DATASHEET. Also see the [ACK_I]
+ // and [RTY_I] signal descriptions.
+
+input wbo_rty; // RTY_I The retry input [RTY_I] indicates that the indicates
+ // that the interface is not ready to accept or send data, and
+ // that the cycle should be retried. When and how the cycle is
+ // retried is defined by the IP core supplier in the WISHBONE
+ // DATASHEET. Also see the [ERR_I] and [RTY_I] signal
+ // descriptions.
+
+//-------------------------------------------
+// Register Dec
+//-------------------------------------------
+
+reg [TAR_WD-1:0] wbo_taddr ;
+reg [ADR_WD-1:0] wbo_addr ;
+reg wbo_stb ;
+reg wbo_we ;
+reg [BE_WD-1:0] wbo_be ;
+reg wbo_cyc ;
+reg [D_WD-1:0] wbo_din ;
+reg [2:0] state ;
+
+reg mem_rd ;
+reg [3:0] desc_ptr ; // descriptor pointer, in 32 bit mode
+reg mem_eop_l ; // delayed eop signal
+reg desc_ack ; // delayed eop signal
+
+reg [23:0] tWrData; // Temp 24 Bit Data
+always @(negedge rst_n or posedge clk) begin
+ if(rst_n == 0) begin
+ wbo_taddr <= 0;
+ wbo_addr <= 0;
+ wbo_stb <= 0;
+ wbo_we <= 0;
+ wbo_be <= 0;
+ wbo_cyc <= 0;
+ wbo_din <= 0;
+ mem_rd <= 0;
+ desc_ptr <= 0;
+ mem_eop_l <= 0;
+ desc_ack <= 0;
+ tWrData <= 0;
+ state <= IDLE;
+ end
+ else begin
+ case(state)
+ IDLE: begin
+ desc_ack <= 0;
+ if(!mem_empty) begin
+ mem_rd <= 1;
+ mem_eop_l <= 0;
+ tWrData[7:0] <= mem_dout[7:0];
+ state <= RD_BYTE1;
+ end
+ end
+ RD_BYTE1: begin // End of First Transfer
+ if(mem_rd && mem_eop) begin
+ mem_rd <= 0;
+ mem_eop_l <= mem_eop;
+ wbo_taddr <= mem_taddr;
+ wbo_addr <= mem_addr[14:2];
+ wbo_stb <= 1'b1;
+ wbo_we <= 1'b1;
+ wbo_be <= 4'h1; // Assigned Aligned 32bit address
+ wbo_din <= {24'h0,mem_dout[7:0]};
+ wbo_cyc <= 1;
+ state <= WB_XFR;
+ end else if(!(mem_empty || (mem_rd && mem_aempty))) begin
+ mem_rd <= 1;
+ state <= RD_BYTE2;
+ end else begin
+ mem_rd <= 0;
+ end
+ if(mem_rd) begin
+ tWrData[7:0] <= mem_dout[7:0];
+ end
+ end
+
+ RD_BYTE2: begin // End of Second Transfer
+ if(mem_rd && mem_eop) begin
+ mem_rd <= 0;
+ mem_eop_l <= mem_eop;
+ wbo_taddr <= mem_taddr;
+ wbo_addr <= mem_addr[14:2];
+ wbo_stb <= 1'b1;
+ wbo_we <= 1'b1;
+ wbo_be <= 4'h3; // Assigned Aligned 32bit address
+ wbo_din <= {16'h0,mem_dout[7:0],tWrData[7:0]};
+ wbo_cyc <= 1;
+ state <= WB_XFR;
+ end else if(!(mem_empty || (mem_rd && mem_aempty))) begin
+ mem_rd <= 1;
+ state <= RD_BYTE3;
+ end else begin
+ mem_rd <= 0;
+ end
+ if(mem_rd) begin
+ tWrData[15:8] <= mem_dout[7:0];
+ end
+ end
+
+
+ RD_BYTE3: begin // End of Third Transfer
+ if(mem_rd && mem_eop) begin
+ mem_rd <= 0;
+ mem_eop_l <= mem_eop;
+ wbo_taddr <= mem_taddr;
+ wbo_addr <= mem_addr[14:2];
+ wbo_stb <= 1'b1;
+ wbo_we <= 1'b1;
+ wbo_be <= 4'h7; // Assigned Aligned 32bit address
+ wbo_din <= {8'h0,mem_dout[7:0],tWrData[15:0]};
+ wbo_cyc <= 1;
+ state <= WB_XFR;
+ end else if(!(mem_empty || (mem_rd && mem_aempty))) begin
+ mem_rd <= 1;
+ state <= RD_BYTE4;
+ end else begin
+ mem_rd <= 0;
+ end
+ if(mem_rd) begin
+ tWrData[23:16] <= mem_dout[7:0];
+ end
+ end
+
+ RD_BYTE4: begin // End of Fourth Transfer
+ mem_rd <= 0;
+ mem_eop_l <= mem_eop;
+ wbo_taddr <= mem_taddr;
+ wbo_addr <= mem_addr[14:2];
+ wbo_stb <= 1'b1;
+ wbo_we <= 1'b1;
+ wbo_be <= 4'hF; // Assigned Aligned 32bit address
+ wbo_din <= {mem_dout[7:0],tWrData[23:0]};
+ wbo_cyc <= 1;
+ state <= WB_XFR;
+ end
+
+ WB_XFR: begin
+ if(wbo_ack) begin
+ wbo_stb <= 0;
+ wbo_cyc <= 0;
+ if(mem_eop_l) begin
+ state <= DESC_WAIT;
+ end else begin
+ state <= IDLE; // Next Byte
+ end
+ end
+ end
+
+
+ DESC_WAIT: begin
+ if(desc_req) begin
+ desc_ack <= 1;
+ if(desc_disccard) begin // if the Desc is discarded
+ state <= IDLE;
+ end
+ else begin
+ wbo_addr <= {cfg_desc_baddr[15:6],desc_ptr[3:0]}; // Each Transfer is 32bit
+ wbo_be <= 4'hF;
+ wbo_din <= desc_data;
+ wbo_we <= 1'b1;
+ wbo_stb <= 1'b1;
+ wbo_cyc <= 1;
+ state <= DESC_XFR;
+ desc_ptr <= desc_ptr+1;
+ end
+ end
+ end
+ DESC_XFR: begin
+ desc_ack <= 0;
+ if(wbo_ack) begin
+ wbo_stb <= 1'b0;
+ wbo_cyc <= 1'b0;
+ state <= IDLE;
+ end
+ end
+
+ endcase
+ end
+end
+
+
+
+endmodule
diff --git a/verilog/rtl/mbist/include/mbist_def.svh b/verilog/rtl/mbist/include/mbist_def.svh
new file mode 100644
index 0000000..10fb2ea
--- /dev/null
+++ b/verilog/rtl/mbist/include/mbist_def.svh
@@ -0,0 +1,66 @@
+///////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+`ifndef BIST_DEFINE_SVH
+`define BIST_DEFINE_SVH
+
+// BIST ADDRESS CONTRL
+//
+//parameter BIST_ADDR_WD = 9 ;
+//parameter BIST_ADDR_START = 10'h000 ;
+//parameter BIST_ADDR_END = 10'h3FB ;
+
+// BIST DATA CONTRL
+//parameter BIST_DATA_WD = 32;
+parameter BIST_DATA_PAT_SIZE = 8;
+parameter BIST_DATA_PAT_TYPE1 = 64'h5555_5555_5555_5555;
+parameter BIST_DATA_PAT_TYPE2 = 64'h3333_3333_3333_3333;
+parameter BIST_DATA_PAT_TYPE3 = 64'h0F0F_0F0F_0F0F_0F0F;
+parameter BIST_DATA_PAT_TYPE4 = 64'h00FF_00FF_00FF_00FF;
+parameter BIST_DATA_PAT_TYPE5 = 64'h0000_FFFF_0000_FFFF;
+parameter BIST_DATA_PAT_TYPE6 = 64'h0000_0000_FFFF_FFFF;
+parameter BIST_DATA_PAT_TYPE7 = 64'hFFFF_FFFF_FFFF_FFFF;
+parameter BIST_DATA_PAT_TYPE8 = 64'h0000_0000_0000_0000;
+
+// BIST STIMULATION SELECT
+
+parameter BIST_STI_SIZE = 5;
+parameter BIST_STI_WD = 15;
+// Additional 3'b000 added at end of each stimulus to flush out the comparion
+// result + to handle error fix case
+parameter BIST_STIMULUS_TYPE1 = 15'b100100100100000;
+parameter BIST_STIMULUS_TYPE2 = 15'b100010101011000;
+parameter BIST_STIMULUS_TYPE3 = 15'b110011100010000;
+parameter BIST_STIMULUS_TYPE4 = 15'b000010101011000;
+parameter BIST_STIMULUS_TYPE5 = 15'b010011100010000;
+parameter BIST_STIMULUS_TYPE6 = 15'b000000000000000;
+parameter BIST_STIMULUS_TYPE7 = 15'b000000000000000;
+parameter BIST_STIMULUS_TYPE8 = 15'b000000000000000;
+
+
+// Operation
+parameter BIST_OP_SIZE = 4;
+
+// BIST ADDRESS REPAIR
+//parameter BIST_RAD_WD_I = BIST_ADDR_WD;
+//parameter BIST_RAD_WD_O = BIST_ADDR_WD;
+parameter BIST_ERR_LIMIT = 4;
+// Make Sure that this address in outside the valid address range
+//parameter BIST_REPAIR_ADDR_START = 10'h3FC ;
+
+`endif // BIST_DEFINE_SVH
diff --git a/verilog/rtl/mbist/run_iverilog b/verilog/rtl/mbist/run_iverilog
new file mode 100755
index 0000000..a88ada5
--- /dev/null
+++ b/verilog/rtl/mbist/run_iverilog
@@ -0,0 +1,18 @@
+iverilog -g2005-sv \
+src/top/mbist_top1.sv \
+src/core/mbist_addr_gen.sv \
+src/core/mbist_fsm.sv \
+src/core/mbist_op_sel.sv \
+src/core/mbist_repair_addr.sv \
+src/core/mbist_data_cmp.sv \
+src/core/mbist_mux.sv \
+src/core/mbist_pat_sel.sv \
+src/core/mbist_sti_sel.sv \
+src/core/mbist_mem_wrapper.sv \
+-I include/ \
+../lib/ctech_cells.sv \
+../lib/reset_sync.sv \
+$PDK_ROOT/sky130A/libs.ref/sky130_fd_sc_hd/verilog/sky130_fd_sc_hd.v \
+$PDK_ROOT/sky130A/libs.ref/sky130_fd_sc_hd/verilog/primitives.v \
+--timescale 1ns/100ps \
+--bbox-unsup
diff --git a/verilog/rtl/mbist/run_verilator b/verilog/rtl/mbist/run_verilator
new file mode 100755
index 0000000..1dd5d6b
--- /dev/null
+++ b/verilog/rtl/mbist/run_verilator
@@ -0,0 +1,17 @@
+verilator -cc \
+src/top/mbist_top1.sv \
+src/core/mbist_addr_gen.sv \
+src/core/mbist_fsm.sv \
+src/core/mbist_op_sel.sv \
+src/core/mbist_repair_addr.sv \
+src/core/mbist_data_cmp.sv \
+src/core/mbist_mux.sv \
+src/core/mbist_pat_sel.sv \
+src/core/mbist_sti_sel.sv \
++incdir+include/ \
+../lib/ctech_cells.sv \
+../lib/reset_sync.sv \
+-v $PDK_ROOT/sky130A/libs.ref/sky130_fd_sc_hd/verilog/sky130_fd_sc_hd.v \
+-v $PDK_ROOT/sky130A/libs.ref/sky130_fd_sc_hd/verilog/primitives.v \
+--timescale 1ns/100ps \
+--bbox-unsup
diff --git a/verilog/rtl/mbist/src/core/mbist_addr_gen.sv b/verilog/rtl/mbist/src/core/mbist_addr_gen.sv
new file mode 100644
index 0000000..584a2b6
--- /dev/null
+++ b/verilog/rtl/mbist/src/core/mbist_addr_gen.sv
@@ -0,0 +1,117 @@
+///////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// MBIST Address Generator ////
+//// ////
+//// This file is part of the mbist_ctrl cores project ////
+//// https://github.com/dineshannayya/mbist_ctrl.git ////
+//// ////
+//// Description ////
+//// This block integrate mbist address gen ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.0 - 11th Oct 2021, Dinesh A ////
+//// Initial integration ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+`include "mbist_def.svh"
+
+module mbist_addr_gen
+ #( parameter BIST_ADDR_WD = 9,
+ parameter BIST_DATA_WD = 32,
+ parameter BIST_ADDR_START = 9'h000,
+ parameter BIST_ADDR_END = 9'h1F8,
+ parameter BIST_REPAIR_ADDR_START = 9'h1FC,
+ parameter BIST_RAD_WD_I = BIST_ADDR_WD,
+ parameter BIST_RAD_WD_O = BIST_ADDR_WD) (
+
+ output logic last_addr, // Last address access
+ output logic [BIST_ADDR_WD-1:0] bist_addr, // Bist Address
+ output logic sdo, // scan data output
+ input logic clk, // clock input
+ input logic rst_n, // asynchronous reset
+ input logic run, // stop or start state machine
+ input logic updown, // count up or down
+ input logic scan_shift, // shift scan input
+ input logic scan_load, // load scan input
+ input logic sdi // scan data input
+
+);
+
+
+logic [BIST_ADDR_WD-1:0] next_addr; // Next Address
+logic [BIST_ADDR_WD-1:0] start_addr; // Address Start Address
+logic [BIST_ADDR_WD-1:0] end_addr; // Address Stop Address
+
+
+assign last_addr = (((updown == 1'b1)&&(bist_addr == end_addr))||((updown == 1'b0)&&(bist_addr == start_addr)))?1'b1:1'b0;
+
+
+/******************************
+ Address register
+ Basic Assumption: Allways counter start with upcounting
+*********************************/
+
+
+always @(posedge clk or negedge rst_n) begin
+ if(!rst_n) bist_addr <= BIST_ADDR_START ;
+ else if(scan_load) bist_addr <= start_addr;
+ else bist_addr <= next_addr;
+end
+
+/* Input combinational block */
+
+always_comb begin
+ if(run) begin
+ if((bist_addr == end_addr)&&(updown == 1'b1))
+ next_addr = start_addr ;
+ else if((bist_addr == start_addr)&&(updown == 1'b0))
+ next_addr = end_addr ;
+ else next_addr = (updown)?bist_addr+1'b1:bist_addr-1'b1;
+ end
+ else next_addr = bist_addr;
+end
+
+
+/* Start register */
+
+always @(posedge clk or negedge rst_n) begin
+ if(!rst_n) start_addr <= BIST_ADDR_START ;
+ else if(scan_shift) start_addr <= {sdi, start_addr[BIST_ADDR_WD-1:1]};
+end
+
+/* Start register */
+always @(posedge clk or negedge rst_n) begin
+ if(!rst_n) end_addr <= BIST_ADDR_END ;
+ else if(scan_shift) end_addr <= {start_addr[0], end_addr[BIST_ADDR_WD-1:1]};
+end
+
+
+
+assign sdo = end_addr[0];
+
+endmodule
+
diff --git a/verilog/rtl/mbist/src/core/mbist_data_cmp.sv b/verilog/rtl/mbist/src/core/mbist_data_cmp.sv
new file mode 100644
index 0000000..45dd343
--- /dev/null
+++ b/verilog/rtl/mbist/src/core/mbist_data_cmp.sv
@@ -0,0 +1,116 @@
+///////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// MBIST Data Comparator ////
+//// ////
+//// This file is part of the mbist_ctrl cores project ////
+//// https://github.com/dineshannayya/mbist_ctrl.git ////
+//// ////
+//// Description ////
+//// This block integrate mbist data comparator ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.0 - 11th Oct 2021, Dinesh A ////
+//// Initial integration ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+`include "mbist_def.svh"
+
+
+module mbist_data_cmp
+ #( parameter BIST_ADDR_WD = 9,
+ parameter BIST_DATA_WD = 32,
+ parameter BIST_ADDR_START = 9'h000,
+ parameter BIST_ADDR_END = 9'h1F8,
+ parameter BIST_REPAIR_ADDR_START = 9'h1FC,
+ parameter BIST_RAD_WD_I = BIST_ADDR_WD,
+ parameter BIST_RAD_WD_O = BIST_ADDR_WD) (
+
+ output logic error,
+ output logic error_correct,
+ output logic correct,
+ output logic [BIST_ADDR_WD-1:0] error_addr,
+ output logic [3:0] error_cnt,
+ input logic clk,
+ input logic rst_n,
+ input logic compare,
+ input logic addr_inc_phase,
+ input logic read_invert,
+ input logic [BIST_DATA_WD-1:0] comp_data,
+ input logic [BIST_DATA_WD-1:0] rxd_data,
+ input logic [BIST_ADDR_WD-1:0] addr
+
+ );
+
+logic mask_compare;
+logic [BIST_DATA_WD-1:0] exp_data;
+logic comp_status;
+
+assign exp_data = (read_invert) ? ~comp_data: comp_data;
+
+/* Comparison register */
+
+always @(posedge clk or negedge rst_n) begin
+ if(!rst_n) begin
+ comp_status <= 1'b0;
+ error_addr <= 'b0;
+ end else if(compare && !mask_compare) begin
+ comp_status <= |(exp_data ^ rxd_data);
+ error_addr <= addr;
+ end else begin
+ comp_status <= 1'b0;
+ end
+end
+
+// Due to cycle diference between compare and write opperation
+// There is chance two error reported for same address
+// To avoid this, once error is detected, comparision is masked
+// unit the next address phase
+always @(posedge clk or negedge rst_n) begin
+ if(!rst_n) begin
+ error_cnt <= 'b0;
+ correct <='b0;
+ mask_compare <= 'b0;
+ error <= '0;
+ end else if(mask_compare && addr_inc_phase) begin
+ mask_compare <= 1'b0;
+ end else if(comp_status && (error_cnt < BIST_ERR_LIMIT) ) begin
+ error_cnt <= error_cnt+1;
+ mask_compare <= 1'b1;
+ correct <='b1;
+ end else if(comp_status && (error_cnt == BIST_ERR_LIMIT) ) begin
+ error <= '1;
+ end
+end
+
+assign error_correct = (error_cnt < BIST_ERR_LIMIT) ? comp_status : 1'b0;
+
+endmodule
+
+
+
+
+
+
diff --git a/verilog/rtl/mbist/src/core/mbist_fsm.sv b/verilog/rtl/mbist/src/core/mbist_fsm.sv
new file mode 100644
index 0000000..7672ee7
--- /dev/null
+++ b/verilog/rtl/mbist/src/core/mbist_fsm.sv
@@ -0,0 +1,141 @@
+///////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// MBIST Main control FSM ////
+//// ////
+//// This file is part of the mbist_ctrl cores project ////
+//// https://github.com/dineshannayya/mbist_ctrl.git ////
+//// ////
+//// Description ////
+//// MBIST Main control FSM to control Command, Address, Write ////
+//// and Read compare phase ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.0 - 11th Oct 2021, Dinesh A ////
+//// Initial integration ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+module mbist_fsm
+ #( parameter BIST_ADDR_WD = 9,
+ parameter BIST_DATA_WD = 32,
+ parameter BIST_ADDR_START = 9'h000,
+ parameter BIST_ADDR_END = 9'h1F8,
+ parameter BIST_REPAIR_ADDR_START = 9'h1FC,
+ parameter BIST_RAD_WD_I = BIST_ADDR_WD,
+ parameter BIST_RAD_WD_O = BIST_ADDR_WD) (
+
+ output logic cmd_phase, // Command Phase
+ output logic cmp_phase, // Compare Phase
+ output logic run_op, // Move to Next Operation
+ output logic run_addr, // Move to Next Address
+ output logic run_sti, // Move to Next Stimulus
+ output logic run_pat, // Move to next pattern
+ output logic bist_done, // Bist Test Done
+
+
+ input logic clk, // Clock
+ input logic rst_n, // Reset
+ input logic bist_run, // Bist Run
+ input logic bist_error, // Bist Error
+ input logic op_reverse, // Address Reverse in Next Cycle
+ input logic last_op, // Last Operation
+ input logic last_addr, // Last Address
+ input logic last_sti, // Last Stimulus
+ input logic last_pat // Last Pattern
+
+
+);
+
+parameter FSM_PHASE1 = 2'b00;
+parameter FSM_PHASE2 = 2'b01;
+parameter FSM_EXIT = 2'b10;
+
+logic [1:0] state;
+
+
+
+always @(posedge clk or negedge rst_n)
+begin
+ if(!rst_n) begin
+ cmd_phase <= 0;
+ cmp_phase <= 0;
+ run_op <= 0;
+ run_addr <= 0;
+ run_sti <= 0;
+ run_pat <= 0;
+ bist_done <= 0;
+ state <= FSM_PHASE1;
+ end else if(bist_run) begin
+ case(state)
+ FSM_PHASE1 :
+ begin
+ cmd_phase <= 1;
+ cmp_phase <= 0;
+ run_op <= 0;
+ run_addr <= 0;
+ run_sti <= 0;
+ run_pat <= 0;
+ state <= FSM_PHASE2;
+ end
+ FSM_PHASE2 :
+ begin
+ if((last_addr && last_op && last_sti && last_pat) || bist_error) begin
+ cmd_phase <= 0;
+ cmp_phase <= 0;
+ run_op <= 0;
+ run_addr <= 0;
+ run_sti <= 0;
+ run_pat <= 0;
+ state <= FSM_EXIT;
+ end else begin
+ cmd_phase <= 0;
+ cmp_phase <= 1;
+ run_op <= 1;
+ if(last_op && !(last_addr && op_reverse))
+ run_addr <= 1;
+ if(last_addr && last_op)
+ run_sti <= 1;
+ if(last_addr && last_op && last_sti)
+ run_pat <= 1;
+ state <= FSM_PHASE1;
+ end
+ end
+ FSM_EXIT: bist_done <= 1;
+ default: state <= FSM_PHASE1;
+ endcase
+ end else begin
+ cmd_phase <= 0;
+ cmp_phase <= 0;
+ run_op <= 0;
+ run_addr <= 0;
+ run_sti <= 0;
+ run_pat <= 0;
+ state <= FSM_PHASE1;
+ end
+end
+
+
+
+endmodule
diff --git a/verilog/rtl/mbist/src/core/mbist_mem_wrapper.sv b/verilog/rtl/mbist/src/core/mbist_mem_wrapper.sv
new file mode 100644
index 0000000..b631626
--- /dev/null
+++ b/verilog/rtl/mbist/src/core/mbist_mem_wrapper.sv
@@ -0,0 +1,120 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Memory wrapper ////
+//// ////
+//// This file is part of the mbist_ctrl project ////
+//// https://github.com/dineshannayya/mbist_ctrl.git ////
+//// ////
+//// Description ////
+//// This block does wishbone to SRAM signal mapping ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.1 - 18 Nov 2021, Dinesh A ////
+//// initial version ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+module mbist_mem_wrapper #(
+ parameter BIST_ADDR_WD=10,
+ parameter BIST_DATA_WD=32) (
+ input logic rst_n ,
+ // WB I/F
+ input logic wb_clk_i , // System clock
+ input logic wb_cyc_i , // strobe/request
+ input logic wb_stb_i , // strobe/request
+ input logic [BIST_ADDR_WD-1:0] wb_adr_i , // address
+ input logic wb_we_i , // write
+ input logic [BIST_DATA_WD-1:0] wb_dat_i , // data output
+ input logic [BIST_DATA_WD/8-1:0] wb_sel_i , // byte enable
+ output logic [BIST_DATA_WD-1:0] wb_dat_o , // data input
+ output logic wb_ack_o , // acknowlegement
+ output logic wb_err_o , // error
+ // MEM A PORT
+ output logic func_clk_a ,
+ output logic func_cen_a ,
+ output logic [BIST_ADDR_WD-1:0] func_addr_a ,
+ input logic [BIST_DATA_WD-1:0] func_dout_a ,
+
+ // Functional B Port
+ output logic func_clk_b ,
+ output logic func_cen_b ,
+ output logic func_web_b ,
+ output logic [BIST_DATA_WD/8-1:0] func_mask_b ,
+ output logic [BIST_ADDR_WD-1:0] func_addr_b ,
+ output logic [BIST_DATA_WD-1:0] func_din_b
+
+);
+
+
+// Memory Write PORT
+assign func_clk_b = wb_clk_i;
+assign func_cen_b = !wb_stb_i;
+assign func_web_b = !wb_we_i;
+assign func_mask_b = wb_sel_i;
+assign func_addr_b = wb_adr_i;
+assign func_din_b = wb_dat_i;
+
+assign func_clk_a = wb_clk_i;
+assign func_cen_a = (wb_stb_i == 1'b1 && wb_we_i == 1'b0 && wb_ack_o ==0) ? 1'b0 : 1'b1;
+assign func_addr_a = wb_adr_i;
+assign wb_dat_o = func_dout_a;
+
+assign wb_err_o = 1'b0;
+
+// Generate Once cycle delayed ACK to get the data from SRAM
+always_ff @(negedge rst_n or posedge wb_clk_i) begin
+ if ( rst_n == 1'b0 ) begin
+ wb_ack_o<= 'h0;
+ end else begin
+ wb_ack_o <= (wb_stb_i == 1'b1) & (wb_ack_o == 0);
+ end
+end
+
+
+endmodule
diff --git a/verilog/rtl/mbist/src/core/mbist_mux.sv b/verilog/rtl/mbist/src/core/mbist_mux.sv
new file mode 100755
index 0000000..c3064f8
--- /dev/null
+++ b/verilog/rtl/mbist/src/core/mbist_mux.sv
@@ -0,0 +1,247 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// MBIST and MEMORY Mux Control Selection ////
+//// ////
+//// This file is part of the mbist_ctrl cores project ////
+//// https://github.com/dineshannayya/mbist_ctrl.git ////
+//// ////
+//// Description ////
+//// This block integrate MBIST and Memory control selection ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.0 - 11th Oct 2021, Dinesh A ////
+//// Initial integration
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+`include "mbist_def.svh"
+module mbist_mux
+ #( parameter BIST_ADDR_WD = 9,
+ parameter BIST_DATA_WD = 32,
+ parameter BIST_ADDR_START = 9'h000,
+ parameter BIST_ADDR_END = 9'h1F8,
+ parameter BIST_REPAIR_ADDR_START = 9'h1FC,
+ parameter BIST_RAD_WD_I = BIST_ADDR_WD,
+ parameter BIST_RAD_WD_O = BIST_ADDR_WD) (
+
+ input logic scan_mode,
+ input logic cfg_mem_lphase,
+
+ input logic rst_n,
+ // MBIST CTRL SIGNAL
+ input logic bist_en,
+ input logic [BIST_ADDR_WD-1:0] bist_addr,
+ input logic [BIST_DATA_WD-1:0] bist_wdata,
+ input logic bist_clk,
+ input logic bist_wr,
+ input logic bist_rd,
+ input logic bist_error,
+ input logic [BIST_ADDR_WD-1:0] bist_error_addr,
+ output logic bist_correct,
+ input logic bist_sdi,
+ input logic bist_shift,
+ output logic bist_sdo,
+
+ // FUNCTIONAL CTRL SIGNAL
+ input logic func_clk_a,
+ input logic func_cen_a,
+ input logic [BIST_ADDR_WD-1:0] func_addr_a,
+ // Common for func and Mbist i/f
+ output logic [BIST_DATA_WD-1:0] func_dout_a,
+
+ input logic func_clk_b,
+ input logic func_cen_b,
+ input logic func_web_b,
+ input logic [BIST_DATA_WD/8-1:0] func_mask_b,
+ input logic [BIST_ADDR_WD-1:0] func_addr_b,
+ input logic [BIST_DATA_WD-1:0] func_din_b,
+
+
+ // towards memory
+ output logic mem_clk_a,
+ output logic mem_cen_a,
+ output logic [BIST_ADDR_WD-1:0] mem_addr_a,
+ input logic [BIST_DATA_WD-1:0] mem_dout_a,
+
+ output logic mem_clk_b,
+ output logic mem_cen_b,
+ output logic mem_web_b,
+ output logic [BIST_DATA_WD/8-1:0] mem_mask_b,
+ output logic [BIST_ADDR_WD-1:0] mem_addr_b,
+ output logic [BIST_DATA_WD-1:0] mem_din_b
+ );
+
+
+parameter BIST_MASK_WD = BIST_DATA_WD/8;
+
+wire [BIST_ADDR_WD-1:0] addr_a;
+wire [BIST_ADDR_WD-1:0] addr_b;
+wire mem_clk_a_cts; // used for internal clock tree
+wire mem_clk_b_cts; // usef for internal clock tree
+
+//----------------------------------------------------------------
+// As there SRAM timing model is not correct. we have created
+// additional position drive data in negedge
+// ----------------------------------------------------------------
+
+logic mem_cen_a_int;
+logic [BIST_ADDR_WD-1:0] mem_addr_a_int;
+
+logic mem_cen_b_int;
+logic mem_web_b_int;
+logic [BIST_DATA_WD/8-1:0] mem_mask_b_int;
+logic [BIST_ADDR_WD-1:0] mem_addr_b_int;
+logic [BIST_DATA_WD-1:0] mem_din_b_int;
+
+logic mem_cen_a_neg;
+logic [BIST_ADDR_WD-1:0] mem_addr_a_neg;
+
+logic mem_cen_b_neg;
+logic mem_web_b_neg;
+logic [BIST_DATA_WD/8-1:0] mem_mask_b_neg;
+logic [BIST_ADDR_WD-1:0] mem_addr_b_neg;
+logic [BIST_DATA_WD-1:0] mem_din_b_neg;
+
+always @(negedge rst_n or negedge mem_clk_a) begin
+ if(rst_n == 0) begin
+ mem_cen_a_neg <= '0;
+ mem_addr_a_neg <= '0;
+ end else begin
+ mem_cen_a_neg <= mem_cen_a_int;
+ mem_addr_a_neg <= mem_addr_a_int;
+ end
+end
+
+always @(negedge rst_n or negedge mem_clk_b) begin
+ if(rst_n == 0) begin
+ mem_cen_b_neg <= '0;
+ mem_web_b_neg <= '0;
+ mem_mask_b_neg <= '0;
+ mem_addr_b_neg <= '0;
+ mem_din_b_neg <= '0;
+ end else begin
+ mem_cen_b_neg <= mem_cen_b_int;
+ mem_web_b_neg <= mem_web_b_int;
+ mem_mask_b_neg <= mem_mask_b_int;
+ mem_addr_b_neg <= mem_addr_b_int;
+ mem_din_b_neg <= mem_din_b_int;
+ end
+end
+
+assign mem_cen_a = (cfg_mem_lphase == 0) ? mem_cen_a_int : mem_cen_a_neg;
+assign mem_addr_a = (cfg_mem_lphase == 0) ? mem_addr_a_int : mem_addr_a_neg;
+
+assign mem_cen_b = (cfg_mem_lphase == 0) ? mem_cen_b_int : mem_cen_b_neg;
+assign mem_web_b = (cfg_mem_lphase == 0) ? mem_web_b_int : mem_web_b_neg;
+assign mem_mask_b = (cfg_mem_lphase == 0) ? mem_mask_b_int : mem_mask_b_neg;
+assign mem_addr_b = (cfg_mem_lphase == 0) ? mem_addr_b_int : mem_addr_b_neg;
+assign mem_din_b = (cfg_mem_lphase == 0) ? mem_din_b_int : mem_din_b_neg;
+
+//-----------------------------------------
+assign addr_a = (bist_en) ? bist_addr : func_addr_a;
+assign addr_b = (bist_en) ? bist_addr : func_addr_b;
+
+assign mem_cen_a_int = (bist_en) ? !bist_rd : func_cen_a;
+assign mem_cen_b_int = (bist_en) ? !bist_wr : func_cen_b;
+
+assign mem_web_b_int = (bist_en) ? !bist_wr : func_web_b;
+assign mem_mask_b_int = (bist_en) ? {{BIST_MASK_WD}{1'b1}} : func_mask_b;
+
+//assign mem_clk_a = (bist_en) ? bist_clk : func_clk_a;
+//assign mem_clk_b = (bist_en) ? bist_clk : func_clk_b;
+
+ctech_mux2x1 u_mem_clk_a_sel (.A0 (func_clk_a),.A1 (bist_clk),.S (bist_en), .X (mem_clk_a));
+ctech_mux2x1 u_mem_clk_b_sel (.A0 (func_clk_b),.A1 (bist_clk),.S (bist_en), .X (mem_clk_b));
+
+ctech_clk_buf u_cts_mem_clk_a (.A (mem_clk_a), . X(mem_clk_a_cts));
+ctech_clk_buf u_cts_mem_clk_b (.A (mem_clk_b), . X(mem_clk_b_cts));
+
+assign mem_din_b_int = (bist_en) ? bist_wdata : func_din_b;
+
+
+// During scan, SRAM data is unknown, feed data in back to avoid unknow
+// propagation
+assign func_dout_a = (scan_mode) ? mem_din_b : mem_dout_a;
+
+mbist_repair_addr
+ #(.BIST_ADDR_WD (BIST_ADDR_WD),
+ .BIST_DATA_WD (BIST_DATA_WD),
+ .BIST_ADDR_START (BIST_ADDR_START),
+ .BIST_ADDR_END (BIST_ADDR_END),
+ .BIST_REPAIR_ADDR_START (BIST_REPAIR_ADDR_START),
+ .BIST_RAD_WD_I (BIST_RAD_WD_I),
+ .BIST_RAD_WD_O (BIST_RAD_WD_O))
+ u_repair_A(
+ .AddressOut (mem_addr_a_int ),
+ .Correct (bist_correct ),
+ .sdo (bist_sdo ),
+
+ .AddressIn (addr_a ),
+ .clk (mem_clk_a_cts ),
+ .rst_n (rst_n ),
+ .Error (bist_error ),
+ .ErrorAddr (bist_error_addr ),
+ .scan_shift (bist_shift ),
+ .sdi (bist_sdi )
+);
+
+mbist_repair_addr
+ #(.BIST_ADDR_WD (BIST_ADDR_WD),
+ .BIST_DATA_WD (BIST_DATA_WD),
+ .BIST_ADDR_START (BIST_ADDR_START),
+ .BIST_ADDR_END (BIST_ADDR_END),
+ .BIST_REPAIR_ADDR_START (BIST_REPAIR_ADDR_START),
+ .BIST_RAD_WD_I (BIST_RAD_WD_I),
+ .BIST_RAD_WD_O (BIST_RAD_WD_O))
+ u_repair_B(
+ .AddressOut (mem_addr_b_int ),
+ .Correct ( ), // Both Bist Correct are same
+ .sdo ( ),
+
+ .AddressIn (addr_b ),
+ .clk (mem_clk_b_cts ),
+ .rst_n (rst_n ),
+ .Error (bist_error ),
+ .ErrorAddr (bist_error_addr ),
+ .scan_shift (1'b0 ), // Both Repair hold same address
+ .sdi (1'b0 )
+);
+
+
+
+
+endmodule
+
+
+
+
+
+
+
+
+
+
+
diff --git a/verilog/rtl/mbist/src/core/mbist_op_sel.sv b/verilog/rtl/mbist/src/core/mbist_op_sel.sv
new file mode 100644
index 0000000..a995b8e
--- /dev/null
+++ b/verilog/rtl/mbist/src/core/mbist_op_sel.sv
@@ -0,0 +1,132 @@
+///////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// MBIST Operation Selection ////
+//// ////
+//// This file is part of the mbist_ctrl cores project ////
+//// https://github.com/dineshannayya/mbist_ctrl.git ////
+//// ////
+//// Description ////
+//// This block integrate Operation Selection ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.0 - 11th Oct 2021, Dinesh A ////
+//// Initial integration ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+
+`include "mbist_def.svh"
+// bist stimulus selection
+
+module mbist_op_sel
+ #( parameter BIST_ADDR_WD = 9,
+ parameter BIST_DATA_WD = 32,
+ parameter BIST_ADDR_START = 9'h000,
+ parameter BIST_ADDR_END = 9'h1F8,
+ parameter BIST_REPAIR_ADDR_START = 9'h1FC,
+ parameter BIST_RAD_WD_I = BIST_ADDR_WD,
+ parameter BIST_RAD_WD_O = BIST_ADDR_WD) (
+
+ output logic op_read , // Opertion Read
+ output logic op_write , // Operation Write
+ output logic op_invert , // Opertaion Data Invert
+ output logic op_updown , // Operation Address Up Down
+ output logic op_reverse , // Operation Reverse
+ output logic op_repeatflag , // Operation Repeat flag
+ output logic sdo , // Scan Data Out
+ output logic last_op , // last operation
+
+ input logic clk , // Clock
+ input logic rst_n , // Reset
+ input logic scan_shift , // Scan Shift
+ input logic sdi , // Scan data in
+ input logic re_init , // Re-init when there is error correction
+ input logic run , // Run
+ input logic [BIST_STI_WD-1:0] stimulus
+
+);
+
+
+logic [BIST_OP_SIZE-1:0] op_sel ;// Actual Operation
+logic [7:0] tmp_op ;// Warning : Assming Max opertion is 8
+logic [7:0] tmpinvert ;// read control
+logic [7:0] tmpread ;// write control
+logic [7:0] tmpwrite ;// invertor control
+integer index ;// output index */
+integer loop ;// bit count
+
+
+/* Operation Selection Selection */
+
+always @(posedge clk or negedge rst_n) begin
+ if(!rst_n) op_sel <= {1'b1,{(BIST_OP_SIZE-1){1'b0}}};
+ else if(scan_shift) op_sel <= {sdi, op_sel[BIST_OP_SIZE-1:1]};
+ else if(re_init) op_sel <= {1'b1,{(BIST_OP_SIZE-1){1'b0}}}; // need fix for pmbist moode
+ else if(run) op_sel <= {op_sel[0],op_sel[BIST_OP_SIZE-1:1]};
+end
+
+assign op_updown = stimulus[BIST_STI_WD-1];
+assign op_reverse = stimulus[BIST_STI_WD-2];
+assign op_repeatflag = stimulus[BIST_STI_WD-3];
+// Re-wind the operation, when the is error correct
+assign last_op = (re_init) ? 1'b0 : op_sel[0];
+
+
+
+always_comb
+begin
+ loop=0;
+ tmpinvert = 8'h0;
+ tmpread = 8'h0;
+ tmpwrite = 8'h0;
+ for(index = 0 ; index < BIST_OP_SIZE ; index = index+1)begin
+ tmpinvert[index] = stimulus[loop];
+ tmpread[index] = stimulus[loop+1];
+ tmpwrite[index] = stimulus[loop+2];
+ loop = loop + 3;
+ end
+end
+
+
+always_comb
+begin
+ tmp_op = 8'b00000000;
+ tmp_op[BIST_OP_SIZE-1:0] = op_sel;
+ case(tmp_op)
+ 8'b10000000: {op_read,op_write,op_invert} = {tmpread[7],tmpwrite[7],tmpinvert[7]};
+ 8'b01000000: {op_read,op_write,op_invert} = {tmpread[6],tmpwrite[6],tmpinvert[6]};
+ 8'b00100000: {op_read,op_write,op_invert} = {tmpread[5],tmpwrite[5],tmpinvert[5]};
+ 8'b00010000: {op_read,op_write,op_invert} = {tmpread[4],tmpwrite[4],tmpinvert[4]};
+ 8'b00001000: {op_read,op_write,op_invert} = {tmpread[3],tmpwrite[3],tmpinvert[3]};
+ 8'b00000100: {op_read,op_write,op_invert} = {tmpread[2],tmpwrite[2],tmpinvert[2]};
+ 8'b00000010: {op_read,op_write,op_invert} = {tmpread[1],tmpwrite[1],tmpinvert[1]};
+ 8'b00000001: {op_read,op_write,op_invert} = {tmpread[0],tmpwrite[0],tmpinvert[0]};
+ default: {op_read,op_write,op_invert} = {tmpread[0],tmpwrite[0],tmpinvert[0]};
+ endcase
+end
+
+
+endmodule
diff --git a/verilog/rtl/mbist/src/core/mbist_pat_sel.sv b/verilog/rtl/mbist/src/core/mbist_pat_sel.sv
new file mode 100644
index 0000000..47a5c98
--- /dev/null
+++ b/verilog/rtl/mbist/src/core/mbist_pat_sel.sv
@@ -0,0 +1,116 @@
+///////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// MBIST Pattern Selection ////
+//// ////
+//// This file is part of the mbist_ctrl cores project ////
+//// https://github.com/dineshannayya/mbist_ctrl.git ////
+//// ////
+//// Description ////
+//// This block integrate mbist pattern selection ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.0 - 11th Oct 2021, Dinesh A ////
+//// Initial integration ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+`include "mbist_def.svh"
+//-----------------------------------
+// MBIST Data Pattern Selection Logic
+//-----------------------------------
+module mbist_pat_sel
+ #( parameter BIST_ADDR_WD = 9,
+ parameter BIST_DATA_WD = 32,
+ parameter BIST_ADDR_START = 9'h000,
+ parameter BIST_ADDR_END = 9'h1F8,
+ parameter BIST_REPAIR_ADDR_START = 9'h1FC,
+ parameter BIST_RAD_WD_I = BIST_ADDR_WD,
+ parameter BIST_RAD_WD_O = BIST_ADDR_WD) (
+
+ output logic pat_last, // Last pattern
+ output logic [BIST_DATA_WD-1:0] pat_data, // pattern data
+ output logic sdo, // scan data output
+ input logic clk, // clock
+ input logic rst_n, // reset
+ input logic run, // stop or start state machine
+ input logic scan_shift, // scan shift
+ input logic sdi // scan input
+
+);
+
+
+logic [BIST_DATA_PAT_SIZE-1:0] pat_sel ;/* Pattern Select */
+logic [63:0] pattern;
+
+integer index ;/* output index */
+
+
+
+// last pattern
+assign pat_last = pat_sel[0];
+
+
+/* Pattern Selection */
+
+always @(posedge clk or negedge rst_n) begin
+ if(!rst_n) pat_sel <= {1'b1,{(BIST_DATA_PAT_SIZE-1){1'b0}}};
+ else if(scan_shift) pat_sel <= {sdi, pat_sel[BIST_DATA_PAT_SIZE-1:1]};
+ else if(run) pat_sel <= {pat_sel[0],pat_sel[BIST_DATA_PAT_SIZE-1:1]};
+end
+
+
+/* Pattern Selection */
+logic [7:0] tmp_pat;
+always_comb
+begin
+ tmp_pat = 8'b00000000;
+ tmp_pat[7:8-BIST_DATA_PAT_SIZE] = pat_sel;
+ case(tmp_pat)
+ 8'b10000000: pattern = BIST_DATA_PAT_TYPE1;
+ 8'b01000000: pattern = BIST_DATA_PAT_TYPE2;
+ 8'b00100000: pattern = BIST_DATA_PAT_TYPE3;
+ 8'b00010000: pattern = BIST_DATA_PAT_TYPE4;
+ 8'b00001000: pattern = BIST_DATA_PAT_TYPE5;
+ 8'b00000100: pattern = BIST_DATA_PAT_TYPE6;
+ 8'b00000010: pattern = BIST_DATA_PAT_TYPE7;
+ 8'b00000001: pattern = BIST_DATA_PAT_TYPE8;
+ default: pattern = BIST_DATA_PAT_TYPE1;
+ endcase
+end
+
+/* Data distributor */
+
+always_comb
+begin
+ for(index = 0 ; index < BIST_DATA_WD ; index = index + 1) begin
+ pat_data[index] = pattern[index%64];
+ end
+end
+
+assign sdo = pat_sel[0];
+
+endmodule
+
+
diff --git a/verilog/rtl/mbist/src/core/mbist_repair_addr.sv b/verilog/rtl/mbist/src/core/mbist_repair_addr.sv
new file mode 100644
index 0000000..dbeddcd
--- /dev/null
+++ b/verilog/rtl/mbist/src/core/mbist_repair_addr.sv
@@ -0,0 +1,157 @@
+///////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// MBIST Address Repair ////
+//// ////
+//// This file is part of the mbist_ctrl cores project ////
+//// https://github.com/dineshannayya/mbist_ctrl.git ////
+//// ////
+//// Description ////
+//// This block integrate mbist address repair ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.0 - 11th Oct 2021, Dinesh A ////
+//// Initial integration ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+
+// BIST address Repair Logic
+
+`include "mbist_def.svh"
+
+module mbist_repair_addr
+ #( parameter BIST_ADDR_WD = 9,
+ parameter BIST_DATA_WD = 32,
+ parameter BIST_ADDR_START = 9'h000,
+ parameter BIST_ADDR_END = 9'h1F8,
+ parameter BIST_REPAIR_ADDR_START = 9'h1FC,
+ parameter BIST_RAD_WD_I = BIST_ADDR_WD,
+ parameter BIST_RAD_WD_O = BIST_ADDR_WD) (
+
+ output logic [BIST_RAD_WD_O-1:0] AddressOut,
+ output logic Correct,
+ output logic sdo, // scan data output
+
+ input logic [BIST_RAD_WD_I-1:0] AddressIn,
+ input logic clk,
+ input logic rst_n,
+ input logic Error,
+ input logic [BIST_RAD_WD_I-1:0] ErrorAddr,
+ input logic scan_shift, // shift scan input
+ input logic sdi // scan data input
+
+
+);
+
+logic [3:0] ErrorCnt; // Assumed Maximum Error correction is less than 16
+logic [15:0] shift_reg;
+logic [15:0] shift_load;
+logic [7:0] shift_cnt;
+logic scan_shift_d;
+logic shift_pos_edge;
+
+logic [BIST_RAD_WD_I-1:0] RepairMem [0:BIST_ERR_LIMIT-1];
+integer i;
+
+
+always@(posedge clk or negedge rst_n)
+begin
+ if(!rst_n) begin
+ ErrorCnt <= '0;
+ Correct <= '0;
+ // Initialize the Repair RAM for SCAN purpose
+ for(i =0; i < BIST_ERR_LIMIT; i = i+1) begin
+ RepairMem[i] = 'h0;
+ end
+ end else if(Error) begin
+ if(ErrorCnt <= BIST_ERR_LIMIT) begin
+ ErrorCnt <= ErrorCnt+1;
+ RepairMem[ErrorCnt] <= ErrorAddr;
+ Correct <= 1'b1;
+ end else begin
+ Correct <= 1'b0;
+ end
+ end
+end
+
+integer index;
+logic eFlag; // Indicate error fix
+
+always_comb
+begin
+ AddressOut = AddressIn;
+ eFlag = 0;
+ for(index=0; index < BIST_ERR_LIMIT; index=index+1) begin
+ if(ErrorCnt > index && AddressIn == RepairMem[index]) begin
+ AddressOut = BIST_REPAIR_ADDR_START+index;
+ eFlag = 1;
+ end
+ end
+end
+
+/********************************************
+* Serial shifting the Repair address
+* *******************************************/
+
+always@(posedge clk or negedge rst_n)
+begin
+ if(!rst_n) begin
+ shift_reg <= '0;
+ shift_cnt <= '0;
+ scan_shift_d <= 1'b0;
+ end else begin
+ if(scan_shift && (shift_cnt[7:4] < BIST_ERR_LIMIT)) begin
+ shift_cnt <= shift_cnt+1;
+ end
+ scan_shift_d <= scan_shift;
+ shift_reg <= shift_load;
+ end
+end
+
+// Detect scan_shift pos edge
+assign shift_pos_edge = (scan_shift_d ==0) && (scan_shift);
+
+always_comb
+begin
+ shift_load = shift_reg;
+ // Block the data reloading every pos edge of shift
+ if(scan_shift && ((shift_cnt[7:4]+1) < BIST_ERR_LIMIT) && (shift_cnt[3:0] == 4'b1111))
+ shift_load = {RepairMem[shift_cnt[7:4]+1]};
+ else if(scan_shift)
+ shift_load = {sdi,shift_reg[15:1]};
+ else
+ shift_load = {RepairMem[shift_cnt[7:4]]};
+
+end
+
+assign sdo = shift_reg[0];
+endmodule
+
+
+
+
+
+
diff --git a/verilog/rtl/mbist/src/core/mbist_sti_sel.sv b/verilog/rtl/mbist/src/core/mbist_sti_sel.sv
new file mode 100644
index 0000000..459dc9f
--- /dev/null
+++ b/verilog/rtl/mbist/src/core/mbist_sti_sel.sv
@@ -0,0 +1,105 @@
+///////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// MBIST Stimulus Selection ////
+//// ////
+//// This file is part of the mbist_ctrl cores project ////
+//// https://github.com/dineshannayya/mbist_ctrl.git ////
+//// ////
+//// Description ////
+//// This block integrate stimulus slectiion ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.0 - 11th Oct 2021, Dinesh A ////
+//// Initial integration ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+
+`include "mbist_def.svh"
+// bist stimulus selection
+
+module mbist_sti_sel
+ #( parameter BIST_ADDR_WD = 9,
+ parameter BIST_DATA_WD = 32,
+ parameter BIST_ADDR_START = 9'h000,
+ parameter BIST_ADDR_END = 9'h1F8,
+ parameter BIST_REPAIR_ADDR_START = 9'h1FC,
+ parameter BIST_RAD_WD_I = BIST_ADDR_WD,
+ parameter BIST_RAD_WD_O = BIST_ADDR_WD) (
+
+ output logic sdo , // Scan Data Out
+ output logic last_stimulus , // last stimulus
+ output logic [BIST_STI_WD-1:0] stimulus ,
+
+ input logic clk , // Clock
+ input logic rst_n , // Reset
+ input logic scan_shift , // Scan Shift
+ input logic sdi , // Scan data in
+ input logic run // Run
+
+);
+
+logic [BIST_STI_SIZE-1:0] sti_sel ; // Stimulation Selection
+logic [7:0] tmp_sti ; // Warning: Max Stimulus assmed is 8
+
+
+
+/* Pattern Selection */
+
+always @(posedge clk or negedge rst_n) begin
+ if(!rst_n) sti_sel <= {1'b1,{(BIST_STI_SIZE-1){1'b0}}};
+ else if(scan_shift) sti_sel <= {sdi, sti_sel[BIST_STI_SIZE-1:1]};
+ else if(run) sti_sel <= {sti_sel[0],sti_sel[BIST_STI_SIZE-1:1]};
+end
+
+
+/* Pattern Selection */
+always_comb
+begin
+ tmp_sti = 8'b00000000;
+ tmp_sti[7:8-BIST_STI_SIZE] = sti_sel;
+ case(tmp_sti)
+ 8'b10000000: stimulus = BIST_STIMULUS_TYPE1;
+ 8'b01000000: stimulus = BIST_STIMULUS_TYPE2;
+ 8'b00100000: stimulus = BIST_STIMULUS_TYPE3;
+ 8'b00010000: stimulus = BIST_STIMULUS_TYPE4;
+ 8'b00001000: stimulus = BIST_STIMULUS_TYPE5;
+ 8'b00000100: stimulus = BIST_STIMULUS_TYPE6;
+ 8'b00000010: stimulus = BIST_STIMULUS_TYPE7;
+ 8'b00000001: stimulus = BIST_STIMULUS_TYPE8;
+ default: stimulus = BIST_STIMULUS_TYPE1;
+ endcase
+end
+
+
+/* Assign output */
+
+assign sdo = sti_sel[0];
+assign last_stimulus = sti_sel[0];
+
+
+
+endmodule
diff --git a/verilog/rtl/mbist/src/top/mbist_top.sv b/verilog/rtl/mbist/src/top/mbist_top.sv
new file mode 100644
index 0000000..806ce13
--- /dev/null
+++ b/verilog/rtl/mbist/src/top/mbist_top.sv
@@ -0,0 +1,566 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// MBIST TOP ////
+//// ////
+//// This file is part of the mbist_ctrl cores project ////
+//// https://github.com/dineshannayya/mbist_ctrl.git ////
+//// ////
+//// Description ////
+//// This block integrate mbist controller with row ////
+//// redendency feature ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.0 - 11th Oct 2021, Dinesh A ////
+//// Initial integration ////
+//// 0.1 - 26th Oct 2021, Dinesh A ////
+//// Fixed Error Address are serial shifted through ////
+//// sdi/sdo ////
+//// 0.2 - 15 Dec 2021, Dinesh A ////
+//// Added support for common MBIST for 4 SRAM ////
+//// 0.3 - 29th Dec 2021, Dinesh A ////
+//// yosys synthesis issue for two dimension variable ////
+//// changed the variable defination from logic to wire ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+`include "mbist_def.svh"
+module mbist_top
+ #(
+ parameter BIST_NO_SRAM = 4,
+ parameter BIST_ADDR_WD = 9,
+ parameter BIST_DATA_WD = 32,
+ parameter BIST_ADDR_START = 9'h000,
+ parameter BIST_ADDR_END = 9'h1FB,
+ parameter BIST_REPAIR_ADDR_START = 9'h1FC,
+ parameter BIST_RAD_WD_I = BIST_ADDR_WD,
+ parameter BIST_RAD_WD_O = BIST_ADDR_WD) (
+
+`ifdef USE_POWER_PINS
+ inout vccd1, // User area 1 1.8V supply
+ inout vssd1, // User area 1 digital ground
+`endif
+
+ // Clock Skew Adjust
+ input wire wbd_clk_int,
+ output wire wbd_clk_mbist,
+ input wire [3:0] cfg_cska_mbist, // clock skew adjust for web host
+
+ input logic rst_n,
+
+ // MBIST I/F
+ input wire bist_en,
+ input wire bist_run,
+ input wire bist_shift,
+ input wire bist_load,
+ input wire bist_sdi,
+
+ output wire [3:0] bist_error_cnt0,
+ output wire [3:0] bist_error_cnt1,
+ output wire [3:0] bist_error_cnt2,
+ output wire [3:0] bist_error_cnt3,
+ output wire [BIST_NO_SRAM-1:0] bist_correct ,
+ output wire [BIST_NO_SRAM-1:0] bist_error ,
+ output wire bist_done,
+ output wire bist_sdo,
+
+
+ // WB I/F
+ input wire wb_clk_i, // System clock
+ input wire wb_clk2_i, // System clock2 is no cts
+ input wire mem_req, // strobe/request
+ input wire [(BIST_NO_SRAM+1)/2-1:0] mem_cs,
+ input wire [BIST_ADDR_WD-1:0] mem_addr, // address
+ input wire mem_we , // write
+ input wire [BIST_DATA_WD-1:0] mem_wdata, // data output
+ input wire [BIST_DATA_WD/8-1:0] mem_wmask, // byte enable
+ output wire [BIST_DATA_WD-1:0] mem_rdata, // data input
+
+ // towards memory
+ // PORT-A
+ output wire [BIST_NO_SRAM-1:0] mem_clk_a,
+ output wire [BIST_ADDR_WD-1:0] mem_addr_a0,
+ output wire [BIST_ADDR_WD-1:0] mem_addr_a1,
+ output wire [BIST_ADDR_WD-1:0] mem_addr_a2,
+ output wire [BIST_ADDR_WD-1:0] mem_addr_a3,
+ output wire [BIST_NO_SRAM-1:0] mem_cen_a,
+ output wire [BIST_NO_SRAM-1:0] mem_web_a,
+ output wire [BIST_DATA_WD/8-1:0] mem_mask_a0,
+ output wire [BIST_DATA_WD/8-1:0] mem_mask_a1,
+ output wire [BIST_DATA_WD/8-1:0] mem_mask_a2,
+ output wire [BIST_DATA_WD/8-1:0] mem_mask_a3,
+ output wire [BIST_DATA_WD-1:0] mem_din_a0,
+ output wire [BIST_DATA_WD-1:0] mem_din_a1,
+ output wire [BIST_DATA_WD-1:0] mem_din_a2,
+ output wire [BIST_DATA_WD-1:0] mem_din_a3,
+
+ input wire [BIST_DATA_WD-1:0] mem_dout_a0,
+ input wire [BIST_DATA_WD-1:0] mem_dout_a1,
+ input wire [BIST_DATA_WD-1:0] mem_dout_a2,
+ input wire [BIST_DATA_WD-1:0] mem_dout_a3,
+
+
+ // PORT-B
+ output wire [BIST_NO_SRAM-1:0] mem_clk_b,
+ output wire [BIST_NO_SRAM-1:0] mem_cen_b,
+ output wire [BIST_ADDR_WD-1:0] mem_addr_b0,
+ output wire [BIST_ADDR_WD-1:0] mem_addr_b1,
+ output wire [BIST_ADDR_WD-1:0] mem_addr_b2,
+ output wire [BIST_ADDR_WD-1:0] mem_addr_b3
+
+
+
+
+);
+
+parameter NO_SRAM_WD = (BIST_NO_SRAM+1)/2;
+
+// FUNCTIONAL PORT
+wire func_clk[0:BIST_NO_SRAM-1];
+wire func_cen[0:BIST_NO_SRAM-1];
+wire func_web[0:BIST_NO_SRAM-1];
+wire [BIST_DATA_WD/8-1:0]func_mask[0:BIST_NO_SRAM-1];
+wire [BIST_ADDR_WD-1:0]func_addr[0:BIST_NO_SRAM-1];
+wire [BIST_DATA_WD-1:0]func_dout[0:BIST_NO_SRAM-1];
+wire [BIST_DATA_WD-1:0]func_din[0:BIST_NO_SRAM-1];
+
+//----------------------------------------------------
+// Local variable defination
+// ---------------------------------------------------
+//
+wire srst_n ; // sync reset w.r.t bist_clk
+wire cmd_phase ; // Command Phase
+wire cmp_phase ; // Compare Phase
+wire run_op ; // Run next Operation
+wire run_addr ; // Run Next Address
+wire run_sti ; // Run Next Stimulus
+wire run_pat ; // Run Next Pattern
+wire op_updown ; // Adress updown direction
+wire last_addr ; // last address indication
+wire last_sti ; // last stimulus
+wire last_op ; // last operation
+wire last_pat ; // last pattern
+wire [BIST_DATA_WD-1:0] pat_data ; // Selected Data Pattern
+wire [BIST_STI_WD-1:0] stimulus ; // current stimulus
+wire compare ; // compare data
+wire op_repeatflag;
+wire op_reverse;
+wire op_read ;
+wire op_write ;
+wire op_invert ;
+
+
+wire bist_error_correct[0:BIST_NO_SRAM-1] ;
+wire [BIST_ADDR_WD-1:0]bist_error_addr[0:BIST_NO_SRAM-1] ; // bist address
+
+wire [BIST_ADDR_WD-1:0]bist_addr ; // bist address
+wire [BIST_DATA_WD-1:0] bist_wdata ; // bist write data
+wire bist_wr ;
+wire bist_rd ;
+wire [BIST_DATA_WD-1:0] wb_dat[0:BIST_NO_SRAM-1]; // data input
+
+//--------------------------------------------------------
+// As yosys does not support two dimensional var,
+// converting it single dimension
+// -------------------------------------------------------
+wire [3:0] bist_error_cnt_i [0:BIST_NO_SRAM-1];
+
+assign bist_error_cnt0 = bist_error_cnt_i[0];
+assign bist_error_cnt1 = bist_error_cnt_i[1];
+assign bist_error_cnt2 = bist_error_cnt_i[2];
+assign bist_error_cnt3 = bist_error_cnt_i[3];
+
+
+// Towards MEMORY PORT - A
+wire [BIST_ADDR_WD-1:0] mem_addr_a_i[0:BIST_NO_SRAM-1];
+wire [BIST_DATA_WD/8-1:0] mem_mask_a_i[0:BIST_NO_SRAM-1];
+wire [BIST_DATA_WD-1:0] mem_dout_a_i[0:BIST_NO_SRAM-1];
+wire [BIST_DATA_WD-1:0] mem_din_a_i[0:BIST_NO_SRAM-1];
+
+assign mem_addr_a0 = mem_addr_a_i[0];
+assign mem_addr_a1 = mem_addr_a_i[1];
+assign mem_addr_a2 = mem_addr_a_i[2];
+assign mem_addr_a3 = mem_addr_a_i[3];
+
+assign mem_din_a0 = mem_din_a_i[0];
+assign mem_din_a1 = mem_din_a_i[1];
+assign mem_din_a2 = mem_din_a_i[2];
+assign mem_din_a3 = mem_din_a_i[3];
+
+assign mem_mask_a0= mem_mask_a_i[0];
+assign mem_mask_a1= mem_mask_a_i[1];
+assign mem_mask_a2= mem_mask_a_i[2];
+assign mem_mask_a3= mem_mask_a_i[3];
+
+// FROM MEMORY
+assign mem_dout_a_i[0] = mem_dout_a0;
+assign mem_dout_a_i[1] = mem_dout_a1;
+assign mem_dout_a_i[2] = mem_dout_a2;
+assign mem_dout_a_i[3] = mem_dout_a3;
+
+// Towards MEMORY PORT - A
+assign mem_clk_b = 'b0;
+assign mem_cen_b = 'b0;
+assign mem_addr_b0 = 'b0;
+assign mem_addr_b1 = 'b0;
+assign mem_addr_b2 = 'b0;
+assign mem_addr_b3 = 'b0;
+
+//---------------------------------------------------
+// Manage the SDI => SDO Diasy chain
+// --------------------------------------------------
+//---------------------------------
+// SDI => SDO diasy chain
+// bist_sdi => bist_addr_sdo => bist_sti_sdo => bist_op_sdo => bist_pat_sdo => bist_sdo
+// ---------------------------------
+wire bist_addr_sdo ;
+wire bist_sti_sdo ;
+wire bist_op_sdo ;
+wire bist_pat_sdo ;
+
+wire bist_ms_sdi[0:BIST_NO_SRAM-1];
+wire bist_ms_sdo[0:BIST_NO_SRAM-1];
+
+// Adjust the SDI => SDO Daisy chain
+assign bist_ms_sdi[0] = bist_pat_sdo;
+assign bist_ms_sdi[1] = bist_ms_sdo[0];
+assign bist_ms_sdi[2] = bist_ms_sdo[1];
+assign bist_ms_sdi[3] = bist_ms_sdo[2];
+assign bist_sdo = bist_ms_sdo[3];
+
+// Pick the correct read path
+assign mem_rdata = wb_dat[mem_cs];
+
+assign bist_wr = (cmd_phase && op_write);
+assign bist_rd = (cmd_phase && op_read);
+
+assign compare = (cmp_phase && op_read);
+assign bist_wdata = (op_invert) ? ~pat_data : pat_data;
+
+// Clock Tree branching to avoid clock latency towards SRAM path
+wire wb_clk_b1,wb_clk_b2;
+//ctech_clk_buf u_cts_wb_clk_b1 (.A (wb_clk_i), . X(wb_clk_b1));
+//ctech_clk_buf u_cts_wb_clk_b2 (.A (wb_clk_i), . X(wb_clk_b2));
+
+// wb_host clock skew control
+clk_skew_adjust u_skew_mbist
+ (
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1 ),// User area 1 1.8V supply
+ .vssd1 (vssd1 ),// User area 1 digital ground
+`endif
+ .clk_in (wbd_clk_int ),
+ .sel (cfg_cska_mbist ),
+ .clk_out (wbd_clk_mbist )
+ );
+
+reset_sync u_reset_sync (
+ .scan_mode (1'b0 ),
+ .dclk (wb_clk_i ), // Destination clock domain
+ .arst_n (rst_n ), // active low async reset
+ .srst_n (srst_n )
+ );
+
+
+integer i;
+reg bist_error_and;
+reg bist_error_correct_or;
+
+always_comb begin
+ bist_error_and =0;
+ bist_error_correct_or = 0;
+ for(i=0; i <BIST_NO_SRAM; i = i+1) begin
+ bist_error_and = bist_error_and & bist_error[i];
+ bist_error_correct_or = bist_error_correct_or | bist_error_correct[i];
+ end
+end
+
+
+// bist main control FSM
+
+mbist_fsm
+ #(
+ .BIST_ADDR_WD (BIST_ADDR_WD ),
+ .BIST_DATA_WD (BIST_DATA_WD ),
+ .BIST_ADDR_START (BIST_ADDR_START ),
+ .BIST_ADDR_END (BIST_ADDR_END ),
+ .BIST_REPAIR_ADDR_START (BIST_REPAIR_ADDR_START ),
+ .BIST_RAD_WD_I (BIST_RAD_WD_I ),
+ .BIST_RAD_WD_O (BIST_RAD_WD_O )
+ )
+ u_fsm (
+
+ .cmd_phase (cmd_phase ),
+ .cmp_phase (cmp_phase ),
+ .run_op (run_op ),
+ .run_addr (run_addr ),
+ .run_sti (run_sti ),
+ .run_pat (run_pat ),
+ .bist_done (bist_done ),
+
+
+ .clk (wb_clk_i ),
+ .rst_n (srst_n ),
+ .bist_run (bist_run ),
+ .last_op (last_op ),
+ .last_addr (last_addr ),
+ .last_sti (last_sti ),
+ .last_pat (last_pat ),
+ .op_reverse (op_reverse ),
+ .bist_error (bist_error_and )
+);
+
+
+// bist address generation
+mbist_addr_gen
+ #(
+ .BIST_ADDR_WD (BIST_ADDR_WD ),
+ .BIST_DATA_WD (BIST_DATA_WD ),
+ .BIST_ADDR_START (BIST_ADDR_START ),
+ .BIST_ADDR_END (BIST_ADDR_END ),
+ .BIST_REPAIR_ADDR_START (BIST_REPAIR_ADDR_START ),
+ .BIST_RAD_WD_I (BIST_RAD_WD_I ),
+ .BIST_RAD_WD_O (BIST_RAD_WD_O )
+ )
+ u_addr_gen(
+ .last_addr (last_addr ),
+ .bist_addr (bist_addr ),
+ .sdo (bist_addr_sdo ),
+
+ .clk (wb_clk_i ),
+ .rst_n (srst_n ),
+ .run (run_addr ),
+ .updown (op_updown ),
+ .bist_shift (bist_shift ),
+ .bist_load (bist_load ),
+ .sdi (bist_sdi )
+
+);
+
+
+// BIST current stimulus selection
+mbist_sti_sel
+ #(
+ .BIST_ADDR_WD (BIST_ADDR_WD ),
+ .BIST_DATA_WD (BIST_DATA_WD ),
+ .BIST_ADDR_START (BIST_ADDR_START ),
+ .BIST_ADDR_END (BIST_ADDR_END ),
+ .BIST_REPAIR_ADDR_START (BIST_REPAIR_ADDR_START ),
+ .BIST_RAD_WD_I (BIST_RAD_WD_I ),
+ .BIST_RAD_WD_O (BIST_RAD_WD_O )
+ )
+ u_sti_sel(
+
+ .sdo (bist_sti_sdo ),
+ .last_stimulus (last_sti ),
+ .stimulus (stimulus ),
+
+ .clk (wb_clk_i ),
+ .rst_n (srst_n ),
+ .scan_shift (bist_shift ),
+ .sdi (bist_addr_sdo ),
+ .run (run_sti )
+
+);
+
+
+// Bist Operation selection
+mbist_op_sel
+ #(
+ .BIST_ADDR_WD (BIST_ADDR_WD ),
+ .BIST_DATA_WD (BIST_DATA_WD ),
+ .BIST_ADDR_START (BIST_ADDR_START ),
+ .BIST_ADDR_END (BIST_ADDR_END ),
+ .BIST_REPAIR_ADDR_START (BIST_REPAIR_ADDR_START ),
+ .BIST_RAD_WD_I (BIST_RAD_WD_I ),
+ .BIST_RAD_WD_O (BIST_RAD_WD_O )
+ )
+ u_op_sel (
+
+ .op_read (op_read ),
+ .op_write (op_write ),
+ .op_invert (op_invert ),
+ .op_updown (op_updown ),
+ .op_reverse (op_reverse ),
+ .op_repeatflag (op_repeatflag ),
+ .sdo (bist_op_sdo ),
+ .last_op (last_op ),
+
+ .clk (wb_clk_i ),
+ .rst_n (srst_n ),
+ .scan_shift (bist_shift ),
+ .sdi (bist_sti_sdo ),
+ .re_init (bist_error_correct_or ),
+ .run (run_op ),
+ .stimulus (stimulus )
+
+ );
+
+
+
+mbist_pat_sel
+ #(
+ .BIST_ADDR_WD (BIST_ADDR_WD ),
+ .BIST_DATA_WD (BIST_DATA_WD ),
+ .BIST_ADDR_START (BIST_ADDR_START ),
+ .BIST_ADDR_END (BIST_ADDR_END ),
+ .BIST_REPAIR_ADDR_START (BIST_REPAIR_ADDR_START ),
+ .BIST_RAD_WD_I (BIST_RAD_WD_I ),
+ .BIST_RAD_WD_O (BIST_RAD_WD_O )
+ )
+ u_pat_sel (
+ .pat_last (last_pat ),
+ .pat_data (pat_data ),
+ .sdo (bist_pat_sdo ),
+ .clk (wb_clk_i ),
+ .rst_n (srst_n ),
+ .run (run_pat ),
+ .scan_shift (bist_shift ),
+ .sdi (bist_op_sdo )
+
+ );
+
+
+
+
+
+genvar sram_no;
+generate
+for (sram_no = 0; $unsigned(sram_no) < BIST_NO_SRAM; sram_no=sram_no+1) begin : mem_no
+
+
+mbist_data_cmp
+ #(
+ .BIST_ADDR_WD (BIST_ADDR_WD ),
+ .BIST_DATA_WD (BIST_DATA_WD ),
+ .BIST_ADDR_START (BIST_ADDR_START ),
+ .BIST_ADDR_END (BIST_ADDR_END ),
+ .BIST_REPAIR_ADDR_START (BIST_REPAIR_ADDR_START ),
+ .BIST_RAD_WD_I (BIST_RAD_WD_I ),
+ .BIST_RAD_WD_O (BIST_RAD_WD_O )
+ )
+
+
+ u_cmp (
+ .error (bist_error[sram_no] ),
+ .error_correct (bist_error_correct[sram_no] ),
+ .correct ( ), // same signal available at bist mux
+ .error_addr (bist_error_addr[sram_no] ),
+ .error_cnt (bist_error_cnt_i[sram_no] ),
+ .clk (wb_clk_i ),
+ .rst_n (srst_n ),
+ .addr_inc_phase (run_addr ),
+ .compare (compare ),
+ .read_invert (op_invert ),
+ .comp_data (pat_data ),
+ .rxd_data (func_dout[sram_no] ),
+ .addr (bist_addr )
+
+ );
+
+ // WB To Memory Signal Mapping
+ mbist_mem_wrapper #(
+ .BIST_NO_SRAM (BIST_NO_SRAM ),
+ .BIST_ADDR_WD (BIST_ADDR_WD ),
+ .BIST_DATA_WD (BIST_DATA_WD )
+ ) u_mem_wrapper_(
+ .rst_n (srst_n ),
+ // WB I/F
+ .sram_id (NO_SRAM_WD'(sram_no) ),
+ .wb_clk_i (wb_clk2_i ), // System clock
+ .mem_cs (mem_cs ), // Chip Select
+ .mem_req (mem_req ), // strobe/request
+ .mem_addr (mem_addr ), // address
+ .mem_we (mem_we ), // write
+ .mem_wdata (mem_wdata ), // data output
+ .mem_wmask (mem_wmask ), // byte enable
+ .mem_rdata (wb_dat[sram_no] ), // data input
+ // MEM A PORT
+ .func_clk (func_clk[sram_no] ),
+ .func_cen (func_cen[sram_no] ),
+ .func_web (func_web[sram_no] ),
+ .func_mask (func_mask[sram_no] ),
+ .func_addr (func_addr[sram_no] ),
+ .func_din (func_din[sram_no] ),
+ .func_dout (func_dout[sram_no] )
+ );
+
+
+mbist_mux
+ #(
+ .BIST_ADDR_WD (BIST_ADDR_WD ),
+ .BIST_DATA_WD (BIST_DATA_WD ),
+ .BIST_ADDR_START (BIST_ADDR_START ),
+ .BIST_ADDR_END (BIST_ADDR_END ),
+ .BIST_REPAIR_ADDR_START (BIST_REPAIR_ADDR_START ),
+ .BIST_RAD_WD_I (BIST_RAD_WD_I ),
+ .BIST_RAD_WD_O (BIST_RAD_WD_O )
+ )
+ u_mem_sel (
+
+ .scan_mode (1'b0 ),
+
+ .rst_n (srst_n ),
+ // MBIST CTRL SIGNAL
+ .bist_en (bist_en ),
+ .bist_addr (bist_addr ),
+ .bist_wdata (bist_wdata ),
+ .bist_clk (wb_clk2_i ),
+ .bist_wr (bist_wr ),
+ .bist_rd (bist_rd ),
+ .bist_error (bist_error_correct[sram_no]),
+ .bist_error_addr (bist_error_addr[sram_no] ),
+ .bist_correct (bist_correct[sram_no] ),
+ .bist_sdi (bist_ms_sdi[sram_no] ),
+ .bist_load (bist_load ),
+ .bist_shift (bist_shift ),
+ .bist_sdo (bist_ms_sdo[sram_no] ),
+
+ // FUNCTIONAL CTRL SIGNAL
+ .func_clk (func_clk[sram_no] ),
+ .func_cen (func_cen[sram_no] ),
+ .func_web (func_web[sram_no] ),
+ .func_mask (func_mask[sram_no] ),
+ .func_addr (func_addr[sram_no] ),
+ .func_din (func_din[sram_no] ),
+ .func_dout (func_dout[sram_no] ),
+
+
+ // towards memory
+ // Memory Out Port
+ .mem_clk (mem_clk_a[sram_no] ),
+ .mem_cen (mem_cen_a[sram_no] ),
+ .mem_web (mem_web_a[sram_no] ),
+ .mem_mask (mem_mask_a_i[sram_no] ),
+ .mem_addr (mem_addr_a_i[sram_no] ),
+ .mem_din (mem_din_a_i[sram_no] ),
+ .mem_dout (mem_dout_a_i[sram_no] )
+
+ );
+end
+endgenerate
+
+endmodule
+
diff --git a/verilog/rtl/mbist/src/top/mbist_top1.sv b/verilog/rtl/mbist/src/top/mbist_top1.sv
new file mode 100644
index 0000000..11b7614
--- /dev/null
+++ b/verilog/rtl/mbist/src/top/mbist_top1.sv
@@ -0,0 +1,484 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// MBIST TOP ////
+//// ////
+//// This file is part of the mbist_ctrl cores project ////
+//// https://github.com/dineshannayya/mbist_ctrl.git ////
+//// ////
+//// Description ////
+//// This block integrate mbist controller with row ////
+//// redendency feature ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.0 - 11th Oct 2021, Dinesh A ////
+//// Initial integration ////
+//// 0.1 - 26th Oct 2021, Dinesh A ////
+//// Fixed Error Address are serial shifted through ////
+//// sdi/sdo ////
+//// 0.2 - Feb 18, 2022, Dinesh A ////
+//// Addition SRAM data launch phase selection option ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+`include "mbist_def.svh"
+module mbist_top1
+ #( parameter SCW = 8, // SCAN CHAIN WIDTH
+ parameter BIST_ADDR_WD = 9,
+ parameter BIST_DATA_WD = 32,
+ parameter BIST_ADDR_START = 9'h000,
+ parameter BIST_ADDR_END = 9'h1FB,
+ parameter BIST_REPAIR_ADDR_START = 9'h1FC,
+ parameter BIST_RAD_WD_I = BIST_ADDR_WD,
+ parameter BIST_RAD_WD_O = BIST_ADDR_WD) (
+
+`ifdef USE_POWER_PINS
+ inout vccd1, // User area 1 1.8V supply
+ inout vssd1, // User area 1 digital ground
+`endif
+
+ // Scan I/F
+ input logic scan_en,
+ input logic scan_mode,
+ input logic [SCW-1:0] scan_si,
+ output logic [SCW-1:0] scan_so,
+ output logic scan_en_o,
+ output logic scan_mode_o,
+
+ input logic cfg_mem_lphase, // Data Towards SRAM data lanuch phase , 0 -> posedge, 1 -> negedge
+
+ // Clock Skew Adjust
+ input logic wbd_clk_int,
+ output logic wbd_clk_mbist,
+ input logic [3:0] cfg_cska_mbist, // clock skew adjust for web host
+
+ input logic rst_n,
+
+ // MBIST I/F
+ input logic bist_en,
+ input logic bist_run,
+ input logic bist_shift,
+ input logic bist_load,
+ input logic bist_sdi,
+
+ output logic [3:0] bist_error_cnt,
+ output logic bist_correct,
+ output logic bist_error,
+ output logic bist_done,
+ output logic bist_sdo,
+
+
+ // WB I/F
+ input logic wb_clk_i, // System clock
+ input logic wb_cyc_i, // strobe/request
+ input logic wb_stb_i, // strobe/request
+ input logic [BIST_ADDR_WD-1:0] wb_adr_i, // address
+ input logic wb_we_i , // write
+ input logic [BIST_DATA_WD-1:0] wb_dat_i, // data output
+ input logic [BIST_DATA_WD/8-1:0] wb_sel_i, // byte enable
+ output logic [BIST_DATA_WD-1:0] wb_dat_o, // data input
+ output logic wb_ack_o, // acknowlegement
+ output logic wb_err_o, // error
+
+ // towards memory
+ // PORT-A
+ output logic mem_clk_a,
+ output logic [BIST_ADDR_WD-1:0]mem_addr_a,
+ output logic mem_cen_a,
+ output logic [BIST_DATA_WD-1:0]mem_din_b,
+ // PORT-B
+ output logic mem_clk_b,
+ output logic mem_cen_b,
+ output logic mem_web_b,
+ output logic [BIST_DATA_WD/8-1:0]mem_mask_b,
+ output logic [BIST_ADDR_WD-1:0]mem_addr_b,
+ input logic [BIST_DATA_WD-1:0]mem_dout_a
+
+
+
+
+);
+
+// FUNCTIONAL A PORT
+logic func_clk_a;
+logic func_cen_a;
+logic [BIST_ADDR_WD-1:0]func_addr_a;
+logic [BIST_DATA_WD-1:0]func_dout_a;
+
+// Functional B Port
+logic func_clk_b;
+logic func_cen_b;
+logic func_web_b;
+logic [BIST_DATA_WD/8-1:0]func_mask_b;
+logic [BIST_ADDR_WD-1:0]func_addr_b;
+logic [BIST_DATA_WD-1:0]func_din_b;
+//----------------------------------------------------
+// Local variable defination
+// ---------------------------------------------------
+//
+logic srst_n ; // sync reset w.r.t bist_clk
+logic cmd_phase ; // Command Phase
+logic cmp_phase ; // Compare Phase
+logic run_op ; // Run next Operation
+logic run_addr ; // Run Next Address
+logic run_sti ; // Run Next Stimulus
+logic run_pat ; // Run Next Pattern
+logic op_updown ; // Adress updown direction
+logic last_addr ; // last address indication
+logic last_sti ; // last stimulus
+logic last_op ; // last operation
+logic last_pat ; // last pattern
+logic [BIST_DATA_WD-1:0] pat_data ; // Selected Data Pattern
+logic [BIST_STI_WD-1:0] stimulus ; // current stimulus
+logic compare ; // compare data
+logic op_repeatflag;
+logic op_reverse;
+logic op_read ;
+logic op_write ;
+logic op_invert ;
+
+//---------------------------------
+// SDI => SDO diasy chain
+// bist_sdi => bist_addr_sdo => bist_sti_sdo => bist_op_sdo => bist_pat_sdo => bist_sdo
+// ---------------------------------
+logic bist_addr_sdo ;
+logic bist_sti_sdo ;
+logic bist_op_sdo ;
+logic bist_pat_sdo ;
+
+logic bist_error_correct ;
+logic [BIST_ADDR_WD-1:0]bist_error_addr ; // bist address
+
+logic [BIST_ADDR_WD-1:0]bist_addr ; // bist address
+logic [BIST_DATA_WD-1:0] bist_wdata ; // bist write data
+logic bist_wr ;
+logic bist_rd ;
+
+assign scan_en_o = scan_en;
+assign scan_mode_o = scan_mode;
+
+assign bist_wr = (cmd_phase && op_write);
+assign bist_rd = (cmd_phase && op_read);
+
+assign compare = (cmp_phase && op_read);
+assign bist_wdata = (op_invert) ? ~pat_data : pat_data;
+
+// Clock Tree branching to avoid clock latency towards SRAM path
+wire wb_clk_b1,wb_clk_b2;
+ctech_clk_buf u_cts_wb_clk_b1 (.A (wb_clk_i), . X(wb_clk_b1));
+ctech_clk_buf u_cts_wb_clk_b2 (.A (wb_clk_i), . X(wb_clk_b2));
+
+// wb_host clock skew control
+clk_skew_adjust u_skew_mbist
+ (
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1 ),// User area 1 1.8V supply
+ .vssd1 (vssd1 ),// User area 1 digital ground
+`endif
+ .clk_in (wbd_clk_int ),
+ .sel (cfg_cska_mbist ),
+ .clk_out (wbd_clk_mbist )
+ );
+
+reset_sync u_reset_sync (
+ .scan_mode (scan_mode ),
+ .dclk (wb_clk_b1 ), // Destination clock domain
+ .arst_n (rst_n ), // active low async reset
+ .srst_n (srst_n )
+ );
+
+
+
+// bist main control FSM
+
+mbist_fsm
+ #(
+ .BIST_ADDR_WD (BIST_ADDR_WD ),
+ .BIST_DATA_WD (BIST_DATA_WD ),
+ .BIST_ADDR_START (BIST_ADDR_START ),
+ .BIST_ADDR_END (BIST_ADDR_END ),
+ .BIST_REPAIR_ADDR_START (BIST_REPAIR_ADDR_START ),
+ .BIST_RAD_WD_I (BIST_RAD_WD_I ),
+ .BIST_RAD_WD_O (BIST_RAD_WD_O )
+ )
+ u_fsm (
+
+ .cmd_phase (cmd_phase ),
+ .cmp_phase (cmp_phase ),
+ .run_op (run_op ),
+ .run_addr (run_addr ),
+ .run_sti (run_sti ),
+ .run_pat (run_pat ),
+ .bist_done (bist_done ),
+
+
+ .clk (wb_clk_b1 ),
+ .rst_n (srst_n ),
+ .bist_run (bist_run ),
+ .last_op (last_op ),
+ .last_addr (last_addr ),
+ .last_sti (last_sti ),
+ .last_pat (last_pat ),
+ .op_reverse (op_reverse ),
+ .bist_error (bist_error )
+);
+
+
+// bist address generation
+mbist_addr_gen
+ #(
+ .BIST_ADDR_WD (BIST_ADDR_WD ),
+ .BIST_DATA_WD (BIST_DATA_WD ),
+ .BIST_ADDR_START (BIST_ADDR_START ),
+ .BIST_ADDR_END (BIST_ADDR_END ),
+ .BIST_REPAIR_ADDR_START (BIST_REPAIR_ADDR_START ),
+ .BIST_RAD_WD_I (BIST_RAD_WD_I ),
+ .BIST_RAD_WD_O (BIST_RAD_WD_O )
+ )
+ u_addr_gen(
+ .last_addr (last_addr ),
+ .bist_addr (bist_addr ),
+ .sdo (bist_addr_sdo ),
+
+ .clk (wb_clk_b1 ),
+ .rst_n (srst_n ),
+ .run (run_addr ),
+ .updown (op_updown ),
+ .scan_shift (bist_shift ),
+ .scan_load (bist_load ),
+ .sdi (bist_sdi )
+
+);
+
+
+// BIST current stimulus selection
+mbist_sti_sel
+ #(
+ .BIST_ADDR_WD (BIST_ADDR_WD ),
+ .BIST_DATA_WD (BIST_DATA_WD ),
+ .BIST_ADDR_START (BIST_ADDR_START ),
+ .BIST_ADDR_END (BIST_ADDR_END ),
+ .BIST_REPAIR_ADDR_START (BIST_REPAIR_ADDR_START ),
+ .BIST_RAD_WD_I (BIST_RAD_WD_I ),
+ .BIST_RAD_WD_O (BIST_RAD_WD_O )
+ )
+ u_sti_sel(
+
+ .sdo (bist_sti_sdo ),
+ .last_stimulus (last_sti ),
+ .stimulus (stimulus ),
+
+ .clk (wb_clk_b1 ),
+ .rst_n (srst_n ),
+ .scan_shift (bist_shift ),
+ .sdi (bist_addr_sdo ),
+ .run (run_sti )
+
+);
+
+
+// Bist Operation selection
+mbist_op_sel
+ #(
+ .BIST_ADDR_WD (BIST_ADDR_WD ),
+ .BIST_DATA_WD (BIST_DATA_WD ),
+ .BIST_ADDR_START (BIST_ADDR_START ),
+ .BIST_ADDR_END (BIST_ADDR_END ),
+ .BIST_REPAIR_ADDR_START (BIST_REPAIR_ADDR_START ),
+ .BIST_RAD_WD_I (BIST_RAD_WD_I ),
+ .BIST_RAD_WD_O (BIST_RAD_WD_O )
+ )
+ u_op_sel (
+
+ .op_read (op_read ),
+ .op_write (op_write ),
+ .op_invert (op_invert ),
+ .op_updown (op_updown ),
+ .op_reverse (op_reverse ),
+ .op_repeatflag (op_repeatflag ),
+ .sdo (bist_op_sdo ),
+ .last_op (last_op ),
+
+ .clk (wb_clk_b1 ),
+ .rst_n (srst_n ),
+ .scan_shift (bist_shift ),
+ .sdi (bist_sti_sdo ),
+ .re_init (bist_error_correct ),
+ .run (run_op ),
+ .stimulus (stimulus )
+
+ );
+
+
+
+mbist_pat_sel
+ #(
+ .BIST_ADDR_WD (BIST_ADDR_WD ),
+ .BIST_DATA_WD (BIST_DATA_WD ),
+ .BIST_ADDR_START (BIST_ADDR_START ),
+ .BIST_ADDR_END (BIST_ADDR_END ),
+ .BIST_REPAIR_ADDR_START (BIST_REPAIR_ADDR_START ),
+ .BIST_RAD_WD_I (BIST_RAD_WD_I ),
+ .BIST_RAD_WD_O (BIST_RAD_WD_O )
+ )
+ u_pat_sel (
+ .pat_last (last_pat ),
+ .pat_data (pat_data ),
+ .sdo (bist_pat_sdo ),
+ .clk (wb_clk_b1 ),
+ .rst_n (srst_n ),
+ .run (run_pat ),
+ .scan_shift (bist_shift ),
+ .sdi (bist_op_sdo )
+
+ );
+
+
+mbist_data_cmp
+ #(
+ .BIST_ADDR_WD (BIST_ADDR_WD ),
+ .BIST_DATA_WD (BIST_DATA_WD ),
+ .BIST_ADDR_START (BIST_ADDR_START ),
+ .BIST_ADDR_END (BIST_ADDR_END ),
+ .BIST_REPAIR_ADDR_START (BIST_REPAIR_ADDR_START ),
+ .BIST_RAD_WD_I (BIST_RAD_WD_I ),
+ .BIST_RAD_WD_O (BIST_RAD_WD_O )
+ )
+
+
+ u_cmp (
+ .error (bist_error ),
+ .error_correct (bist_error_correct ),
+ .correct ( ), // same signal available at bist mux
+ .error_addr (bist_error_addr ),
+ .error_cnt (bist_error_cnt ),
+ .clk (wb_clk_b1 ),
+ .rst_n (srst_n ),
+ .addr_inc_phase (run_addr ),
+ .compare (compare ),
+ .read_invert (op_invert ),
+ .comp_data (pat_data ),
+ .rxd_data (func_dout_a ),
+ .addr (bist_addr )
+
+ );
+
+
+mbist_mem_wrapper #(
+ .BIST_ADDR_WD (BIST_ADDR_WD ),
+ .BIST_DATA_WD (BIST_DATA_WD )
+ ) u_mem_wrapper(
+ .rst_n (srst_n ),
+ // WB I/F
+ .wb_clk_i (wb_clk_b2 ), // System clock
+ .wb_cyc_i (wb_cyc_i ), // strobe/request
+ .wb_stb_i (wb_stb_i ), // strobe/request
+ .wb_adr_i (wb_adr_i ), // address
+ .wb_we_i (wb_we_i ), // write
+ .wb_dat_i (wb_dat_i ), // data output
+ .wb_sel_i (wb_sel_i ), // byte enable
+ .wb_dat_o (wb_dat_o ), // data input
+ .wb_ack_o (wb_ack_o ), // acknowlegement
+ .wb_err_o (wb_err_o ), // error
+ // MEM A PORT
+ .func_clk_a (func_clk_a ),
+ .func_cen_a (func_cen_a ),
+ .func_addr_a (func_addr_a ),
+ .func_dout_a (func_dout_a ),
+
+ // Functional B Port
+ .func_clk_b (func_clk_b ),
+ .func_cen_b (func_cen_b ),
+ .func_web_b (func_web_b ),
+ .func_mask_b (func_mask_b ),
+ .func_addr_b (func_addr_b ),
+ .func_din_b (func_din_b )
+ );
+
+
+mbist_mux
+ #(
+ .BIST_ADDR_WD (BIST_ADDR_WD ),
+ .BIST_DATA_WD (BIST_DATA_WD ),
+ .BIST_ADDR_START (BIST_ADDR_START ),
+ .BIST_ADDR_END (BIST_ADDR_END ),
+ .BIST_REPAIR_ADDR_START (BIST_REPAIR_ADDR_START ),
+ .BIST_RAD_WD_I (BIST_RAD_WD_I ),
+ .BIST_RAD_WD_O (BIST_RAD_WD_O )
+ )
+ u_mem_sel (
+
+ .scan_mode (scan_mode ),
+ .cfg_mem_lphase (cfg_mem_lphase),
+
+ .rst_n (srst_n ),
+ // MBIST CTRL SIGNAL
+ .bist_en (bist_en ),
+ .bist_addr (bist_addr ),
+ .bist_wdata (bist_wdata ),
+ .bist_clk (wb_clk_b2 ),
+ .bist_wr (bist_wr ),
+ .bist_rd (bist_rd ),
+ .bist_error (bist_error_correct),
+ .bist_error_addr (bist_error_addr),
+ .bist_correct (bist_correct ),
+ .bist_sdi (bist_pat_sdo),
+ .bist_shift (bist_shift),
+ .bist_sdo (bist_sdo),
+
+ // FUNCTIONAL CTRL SIGNAL
+ .func_clk_a (func_clk_a ),
+ .func_cen_a (func_cen_a ),
+ .func_addr_a (func_addr_a ),
+ // Common for func and Mbist i/f
+ .func_dout_a (func_dout_a ),
+
+ .func_clk_b (func_clk_b ),
+ .func_cen_b (func_cen_b ),
+ .func_web_b (func_web_b ),
+ .func_mask_b (func_mask_b ),
+ .func_addr_b (func_addr_b ),
+ .func_din_b (func_din_b ),
+
+
+ // towards memory
+ // Memory Out Port
+ .mem_clk_a (mem_clk_a ),
+ .mem_cen_a (mem_cen_a ),
+ .mem_addr_a (mem_addr_a ),
+ .mem_dout_a (mem_dout_a ),
+
+ // Memory Input Port
+ .mem_clk_b (mem_clk_b ),
+ .mem_cen_b (mem_cen_b ),
+ .mem_web_b (mem_web_b ),
+ .mem_mask_b (mem_mask_b ),
+ .mem_addr_b (mem_addr_b ),
+ .mem_din_b (mem_din_b )
+ );
+
+
+endmodule
+
diff --git a/verilog/rtl/mbist/src/top/mbist_top2.sv b/verilog/rtl/mbist/src/top/mbist_top2.sv
new file mode 100644
index 0000000..db832ac
--- /dev/null
+++ b/verilog/rtl/mbist/src/top/mbist_top2.sv
@@ -0,0 +1,484 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// MBIST TOP ////
+//// ////
+//// This file is part of the mbist_ctrl cores project ////
+//// https://github.com/dineshannayya/mbist_ctrl.git ////
+//// ////
+//// Description ////
+//// This block integrate mbist controller with row ////
+//// redendency feature ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.0 - 11th Oct 2021, Dinesh A ////
+//// Initial integration ////
+//// 0.1 - 26th Oct 2021, Dinesh A ////
+//// Fixed Error Address are serial shifted through ////
+//// sdi/sdo ////
+//// 0.2 - Feb 18, 2022, Dinesh A ////
+//// Addition SRAM data launch phase selection option ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+`include "mbist_def.svh"
+module mbist_top2
+ #( parameter SCW = 8, // SCAN CHAIN WIDTH
+ parameter BIST_ADDR_WD = 8,
+ parameter BIST_DATA_WD = 32,
+ parameter BIST_ADDR_START = 8'h00,
+ parameter BIST_ADDR_END = 8'hFB,
+ parameter BIST_REPAIR_ADDR_START = 8'hFC,
+ parameter BIST_RAD_WD_I = BIST_ADDR_WD,
+ parameter BIST_RAD_WD_O = BIST_ADDR_WD) (
+
+`ifdef USE_POWER_PINS
+ inout vccd1, // User area 1 1.8V supply
+ inout vssd1, // User area 1 digital ground
+`endif
+
+ // Scan I/F
+ input logic scan_en,
+ input logic scan_mode,
+ input logic [SCW-1:0] scan_si,
+ output logic [SCW-1:0] scan_so,
+ output logic scan_en_o,
+ output logic scan_mode_o,
+
+ input logic cfg_mem_lphase, // Data Towards SRAM data lanuch phase , 0 -> posedge, 1 -> negedge
+
+ // Clock Skew Adjust
+ input logic wbd_clk_int,
+ output logic wbd_clk_mbist,
+ input logic [3:0] cfg_cska_mbist, // clock skew adjust for web host
+
+ input logic rst_n,
+
+ // MBIST I/F
+ input logic bist_en,
+ input logic bist_run,
+ input logic bist_shift,
+ input logic bist_load,
+ input logic bist_sdi,
+
+ output logic [3:0] bist_error_cnt,
+ output logic bist_correct,
+ output logic bist_error,
+ output logic bist_done,
+ output logic bist_sdo,
+
+
+ // WB I/F
+ input logic wb_clk_i, // System clock
+ input logic wb_cyc_i, // strobe/request
+ input logic wb_stb_i, // strobe/request
+ input logic [BIST_ADDR_WD-1:0] wb_adr_i, // address
+ input logic wb_we_i , // write
+ input logic [BIST_DATA_WD-1:0] wb_dat_i, // data output
+ input logic [BIST_DATA_WD/8-1:0] wb_sel_i, // byte enable
+ output logic [BIST_DATA_WD-1:0] wb_dat_o, // data input
+ output logic wb_ack_o, // acknowlegement
+ output logic wb_err_o, // error
+
+ // towards memory
+ // PORT-A
+ output logic mem_clk_a,
+ output logic [BIST_ADDR_WD-1:0]mem_addr_a,
+ output logic mem_cen_a,
+ output logic [BIST_DATA_WD-1:0]mem_din_b,
+ // PORT-B
+ output logic mem_clk_b,
+ output logic mem_cen_b,
+ output logic mem_web_b,
+ output logic [BIST_DATA_WD/8-1:0]mem_mask_b,
+ output logic [BIST_ADDR_WD-1:0]mem_addr_b,
+ input logic [BIST_DATA_WD-1:0]mem_dout_a
+
+
+
+
+);
+
+// FUNCTIONAL A PORT
+logic func_clk_a;
+logic func_cen_a;
+logic [BIST_ADDR_WD-1:0]func_addr_a;
+logic [BIST_DATA_WD-1:0]func_dout_a;
+
+// Functional B Port
+logic func_clk_b;
+logic func_cen_b;
+logic func_web_b;
+logic [BIST_DATA_WD/8-1:0]func_mask_b;
+logic [BIST_ADDR_WD-1:0]func_addr_b;
+logic [BIST_DATA_WD-1:0]func_din_b;
+//----------------------------------------------------
+// Local variable defination
+// ---------------------------------------------------
+//
+logic srst_n ; // sync reset w.r.t bist_clk
+logic cmd_phase ; // Command Phase
+logic cmp_phase ; // Compare Phase
+logic run_op ; // Run next Operation
+logic run_addr ; // Run Next Address
+logic run_sti ; // Run Next Stimulus
+logic run_pat ; // Run Next Pattern
+logic op_updown ; // Adress updown direction
+logic last_addr ; // last address indication
+logic last_sti ; // last stimulus
+logic last_op ; // last operation
+logic last_pat ; // last pattern
+logic [BIST_DATA_WD-1:0] pat_data ; // Selected Data Pattern
+logic [BIST_STI_WD-1:0] stimulus ; // current stimulus
+logic compare ; // compare data
+logic op_repeatflag;
+logic op_reverse;
+logic op_read ;
+logic op_write ;
+logic op_invert ;
+
+//---------------------------------
+// SDI => SDO diasy chain
+// bist_sdi => bist_addr_sdo => bist_sti_sdo => bist_op_sdo => bist_pat_sdo => bist_sdo
+// ---------------------------------
+logic bist_addr_sdo ;
+logic bist_sti_sdo ;
+logic bist_op_sdo ;
+logic bist_pat_sdo ;
+
+logic bist_error_correct ;
+logic [BIST_ADDR_WD-1:0]bist_error_addr ; // bist address
+
+logic [BIST_ADDR_WD-1:0]bist_addr ; // bist address
+logic [BIST_DATA_WD-1:0] bist_wdata ; // bist write data
+logic bist_wr ;
+logic bist_rd ;
+
+assign scan_en_o = scan_en;
+assign scan_mode_o = scan_mode;
+
+assign bist_wr = (cmd_phase && op_write);
+assign bist_rd = (cmd_phase && op_read);
+
+assign compare = (cmp_phase && op_read);
+assign bist_wdata = (op_invert) ? ~pat_data : pat_data;
+
+// Clock Tree branching to avoid clock latency towards SRAM path
+wire wb_clk_b1,wb_clk_b2;
+ctech_clk_buf u_cts_wb_clk_b1 (.A (wb_clk_i), . X(wb_clk_b1));
+ctech_clk_buf u_cts_wb_clk_b2 (.A (wb_clk_i), . X(wb_clk_b2));
+
+// wb_host clock skew control
+clk_skew_adjust u_skew_mbist
+ (
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1 ),// User area 1 1.8V supply
+ .vssd1 (vssd1 ),// User area 1 digital ground
+`endif
+ .clk_in (wbd_clk_int ),
+ .sel (cfg_cska_mbist ),
+ .clk_out (wbd_clk_mbist )
+ );
+
+reset_sync u_reset_sync (
+ .scan_mode (scan_mode ),
+ .dclk (wb_clk_b1 ), // Destination clock domain
+ .arst_n (rst_n ), // active low async reset
+ .srst_n (srst_n )
+ );
+
+
+
+// bist main control FSM
+
+mbist_fsm
+ #(
+ .BIST_ADDR_WD (BIST_ADDR_WD ),
+ .BIST_DATA_WD (BIST_DATA_WD ),
+ .BIST_ADDR_START (BIST_ADDR_START ),
+ .BIST_ADDR_END (BIST_ADDR_END ),
+ .BIST_REPAIR_ADDR_START (BIST_REPAIR_ADDR_START ),
+ .BIST_RAD_WD_I (BIST_RAD_WD_I ),
+ .BIST_RAD_WD_O (BIST_RAD_WD_O )
+ )
+ u_fsm (
+
+ .cmd_phase (cmd_phase ),
+ .cmp_phase (cmp_phase ),
+ .run_op (run_op ),
+ .run_addr (run_addr ),
+ .run_sti (run_sti ),
+ .run_pat (run_pat ),
+ .bist_done (bist_done ),
+
+
+ .clk (wb_clk_b1 ),
+ .rst_n (srst_n ),
+ .bist_run (bist_run ),
+ .last_op (last_op ),
+ .last_addr (last_addr ),
+ .last_sti (last_sti ),
+ .last_pat (last_pat ),
+ .op_reverse (op_reverse ),
+ .bist_error (bist_error )
+);
+
+
+// bist address generation
+mbist_addr_gen
+ #(
+ .BIST_ADDR_WD (BIST_ADDR_WD ),
+ .BIST_DATA_WD (BIST_DATA_WD ),
+ .BIST_ADDR_START (BIST_ADDR_START ),
+ .BIST_ADDR_END (BIST_ADDR_END ),
+ .BIST_REPAIR_ADDR_START (BIST_REPAIR_ADDR_START ),
+ .BIST_RAD_WD_I (BIST_RAD_WD_I ),
+ .BIST_RAD_WD_O (BIST_RAD_WD_O )
+ )
+ u_addr_gen(
+ .last_addr (last_addr ),
+ .bist_addr (bist_addr ),
+ .sdo (bist_addr_sdo ),
+
+ .clk (wb_clk_b1 ),
+ .rst_n (srst_n ),
+ .run (run_addr ),
+ .updown (op_updown ),
+ .scan_shift (bist_shift ),
+ .scan_load (bist_load ),
+ .sdi (bist_sdi )
+
+);
+
+
+// BIST current stimulus selection
+mbist_sti_sel
+ #(
+ .BIST_ADDR_WD (BIST_ADDR_WD ),
+ .BIST_DATA_WD (BIST_DATA_WD ),
+ .BIST_ADDR_START (BIST_ADDR_START ),
+ .BIST_ADDR_END (BIST_ADDR_END ),
+ .BIST_REPAIR_ADDR_START (BIST_REPAIR_ADDR_START ),
+ .BIST_RAD_WD_I (BIST_RAD_WD_I ),
+ .BIST_RAD_WD_O (BIST_RAD_WD_O )
+ )
+ u_sti_sel(
+
+ .sdo (bist_sti_sdo ),
+ .last_stimulus (last_sti ),
+ .stimulus (stimulus ),
+
+ .clk (wb_clk_b1 ),
+ .rst_n (srst_n ),
+ .scan_shift (bist_shift ),
+ .sdi (bist_addr_sdo ),
+ .run (run_sti )
+
+);
+
+
+// Bist Operation selection
+mbist_op_sel
+ #(
+ .BIST_ADDR_WD (BIST_ADDR_WD ),
+ .BIST_DATA_WD (BIST_DATA_WD ),
+ .BIST_ADDR_START (BIST_ADDR_START ),
+ .BIST_ADDR_END (BIST_ADDR_END ),
+ .BIST_REPAIR_ADDR_START (BIST_REPAIR_ADDR_START ),
+ .BIST_RAD_WD_I (BIST_RAD_WD_I ),
+ .BIST_RAD_WD_O (BIST_RAD_WD_O )
+ )
+ u_op_sel (
+
+ .op_read (op_read ),
+ .op_write (op_write ),
+ .op_invert (op_invert ),
+ .op_updown (op_updown ),
+ .op_reverse (op_reverse ),
+ .op_repeatflag (op_repeatflag ),
+ .sdo (bist_op_sdo ),
+ .last_op (last_op ),
+
+ .clk (wb_clk_b1 ),
+ .rst_n (srst_n ),
+ .scan_shift (bist_shift ),
+ .sdi (bist_sti_sdo ),
+ .re_init (bist_error_correct ),
+ .run (run_op ),
+ .stimulus (stimulus )
+
+ );
+
+
+
+mbist_pat_sel
+ #(
+ .BIST_ADDR_WD (BIST_ADDR_WD ),
+ .BIST_DATA_WD (BIST_DATA_WD ),
+ .BIST_ADDR_START (BIST_ADDR_START ),
+ .BIST_ADDR_END (BIST_ADDR_END ),
+ .BIST_REPAIR_ADDR_START (BIST_REPAIR_ADDR_START ),
+ .BIST_RAD_WD_I (BIST_RAD_WD_I ),
+ .BIST_RAD_WD_O (BIST_RAD_WD_O )
+ )
+ u_pat_sel (
+ .pat_last (last_pat ),
+ .pat_data (pat_data ),
+ .sdo (bist_pat_sdo ),
+ .clk (wb_clk_b1 ),
+ .rst_n (srst_n ),
+ .run (run_pat ),
+ .scan_shift (bist_shift ),
+ .sdi (bist_op_sdo )
+
+ );
+
+
+mbist_data_cmp
+ #(
+ .BIST_ADDR_WD (BIST_ADDR_WD ),
+ .BIST_DATA_WD (BIST_DATA_WD ),
+ .BIST_ADDR_START (BIST_ADDR_START ),
+ .BIST_ADDR_END (BIST_ADDR_END ),
+ .BIST_REPAIR_ADDR_START (BIST_REPAIR_ADDR_START ),
+ .BIST_RAD_WD_I (BIST_RAD_WD_I ),
+ .BIST_RAD_WD_O (BIST_RAD_WD_O )
+ )
+
+
+ u_cmp (
+ .error (bist_error ),
+ .error_correct (bist_error_correct ),
+ .correct ( ), // same signal available at bist mux
+ .error_addr (bist_error_addr ),
+ .error_cnt (bist_error_cnt ),
+ .clk (wb_clk_b1 ),
+ .rst_n (srst_n ),
+ .addr_inc_phase (run_addr ),
+ .compare (compare ),
+ .read_invert (op_invert ),
+ .comp_data (pat_data ),
+ .rxd_data (func_dout_a ),
+ .addr (bist_addr )
+
+ );
+
+
+mbist_mem_wrapper #(
+ .BIST_ADDR_WD (BIST_ADDR_WD ),
+ .BIST_DATA_WD (BIST_DATA_WD )
+ ) u_mem_wrapper(
+ .rst_n (srst_n ),
+ // WB I/F
+ .wb_clk_i (wb_clk_b2 ), // System clock
+ .wb_cyc_i (wb_cyc_i ), // strobe/request
+ .wb_stb_i (wb_stb_i ), // strobe/request
+ .wb_adr_i (wb_adr_i ), // address
+ .wb_we_i (wb_we_i ), // write
+ .wb_dat_i (wb_dat_i ), // data output
+ .wb_sel_i (wb_sel_i ), // byte enable
+ .wb_dat_o (wb_dat_o ), // data input
+ .wb_ack_o (wb_ack_o ), // acknowlegement
+ .wb_err_o (wb_err_o ), // error
+ // MEM A PORT
+ .func_clk_a (func_clk_a ),
+ .func_cen_a (func_cen_a ),
+ .func_addr_a (func_addr_a ),
+ .func_dout_a (func_dout_a ),
+
+ // Functional B Port
+ .func_clk_b (func_clk_b ),
+ .func_cen_b (func_cen_b ),
+ .func_web_b (func_web_b ),
+ .func_mask_b (func_mask_b ),
+ .func_addr_b (func_addr_b ),
+ .func_din_b (func_din_b )
+ );
+
+
+mbist_mux
+ #(
+ .BIST_ADDR_WD (BIST_ADDR_WD ),
+ .BIST_DATA_WD (BIST_DATA_WD ),
+ .BIST_ADDR_START (BIST_ADDR_START ),
+ .BIST_ADDR_END (BIST_ADDR_END ),
+ .BIST_REPAIR_ADDR_START (BIST_REPAIR_ADDR_START ),
+ .BIST_RAD_WD_I (BIST_RAD_WD_I ),
+ .BIST_RAD_WD_O (BIST_RAD_WD_O )
+ )
+ u_mem_sel (
+
+ .scan_mode (scan_mode ),
+ .cfg_mem_lphase (cfg_mem_lphase),
+
+ .rst_n (srst_n ),
+ // MBIST CTRL SIGNAL
+ .bist_en (bist_en ),
+ .bist_addr (bist_addr ),
+ .bist_wdata (bist_wdata ),
+ .bist_clk (wb_clk_b2 ),
+ .bist_wr (bist_wr ),
+ .bist_rd (bist_rd ),
+ .bist_error (bist_error_correct),
+ .bist_error_addr (bist_error_addr),
+ .bist_correct (bist_correct ),
+ .bist_sdi (bist_pat_sdo),
+ .bist_shift (bist_shift),
+ .bist_sdo (bist_sdo),
+
+ // FUNCTIONAL CTRL SIGNAL
+ .func_clk_a (func_clk_a ),
+ .func_cen_a (func_cen_a ),
+ .func_addr_a (func_addr_a ),
+ // Common for func and Mbist i/f
+ .func_dout_a (func_dout_a ),
+
+ .func_clk_b (func_clk_b ),
+ .func_cen_b (func_cen_b ),
+ .func_web_b (func_web_b ),
+ .func_mask_b (func_mask_b ),
+ .func_addr_b (func_addr_b ),
+ .func_din_b (func_din_b ),
+
+
+ // towards memory
+ // Memory Out Port
+ .mem_clk_a (mem_clk_a ),
+ .mem_cen_a (mem_cen_a ),
+ .mem_addr_a (mem_addr_a ),
+ .mem_dout_a (mem_dout_a ),
+
+ // Memory Input Port
+ .mem_clk_b (mem_clk_b ),
+ .mem_cen_b (mem_cen_b ),
+ .mem_web_b (mem_web_b ),
+ .mem_mask_b (mem_mask_b ),
+ .mem_addr_b (mem_addr_b ),
+ .mem_din_b (mem_din_b )
+ );
+
+
+endmodule
+
diff --git a/verilog/rtl/mbist_wrapper/src/mbist_wb.sv b/verilog/rtl/mbist_wrapper/src/mbist_wb.sv
new file mode 100644
index 0000000..ef989dd
--- /dev/null
+++ b/verilog/rtl/mbist_wrapper/src/mbist_wb.sv
@@ -0,0 +1,179 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//
+// MBIST wishbone Burst access to SRAM Write and Read access
+// Note: BUSRT crossing the SRAM boundary is not supported due to sram
+// 2 cycle pipe line delay
+//////////////////////////////////////////////////////////////////////
+
+module mbist_wb
+ #(
+ parameter BIST_NO_SRAM = 4,
+ parameter BIST_ADDR_WD = 9,
+ parameter BIST_DATA_WD = 32) (
+
+`ifdef USE_POWER_PINS
+ inout vccd1, // User area 1 1.8V supply
+ inout vssd1, // User area 1 digital ground
+`endif
+
+
+ input logic rst_n,
+
+
+ // WB I/F
+ input logic wb_clk_i, // System clock
+ input logic wb_stb_i, // strobe/request
+ input logic [BIST_ADDR_WD-1:0] wb_adr_i, // address
+ input logic [(BIST_NO_SRAM+1)/2-1:0] wb_cs_i, // address
+ input logic wb_we_i , // write
+ input logic [BIST_DATA_WD-1:0] wb_dat_i, // data output
+ input logic [BIST_DATA_WD/8-1:0] wb_sel_i, // byte enable
+ input logic [9:0] wb_bl_i, // Burst Length
+ input logic wb_bry_i, // Burst Ready
+ output logic [BIST_DATA_WD-1:0] wb_dat_o, // data input
+ output logic wb_ack_o, // acknowlegement
+ output logic wb_lack_o, // acknowlegement
+ output logic wb_err_o, // error
+
+ output logic mem_req,
+ output logic [(BIST_NO_SRAM+1)/2-1:0] mem_cs,
+ output logic [BIST_ADDR_WD-1:0] mem_addr,
+ output logic [31:0] mem_wdata,
+ output logic mem_we,
+ output logic [3:0] mem_wmask,
+ input logic [31:0] mem_rdata
+
+
+
+
+);
+
+parameter IDLE = 2'b00;
+parameter WRITE_ACTION = 2'b01;
+parameter READ_ACTION1 = 2'b10;
+parameter READ_ACTION2 = 2'b11;
+
+
+logic [9:0] mem_bl_cnt ;
+logic wb_ack_l ;
+logic [BIST_ADDR_WD-1:0] mem_next_addr;
+logic [1:0] state;
+logic mem_hval; // Mem Hold Data valid
+logic [31:0] mem_hdata; // Mem Hold Data
+
+
+assign mem_wdata = wb_dat_i;
+
+always @(negedge rst_n, posedge wb_clk_i) begin
+ if (~rst_n) begin
+ mem_bl_cnt <= 'h0;
+ mem_addr <= 'h0;
+ mem_next_addr <= 'h0;
+ wb_ack_l <= 'b0;
+ wb_dat_o <= 'h0;
+ mem_req <= 'b0;
+ mem_cs <= 'b0;
+ mem_wmask <= 'h0;
+ mem_we <= 'h0;
+ mem_hval <= 'b0;
+ mem_hdata <= 'h0;
+ state <= IDLE;
+ end else begin
+ case(state)
+ IDLE: begin
+ mem_bl_cnt <= 'h1;
+ wb_ack_o <= 'b0;
+ wb_lack_o <= 'b0;
+ if(wb_stb_i && wb_bry_i && ~wb_we_i && !wb_lack_o) begin
+ mem_cs <= wb_cs_i;
+ mem_addr <= wb_adr_i;
+ mem_req <= 'b1;
+ mem_we <= 'b0;
+ state <= READ_ACTION1;
+ end else if(wb_stb_i && wb_bry_i && wb_we_i && !wb_lack_o) begin
+ mem_cs <= wb_cs_i;
+ mem_next_addr<= wb_adr_i;
+ mem_we <= 'b1;
+ mem_wmask <= wb_sel_i;
+ state <= WRITE_ACTION;
+ end else begin
+ mem_req <= 1'b0;
+ end
+ end
+
+ WRITE_ACTION: begin
+ if (wb_stb_i && wb_bry_i ) begin
+ wb_ack_o <= 'b1;
+ mem_req <= 1'b1;
+ mem_addr <= mem_next_addr;
+ if((wb_stb_i && wb_bry_i ) && (wb_bl_i == mem_bl_cnt)) begin
+ wb_lack_o <= 'b1;
+ state <= IDLE;
+ end else begin
+ mem_bl_cnt <= mem_bl_cnt+1;
+ mem_next_addr<= mem_next_addr+1;
+ end
+ end else begin
+ wb_ack_o <= 'b0;
+ mem_req <= 1'b0;
+ end
+ end
+ READ_ACTION1: begin
+ mem_addr <= mem_addr +1;
+ mem_hval <= 1'b0;
+ wb_ack_l <= 'b1;
+ mem_bl_cnt <= 'h1;
+ state <= READ_ACTION2;
+ end
+
+ // Wait for Ack from application layer
+ READ_ACTION2: begin
+ // If the not the last ack, update memory pointer
+ // accordingly
+ wb_ack_l <= wb_ack_o;
+ if (wb_stb_i && wb_bry_i ) begin
+ wb_ack_o <= 1'b1;
+ mem_bl_cnt <= mem_bl_cnt+1;
+ mem_addr <= mem_addr +1;
+ if(wb_ack_l || wb_ack_o ) begin // If back to back ack
+ wb_dat_o <= mem_rdata;
+ mem_hval <= 1'b0;
+ end else begin // Pick from previous holding data
+ mem_hval <= 1'b1;
+ wb_dat_o <= mem_hdata;
+ mem_hdata <= mem_rdata;
+ end
+ if((wb_stb_i && wb_bry_i ) && (wb_bl_i == mem_bl_cnt)) begin
+ wb_lack_o <= 1'b1;
+ state <= IDLE;
+ end
+ end else begin
+ wb_ack_o <= 1'b0;
+ if(!mem_hval) begin
+ mem_hdata <= mem_rdata;
+ mem_hval <= 1'b1;
+ end
+ end
+ end
+ endcase
+ end
+end
+
+endmodule
diff --git a/verilog/rtl/mbist_wrapper/src/mbist_wrapper.sv b/verilog/rtl/mbist_wrapper/src/mbist_wrapper.sv
new file mode 100644
index 0000000..07c5ce3
--- /dev/null
+++ b/verilog/rtl/mbist_wrapper/src/mbist_wrapper.sv
@@ -0,0 +1,369 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// MBIST TOP ////
+//// ////
+//// This file is part of the mbist_ctrl cores project ////
+//// https://github.com/dineshannayya/mbist_ctrl.git ////
+//// ////
+//// Description ////
+//// This block integrate mbist controller with row ////
+//// redendency feature ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.0 - 11th Oct 2021, Dinesh A ////
+//// Initial integration ////
+//// 0.1 - 26th Oct 2021, Dinesh A ////
+//// Fixed Error Address are serial shifted through ////
+//// sdi/sdo ////
+//// 0.2 - 15 Dec 2021, Dinesh A ////
+//// Added support for common MBIST for 4 SRAM ////
+//// 0.3 - 29th Dec 2021, Dinesh A ////
+//// yosys synthesis issue for two dimension variable ////
+//// changed the variable defination from logic to wire ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+`include "mbist_def.svh"
+module mbist_wrapper
+ #(
+ parameter BIST_NO_SRAM = 4,
+ parameter BIST_ADDR_WD = 9,
+ parameter BIST_DATA_WD = 32,
+ parameter BIST_ADDR_START = 9'h000,
+ parameter BIST_ADDR_END = 9'h1FB,
+ parameter BIST_REPAIR_ADDR_START = 9'h1FC,
+ parameter BIST_RAD_WD_I = BIST_ADDR_WD,
+ parameter BIST_RAD_WD_O = BIST_ADDR_WD) (
+
+`ifdef USE_POWER_PINS
+ inout vccd1, // User area 1 1.8V supply
+ inout vssd1, // User area 1 digital ground
+`endif
+
+ // Clock Skew Adjust
+ input wire wbd_clk_int,
+ output wire wbd_clk_mbist,
+ input wire [3:0] cfg_cska_mbist, // clock skew adjust for web host
+
+ input logic rst_n,
+
+ // MBIST I/F
+ input wire bist_en,
+ input wire bist_run,
+ input wire bist_shift,
+ input wire bist_load,
+ input wire bist_sdi,
+
+ output wire [3:0] bist_error_cnt0,
+ output wire [3:0] bist_error_cnt1,
+ output wire [3:0] bist_error_cnt2,
+ output wire [3:0] bist_error_cnt3,
+ output wire [BIST_NO_SRAM-1:0] bist_correct ,
+ output wire [BIST_NO_SRAM-1:0] bist_error ,
+ output wire bist_done,
+ output wire bist_sdo,
+
+
+ // WB I/F
+ input wire wb_clk_i, // System clock
+ input wire wb_clk2_i, // System clock2 is no cts
+ input wire wb_stb_i, // strobe/request
+ input wire [(BIST_NO_SRAM+1)/2-1:0] wb_cs_i,
+ input wire [BIST_ADDR_WD-1:0] wb_adr_i, // address
+ input wire wb_we_i , // write
+ input wire [BIST_DATA_WD-1:0] wb_dat_i, // data output
+ input wire [BIST_DATA_WD/8-1:0] wb_sel_i, // byte enable
+ input wire [9:0] wb_bl_i, // burst
+ input wire wb_bry_i, // burst ready
+ output wire [BIST_DATA_WD-1:0] wb_dat_o, // data input
+ output wire wb_ack_o, // acknowlegement
+ output wire wb_lack_o, // acknowlegement
+ output wire wb_err_o, // error
+
+
+ // towards memory
+ // PORT-A
+ output wire [BIST_NO_SRAM-1:0] mem_clk_a,
+ output wire [BIST_ADDR_WD-1:0] mem_addr_a0,
+ output wire [BIST_ADDR_WD-1:0] mem_addr_a1,
+ output wire [BIST_ADDR_WD-1:0] mem_addr_a2,
+ output wire [BIST_ADDR_WD-1:0] mem_addr_a3,
+ output wire [BIST_NO_SRAM-1:0] mem_cen_a,
+ output wire [BIST_NO_SRAM-1:0] mem_web_a,
+ output wire [BIST_DATA_WD/8-1:0] mem_mask_a0,
+ output wire [BIST_DATA_WD/8-1:0] mem_mask_a1,
+ output wire [BIST_DATA_WD/8-1:0] mem_mask_a2,
+ output wire [BIST_DATA_WD/8-1:0] mem_mask_a3,
+ output wire [BIST_DATA_WD-1:0] mem_din_a0,
+ output wire [BIST_DATA_WD-1:0] mem_din_a1,
+ output wire [BIST_DATA_WD-1:0] mem_din_a2,
+ output wire [BIST_DATA_WD-1:0] mem_din_a3,
+
+ input wire [BIST_DATA_WD-1:0] mem_dout_a0,
+ input wire [BIST_DATA_WD-1:0] mem_dout_a1,
+ input wire [BIST_DATA_WD-1:0] mem_dout_a2,
+ input wire [BIST_DATA_WD-1:0] mem_dout_a3,
+
+
+ // PORT-B
+ output wire [BIST_NO_SRAM-1:0] mem_clk_b,
+ output wire [BIST_NO_SRAM-1:0] mem_cen_b,
+ output wire [BIST_ADDR_WD-1:0] mem_addr_b0,
+ output wire [BIST_ADDR_WD-1:0] mem_addr_b1,
+ output wire [BIST_ADDR_WD-1:0] mem_addr_b2,
+ output wire [BIST_ADDR_WD-1:0] mem_addr_b3
+
+
+
+);
+
+parameter NO_SRAM_WD = (BIST_NO_SRAM+1)/2;
+parameter BIST1_ADDR_WD = 11; // 512x32 SRAM
+
+logic mem_req; // strobe/request
+logic [(BIST_NO_SRAM+1)/2-1:0] mem_cs;
+logic [BIST_ADDR_WD-1:0] mem_addr; // address
+logic mem_we ; // write
+logic [BIST_DATA_WD-1:0] mem_wdata; // data output
+logic [BIST_DATA_WD/8-1:0] mem_wmask; // byte enable
+logic [BIST_DATA_WD-1:0] mem_rdata; // data input
+
+
+mbist_wb #(
+ .BIST_NO_SRAM (4 ),
+ .BIST_ADDR_WD (BIST1_ADDR_WD-2 ),
+ .BIST_DATA_WD (BIST_DATA_WD )
+ )
+ u_wb (
+
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1 ),// User area 1 1.8V supply
+ .vssd1 (vssd1 ),// User area 1 digital ground
+`endif
+
+ .rst_n (rst_n ),
+ // WB I/F
+ .wb_clk_i (wb_clk_i ),
+ .wb_stb_i (wb_stb_i ),
+ .wb_cs_i (wb_cs_i ),
+ .wb_adr_i (wb_adr_i ),
+ .wb_we_i (wb_we_i ),
+ .wb_dat_i (wb_dat_i ),
+ .wb_sel_i (wb_sel_i ),
+ .wb_bl_i (wb_bl_i ),
+ .wb_bry_i (wb_bry_i ),
+ .wb_dat_o (wb_dat_o ),
+ .wb_ack_o (wb_ack_o ),
+ .wb_lack_o (wb_lack_o ),
+ .wb_err_o ( ),
+
+ .mem_req (mem_req ),
+ .mem_cs (mem_cs ),
+ .mem_addr (mem_addr ),
+ .mem_we (mem_we ),
+ .mem_wdata (mem_wdata ),
+ .mem_wmask (mem_wmask ),
+ .mem_rdata (mem_rdata )
+
+
+
+
+);
+
+
+mbist_top #(
+ `ifndef SYNTHESIS
+ .BIST_NO_SRAM (4 ),
+ .BIST_ADDR_WD (BIST1_ADDR_WD-2 ),
+ .BIST_DATA_WD (BIST_DATA_WD ),
+ .BIST_ADDR_START (9'h000 ),
+ .BIST_ADDR_END (9'h1FB ),
+ .BIST_REPAIR_ADDR_START (9'h1FC ),
+ .BIST_RAD_WD_I (BIST1_ADDR_WD-2 ),
+ .BIST_RAD_WD_O (BIST1_ADDR_WD-2 )
+ `endif
+ )
+ u_mbist (
+
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1 ),// User area 1 1.8V supply
+ .vssd1 (vssd1 ),// User area 1 digital ground
+`endif
+
+ // Clock Skew adjust
+ .wbd_clk_int (wbd_clk_int ),
+ .cfg_cska_mbist (cfg_cska_mbist ),
+ .wbd_clk_mbist (wbd_clk_mbist ),
+
+ // WB I/F
+ .wb_clk2_i (wb_clk2_i ),
+ .wb_clk_i (wb_clk_i ),
+ .mem_req (mem_req ),
+ .mem_cs (mem_cs ),
+ .mem_addr (mem_addr ),
+ .mem_we (mem_we ),
+ .mem_wdata (mem_wdata ),
+ .mem_wmask (mem_wmask ),
+ .mem_rdata (mem_rdata ),
+
+ .rst_n (rst_n ),
+
+
+ .bist_en (bist_en ),
+ .bist_run (bist_run ),
+ .bist_shift (bist_shift ),
+ .bist_load (bist_load ),
+ .bist_sdi (bist_sdi ),
+
+ .bist_error_cnt3 (bist_error_cnt3 ),
+ .bist_error_cnt2 (bist_error_cnt2 ),
+ .bist_error_cnt1 (bist_error_cnt1 ),
+ .bist_error_cnt0 (bist_error_cnt0 ),
+ .bist_correct (bist_correct ),
+ .bist_error (bist_error ),
+ .bist_done (bist_done ),
+ .bist_sdo (bist_sdo ),
+
+ // towards memory
+ // PORT-A
+ .mem_clk_a (mem_clk_a ),
+ .mem_addr_a0 (mem_addr_a0 ),
+ .mem_addr_a1 (mem_addr_a1 ),
+ .mem_addr_a2 (mem_addr_a2 ),
+ .mem_addr_a3 (mem_addr_a3 ),
+ .mem_cen_a (mem_cen_a ),
+ .mem_web_a (mem_web_a ),
+ .mem_mask_a0 (mem_mask_a0 ),
+ .mem_mask_a1 (mem_mask_a1 ),
+ .mem_mask_a2 (mem_mask_a2 ),
+ .mem_mask_a3 (mem_mask_a3 ),
+ .mem_din_a0 (mem_din_a0 ),
+ .mem_din_a1 (mem_din_a1 ),
+ .mem_din_a2 (mem_din_a2 ),
+ .mem_din_a3 (mem_din_a3 ),
+ .mem_dout_a0 (mem_dout_a0 ),
+ .mem_dout_a1 (mem_dout_a1 ),
+ .mem_dout_a2 (mem_dout_a2 ),
+ .mem_dout_a3 (mem_dout_a3 ),
+ // PORT-B
+ .mem_clk_b (mem_clk_b ),
+ .mem_cen_b (mem_cen_b ),
+ .mem_addr_b0 (mem_addr_b0 ),
+ .mem_addr_b1 (mem_addr_b1 ),
+ .mem_addr_b2 (mem_addr_b2 ),
+ .mem_addr_b3 (mem_addr_b3 )
+
+
+);
+
+
+/**
+sky130_sram_2kbyte_1rw1r_32x512_8 u_sram0_2kb(
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1),// User area 1 1.8V supply
+ .vssd1 (vssd1),// User area 1 digital ground
+`endif
+// Port 0: RW
+ .clk0 (mem_clk_a[0]),
+ .csb0 (mem_cen_a[0]),
+ .web0 (mem_web_a[0]),
+ .wmask0 (mem0_mask_a),
+ .addr0 (mem0_addr_a),
+ .din0 (mem0_din_a),
+ .dout0 (mem0_dout_a),
+// Port 1: R
+ .clk1 (mem_clk_b[0]),
+ .csb1 (mem_cen_b[0]),
+ .addr1 (mem0_addr_b),
+ .dout1 ()
+ );
+
+sky130_sram_2kbyte_1rw1r_32x512_8 u_sram1_2kb(
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1),// User area 1 1.8V supply
+ .vssd1 (vssd1),// User area 1 digital ground
+`endif
+// Port 0: RW
+ .clk0 (mem_clk_a[1]),
+ .csb0 (mem_cen_a[1]),
+ .web0 (mem_web_a[1]),
+ .wmask0 (mem1_mask_a),
+ .addr0 (mem1_addr_a),
+ .din0 (mem1_din_a),
+ .dout0 (mem1_dout_a),
+// Port 1: R
+ .clk1 (mem_clk_b[1]),
+ .csb1 (mem_cen_b[1]),
+ .addr1 (mem1_addr_b),
+ .dout1 ()
+ );
+
+sky130_sram_2kbyte_1rw1r_32x512_8 u_sram2_2kb(
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1),// User area 1 1.8V supply
+ .vssd1 (vssd1),// User area 1 digital ground
+`endif
+// Port 0: RW
+ .clk0 (mem_clk_a[2]),
+ .csb0 (mem_cen_a[2]),
+ .web0 (mem_web_a[2]),
+ .wmask0 (mem2_mask_a),
+ .addr0 (mem2_addr_a),
+ .din0 (mem2_din_a),
+ .dout0 (mem2_dout_a),
+// Port 1: R
+ .clk1 (mem_clk_b[2]),
+ .csb1 (mem_cen_b[2]),
+ .addr1 (mem2_addr_b),
+ .dout1 ()
+ );
+
+
+sky130_sram_2kbyte_1rw1r_32x512_8 u_sram3_2kb(
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1),// User area 1 1.8V supply
+ .vssd1 (vssd1),// User area 1 digital ground
+`endif
+// Port 0: RW
+ .clk0 (mem_clk_a[3]),
+ .csb0 (mem_cen_a[3]),
+ .web0 (mem_web_a[3]),
+ .wmask0 (mem3_mask_a),
+ .addr0 (mem3_addr_a),
+ .din0 (mem3_din_a),
+ .dout0 (mem3_dout_a),
+// Port 1: R
+ .clk1 (mem_clk_b[3]),
+ .csb1 (mem_cen_b[3]),
+ .addr1 (mem3_addr_b),
+ .dout1 ()
+ );
+
+
+***/
+
+endmodule
+
diff --git a/verilog/rtl/uart/src/uart_cfg.sv b/verilog/rtl/uart/src/uart_cfg.sv
new file mode 100644
index 0000000..ca4dea6
--- /dev/null
+++ b/verilog/rtl/uart/src/uart_cfg.sv
@@ -0,0 +1,405 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// UART Configuration ////
+//// ////
+//// This file is part of the YIFive cores project ////
+//// https://github.com/dineshannayya/yifive_r0.git ////
+//// http://www.opencores.org/cores/yifive/ ////
+//// ////
+//// Description ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.1 - 20th June 2021, Dinesh A ////
+//// 1. initial version picked from ////
+//// http://www.opencores.org/cores/oms8051mini ////
+//// 0.2 - 20th June 2021, Dinesh A ////
+//// tx and rx buffer status added into reg7 and reg8 ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+module uart_cfg (
+
+ mclk,
+ reset_n,
+
+ // Reg Bus Interface Signal
+ reg_cs,
+ reg_wr,
+ reg_addr,
+ reg_wdata,
+ reg_be,
+
+ // Outputs
+ reg_rdata,
+ reg_ack,
+
+ // Uart Tx fifo interface
+ tx_fifo_full,
+ tx_fifo_fspace,
+ tx_fifo_wr_en,
+ tx_fifo_data,
+
+ // Uart Rx fifo interface
+ rx_fifo_empty,
+ rx_fifo_dval ,
+ rx_fifo_rd_en,
+ rx_fifo_data ,
+
+ // configuration
+ cfg_tx_enable,
+ cfg_rx_enable,
+ cfg_stop_bit ,
+ cfg_pri_mod ,
+ cfg_baud_16x ,
+
+ frm_error_o,
+ par_error_o,
+ rx_fifo_full_err_o
+
+ );
+
+
+
+input mclk;
+input reset_n;
+
+//--------------------------------
+// Uart Tx fifo interface
+//--------------------------------
+input tx_fifo_full;
+input [4:0] tx_fifo_fspace ; // Total Tx fifo Free Space
+output tx_fifo_wr_en;
+output [7:0] tx_fifo_data;
+
+//--------------------------------
+// Uart Rx fifo interface
+//--------------------------------
+input rx_fifo_empty;
+input [4:0] rx_fifo_dval ; // Total Rx fifo Data Available
+output rx_fifo_rd_en;
+input [7:0] rx_fifo_data;
+
+//----------------------------------
+// configuration
+//----------------------------------
+output cfg_tx_enable ; // Tx Enable
+output cfg_rx_enable ; // Rx Enable
+output cfg_stop_bit ; // 0 -> 1 Stop, 1 -> 2 Stop
+output [1:0] cfg_pri_mod ; // priority mode, 0 -> nop, 1 -> Even, 2 -> Odd
+output [11:0] cfg_baud_16x ; // 16x Baud clock config
+
+input frm_error_o ; // framing error
+input par_error_o ; // par error
+input rx_fifo_full_err_o ; // rx fifo full error
+
+//---------------------------------
+// Reg Bus Interface Signal
+//---------------------------------
+input reg_cs ;
+input reg_wr ;
+input [3:0] reg_addr ;
+input [7:0] reg_wdata ;
+input reg_be ;
+
+// Outputs
+output [7:0] reg_rdata ;
+output reg_ack ;
+
+
+
+//-----------------------------------------------------------------------
+// Internal Wire Declarations
+//-----------------------------------------------------------------------
+
+wire sw_rd_en;
+wire sw_wr_en;
+wire [3:0] sw_addr ; // addressing 16 registers
+wire wr_be ;
+
+reg [7:0] reg_rdata ;
+reg reg_ack ;
+
+wire [7:0] reg_0; // Software_Reg_0
+wire [7:0] reg_1; // Software-Reg_1
+wire [7:0] reg_2; // Software-Reg_2
+wire [7:0] reg_3; // Software-Reg_3
+wire [7:0] reg_4; // Software-Reg_4
+wire [7:0] reg_5; // Software-Reg_5
+wire [7:0] reg_6; // Software-Reg_6
+wire [7:0] reg_7; // Software-Reg_7
+wire [7:0] reg_8; // Software-Reg_8
+wire [7:0] reg_9; // Software-Reg_9
+wire [7:0] reg_10; // Software-Reg_10
+wire [7:0] reg_11; // Software-Reg_11
+wire [7:0] reg_12; // Software-Reg_12
+wire [7:0] reg_13; // Software-Reg_13
+wire [7:0] reg_14; // Software-Reg_14
+wire [7:0] reg_15; // Software-Reg_15
+reg [7:0] reg_out;
+
+//-----------------------------------------------------------------------
+// Main code starts here
+//-----------------------------------------------------------------------
+
+//-----------------------------------------------------------------------
+// Internal Logic Starts here
+//-----------------------------------------------------------------------
+ assign sw_addr = reg_addr [3:0];
+ assign sw_rd_en = reg_cs & !reg_wr;
+ assign sw_wr_en = reg_cs & reg_wr;
+ assign wr_be = reg_be;
+
+
+//-----------------------------------------------------------------------
+// Read path mux
+//-----------------------------------------------------------------------
+
+always @ (posedge mclk or negedge reset_n)
+begin : preg_out_Seq
+ if (reset_n == 1'b0)
+ begin
+ reg_rdata [7:0] <= 8'h00;
+ reg_ack <= 1'b0;
+ end
+ else if (sw_rd_en && !reg_ack)
+ begin
+ reg_rdata [7:0] <= reg_out [7:0];
+ reg_ack <= 1'b1;
+ end
+ else if (sw_wr_en && !reg_ack)
+ reg_ack <= 1'b1;
+ else
+ begin
+ reg_ack <= 1'b0;
+ end
+end
+
+
+//-----------------------------------------------------------------------
+// register read enable and write enable decoding logic
+//-----------------------------------------------------------------------
+wire sw_wr_en_0 = sw_wr_en & (sw_addr == 4'h0);
+wire sw_rd_en_0 = sw_rd_en & (sw_addr == 4'h0);
+wire sw_wr_en_1 = sw_wr_en & (sw_addr == 4'h1);
+wire sw_rd_en_1 = sw_rd_en & (sw_addr == 4'h1);
+wire sw_wr_en_2 = sw_wr_en & (sw_addr == 4'h2);
+wire sw_rd_en_2 = sw_rd_en & (sw_addr == 4'h2);
+wire sw_wr_en_3 = sw_wr_en & (sw_addr == 4'h3);
+wire sw_rd_en_3 = sw_rd_en & (sw_addr == 4'h3);
+wire sw_wr_en_4 = sw_wr_en & (sw_addr == 4'h4);
+wire sw_rd_en_4 = sw_rd_en & (sw_addr == 4'h4);
+wire sw_wr_en_5 = sw_wr_en & (sw_addr == 4'h5);
+wire sw_rd_en_5 = sw_rd_en & (sw_addr == 4'h5);
+wire sw_wr_en_6 = sw_wr_en & (sw_addr == 4'h6);
+wire sw_rd_en_6 = sw_rd_en & (sw_addr == 4'h6);
+wire sw_wr_en_7 = sw_wr_en & (sw_addr == 4'h7);
+wire sw_rd_en_7 = sw_rd_en & (sw_addr == 4'h7);
+wire sw_wr_en_8 = sw_wr_en & (sw_addr == 4'h8);
+wire sw_rd_en_8 = sw_rd_en & (sw_addr == 4'h8);
+wire sw_wr_en_9 = sw_wr_en & (sw_addr == 4'h9);
+wire sw_rd_en_9 = sw_rd_en & (sw_addr == 4'h9);
+wire sw_wr_en_10 = sw_wr_en & (sw_addr == 4'hA);
+wire sw_rd_en_10 = sw_rd_en & (sw_addr == 4'hA);
+wire sw_wr_en_11 = sw_wr_en & (sw_addr == 4'hB);
+wire sw_rd_en_11 = sw_rd_en & (sw_addr == 4'hB);
+wire sw_wr_en_12 = sw_wr_en & (sw_addr == 4'hC);
+wire sw_rd_en_12 = sw_rd_en & (sw_addr == 4'hC);
+wire sw_wr_en_13 = sw_wr_en & (sw_addr == 4'hD);
+wire sw_rd_en_13 = sw_rd_en & (sw_addr == 4'hD);
+wire sw_wr_en_14 = sw_wr_en & (sw_addr == 4'hE);
+wire sw_rd_en_14 = sw_rd_en & (sw_addr == 4'hE);
+wire sw_wr_en_15 = sw_wr_en & (sw_addr == 4'hF);
+wire sw_rd_en_15 = sw_rd_en & (sw_addr == 4'hF);
+
+
+always @( *)
+begin : preg_sel_Com
+
+ reg_out [7:0] = 8'd0;
+
+ case (sw_addr [3:0])
+ 4'b0000 : reg_out [7:0] = reg_0 [7:0];
+ 4'b0001 : reg_out [7:0] = reg_1 [7:0];
+ 4'b0010 : reg_out [7:0] = reg_2 [7:0];
+ 4'b0011 : reg_out [7:0] = reg_3 [7:0];
+ 4'b0100 : reg_out [7:0] = reg_4 [7:0];
+ 4'b0101 : reg_out [7:0] = reg_5 [7:0];
+ 4'b0110 : reg_out [7:0] = reg_6 [7:0];
+ 4'b0111 : reg_out [7:0] = reg_7 [7:0];
+ 4'b1000 : reg_out [7:0] = reg_8 [7:0];
+ 4'b1001 : reg_out [7:0] = reg_9 [7:0];
+ 4'b1010 : reg_out [7:0] = reg_10 [7:0];
+ 4'b1011 : reg_out [7:0] = reg_11 [7:0];
+ 4'b1100 : reg_out [7:0] = reg_12 [7:0];
+ 4'b1101 : reg_out [7:0] = reg_13 [7:0];
+ 4'b1110 : reg_out [7:0] = reg_14 [7:0];
+ 4'b1111 : reg_out [7:0] = reg_15 [7:0];
+ endcase
+end
+
+
+
+//-----------------------------------------------------------------------
+// Individual register assignments
+//-----------------------------------------------------------------------
+// Logic for Register 0 : uart Control Register
+//-----------------------------------------------------------------------
+wire [1:0] cfg_pri_mod = reg_0[4:3]; // priority mode, 0 -> nop, 1 -> Even, 2 -> Odd
+wire cfg_stop_bit = reg_0[2]; // 0 -> 1 Stop, 1 -> 2 Stop
+wire cfg_rx_enable = reg_0[1]; // Rx Enable
+wire cfg_tx_enable = reg_0[0]; // Tx Enable
+
+generic_register #(5,0 ) u_uart_ctrl_be0 (
+ .we ({5{sw_wr_en_0 &
+ wr_be }} ),
+ .data_in (reg_wdata[4:0] ),
+ .reset_n (reset_n ),
+ .clk (mclk ),
+
+ //List of Outs
+ .data_out (reg_0[4:0] )
+ );
+
+
+assign reg_0[7:5] = 3'h0;
+
+//-----------------------------------------------------------------------
+// Logic for Register 1 : uart interrupt status
+//-----------------------------------------------------------------------
+stat_register u_intr_bit0 (
+ //inputs
+ . clk (mclk ),
+ . reset_n (reset_n ),
+ . cpu_we (sw_wr_en_1 &
+ wr_be ),
+ . cpu_ack (reg_wdata[0] ),
+ . hware_req (frm_error_o ),
+
+ //outputs
+ . data_out (reg_1[0] )
+ );
+
+stat_register u_intr_bit1 (
+ //inputs
+ . clk (mclk ),
+ . reset_n (reset_n ),
+ . cpu_we (sw_wr_en_1 &
+ wr_be ),
+ . cpu_ack (reg_wdata[1] ),
+ . hware_req (par_error_o ),
+
+ //outputs
+ . data_out (reg_1[1] )
+ );
+
+stat_register u_intr_bit2 (
+ //inputs
+ . clk (mclk ),
+ . reset_n (reset_n ),
+ . cpu_we (sw_wr_en_1 &
+ wr_be ),
+ . cpu_ack (reg_wdata[2] ),
+ . hware_req (rx_fifo_full_err_o ),
+
+ //outputs
+ . data_out (reg_1[2] )
+ );
+
+assign reg_1[7:3] = 5'h0;
+
+
+//-----------------------------------------------------------------------
+// Logic for Register 2 : Baud Rate Control
+//-----------------------------------------------------------------------
+wire [11:0] cfg_baud_16x = {reg_3[3:0],reg_2[7:0]};
+
+generic_register #(8,0 ) u_uart_ctrl_reg2 (
+ .we ({8{sw_wr_en_2 &
+ wr_be }} ),
+ .data_in (reg_wdata[7:0] ),
+ .reset_n (reset_n ),
+ .clk (mclk ),
+
+ //List of Outs
+ .data_out (reg_2[7:0] )
+ );
+
+generic_register #(4,0 ) u_uart_ctrl_reg3 (
+ .we ({4{sw_wr_en_3 &
+ wr_be }} ),
+ .data_in (reg_wdata[3:0] ),
+ .reset_n (reset_n ),
+ .clk (mclk ),
+
+ //List of Outs
+ .data_out (reg_3[3:0] )
+ );
+
+assign reg_3[7:4] = 4'h0;
+
+
+// reg-4 status
+//
+assign reg_4[7:0] = {6'h0,rx_fifo_empty,tx_fifo_full};
+
+// reg_5 is tx_fifo wr
+assign tx_fifo_wr_en = sw_wr_en_5 & reg_ack & !tx_fifo_full;
+assign tx_fifo_data = reg_wdata[7:0];
+
+// reg_6 is rx_fifo read
+// rx_fifo read data
+assign reg_6[7:0] = {rx_fifo_data};
+assign rx_fifo_rd_en = sw_rd_en_6 & reg_ack & !rx_fifo_empty;
+
+assign reg_7[7:0] = {3'h0,tx_fifo_fspace}; // tx fifo free space
+assign reg_8[7:0] = {3'h0,rx_fifo_dval}; // rx fifo data available
+
+endmodule
diff --git a/verilog/rtl/uart/src/uart_core.sv b/verilog/rtl/uart/src/uart_core.sv
new file mode 100644
index 0000000..948cd35
--- /dev/null
+++ b/verilog/rtl/uart/src/uart_core.sv
@@ -0,0 +1,334 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// UART CORE with TX/RX 16 Byte Buffer ////
+//// ////
+//// This file is part of the YIFive cores project ////
+//// https://github.com/dineshannayya/yifive_r0.git ////
+//// http://www.opencores.org/cores/yifive/ ////
+//// ////
+//// Description ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.1 - 20th June 2021, Dinesh A ////
+//// 1. initial version picked from ////
+//// http://www.opencores.org/cores/oms8051mini ////
+//// 0.2 - 25th June 2021, Dinesh A ////
+//// Pad logic moved inside core to avoid combo logic at ////
+//// soc digital core level ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+module uart_core
+
+ (
+
+ input logic arst_n , // async reset
+ input logic app_clk ,
+
+ // Reg Bus Interface Signal
+ input logic reg_cs,
+ input logic reg_wr,
+ input logic [3:0] reg_addr,
+ input logic [7:0] reg_wdata,
+ input logic reg_be,
+
+ // Outputs
+ output logic [7:0] reg_rdata,
+ output logic reg_ack,
+
+ // Pad Control
+ input logic rxd,
+ output logic txd
+
+ );
+
+
+
+
+parameter W = 8'd8;
+parameter DP = 8'd16;
+parameter AW = (DP == 2) ? 1 :
+ (DP == 4) ? 2 :
+ (DP == 8) ? 3 :
+ (DP == 16) ? 4 :
+ (DP == 32) ? 5 :
+ (DP == 64) ? 6 :
+ (DP == 128) ? 7 :
+ (DP == 256) ? 8 : 0;
+
+
+
+// Wire Declaration
+wire app_reset_n ;
+wire line_reset_n ;
+
+wire [W-1: 0] tx_fifo_rd_data;
+wire [W-1: 0] rx_fifo_wr_data;
+wire [W-1: 0] app_rxfifo_data;
+wire [W-1: 0] app_txfifo_data;
+wire [1 : 0] error_ind;
+
+// Wire
+wire cfg_tx_enable ; // Tx Enable
+wire cfg_rx_enable ; // Rx Enable
+wire cfg_stop_bit ; // 0 -> 1 Stop, 1 -> 2 Stop
+wire [1:0] cfg_pri_mod ; // priority mode, 0 -> nop, 1 -> Even, 2 -> Odd
+
+wire frm_error_o ; // framing error
+wire par_error_o ; // par error
+wire rx_fifo_full_err_o ; // rx fifo full error
+
+wire [11:0] cfg_baud_16x ; // 16x Baud clock generation
+wire rx_fifo_wr_full ;
+wire tx_fifo_rd_empty ;
+wire tx_fifo_rd ;
+wire app_rxfifo_empty ;
+wire app_rxfifo_rd_en ;
+wire app_tx_fifo_full ;
+wire rx_fifo_wr ;
+wire tx_fifo_wr_en ;
+wire [AW:0] tx_fifo_fspace ; // Total Tx fifo Free Space
+wire [AW:0] rx_fifo_dval ; // Total Rx fifo Data Available
+wire si_ss ;
+
+
+
+uart_cfg u_cfg (
+
+ . mclk (app_clk),
+ . reset_n (app_reset_n),
+
+ // Reg Bus Interface Signal
+ . reg_cs (reg_cs),
+ . reg_wr (reg_wr),
+ . reg_addr (reg_addr),
+ . reg_wdata (reg_wdata),
+ . reg_be (reg_be),
+
+ // Outputs
+ . reg_rdata (reg_rdata),
+ . reg_ack (reg_ack),
+
+
+ // configuration
+ . cfg_tx_enable (cfg_tx_enable),
+ . cfg_rx_enable (cfg_rx_enable),
+ . cfg_stop_bit (cfg_stop_bit),
+ . cfg_pri_mod (cfg_pri_mod),
+
+ . cfg_baud_16x (cfg_baud_16x),
+
+ . tx_fifo_full (app_tx_fifo_full),
+ .tx_fifo_fspace (tx_fifo_fspace ),
+ . tx_fifo_wr_en (tx_fifo_wr_en),
+ . tx_fifo_data (app_txfifo_data),
+
+ . rx_fifo_empty (app_rxfifo_empty),
+ .rx_fifo_dval (rx_fifo_dval ),
+ . rx_fifo_rd_en (app_rxfifo_rd_en),
+ . rx_fifo_data (app_rxfifo_data) ,
+
+ . frm_error_o (frm_error_o),
+ . par_error_o (par_error_o),
+ . rx_fifo_full_err_o (rx_fifo_full_err_o)
+
+ );
+
+
+//##############################################################
+// 16x Baud clock generation
+// Example: to generate 19200 Baud clock from 50Mhz Link clock
+// 50 * 1000 * 1000 / (2 + cfg_baud_16x) = 19200 * 16
+// cfg_baud_16x = 0xA0 (160)
+//###############################################################
+
+wire line_clk_16x_in;
+
+// OpenSource CTS tool does not work with buffer as source point
+// changed buf to max with select tied=0
+//ctech_clk_buf u_lineclk_buf (.A(line_clk_16x_in), .X(line_clk_16x));
+ctech_mux2x1 u_lineclk_buf (.A0(line_clk_16x_in), .A1(1'b0), .S(1'b0), .X(line_clk_16x));
+
+clk_ctl #(11) u_clk_ctl (
+ // Outputs
+ .clk_o (line_clk_16x_in),
+
+ // Inputs
+ .mclk (app_clk),
+ .reset_n (app_reset_n),
+ .clk_div_ratio (cfg_baud_16x)
+ );
+
+//###################################
+// Application Reset Synchronization
+//###################################
+reset_sync u_app_rst (
+ .scan_mode (1'b0 ),
+ .dclk (app_clk ), // Destination clock domain
+ .arst_n (arst_n ), // active low async reset
+ .srst_n (app_reset_n )
+ );
+
+//###################################
+// Line Reset Synchronization
+//###################################
+reset_sync u_line_rst (
+ .scan_mode (1'b0 ),
+ .dclk (line_clk_16x ), // Destination clock domain
+ .arst_n (arst_n ), // active low async reset
+ .srst_n (line_reset_n )
+ );
+
+
+uart_txfsm u_txfsm (
+ .reset_n ( line_reset_n ),
+ .baud_clk_16x ( line_clk_16x ),
+
+ .cfg_tx_enable ( cfg_tx_enable ),
+ .cfg_stop_bit ( cfg_stop_bit ),
+ .cfg_pri_mod ( cfg_pri_mod ),
+
+ // FIFO control signal
+ .fifo_empty ( tx_fifo_rd_empty ),
+ .fifo_rd ( tx_fifo_rd ),
+ .fifo_data ( tx_fifo_rd_data ),
+
+ // Line Interface
+ .so ( txd )
+ );
+
+
+uart_rxfsm u_rxfsm (
+ .reset_n ( line_reset_n ),
+ .baud_clk_16x ( line_clk_16x ) ,
+
+ .cfg_rx_enable ( cfg_rx_enable ),
+ .cfg_stop_bit ( cfg_stop_bit ),
+ .cfg_pri_mod ( cfg_pri_mod ),
+
+ .error_ind ( error_ind ),
+
+ // FIFO control signal
+ .fifo_aval ( !rx_fifo_wr_full ),
+ .fifo_wr ( rx_fifo_wr ),
+ .fifo_data ( rx_fifo_wr_data ),
+
+ // Line Interface
+ .si (si_ss )
+ );
+
+async_fifo_th #(W,DP,0,0) u_rxfifo (
+ .wr_clk (line_clk_16x ),
+ .wr_reset_n (line_reset_n ),
+ .wr_en (rx_fifo_wr ),
+ .wr_data (rx_fifo_wr_data ),
+ .full (rx_fifo_wr_full ), // sync'ed to wr_clk
+ .wr_total_free_space( ),
+
+ .rd_clk (app_clk ),
+ .rd_reset_n (app_reset_n ),
+ .rd_en (app_rxfifo_rd_en ),
+ .empty (app_rxfifo_empty ), // sync'ed to rd_clk
+ .rd_total_aval (rx_fifo_dval ),
+ .rd_data (app_rxfifo_data )
+ );
+
+async_fifo_th #(W,DP,0,0) u_txfifo (
+ .wr_clk (app_clk ),
+ .wr_reset_n (app_reset_n ),
+ .wr_en (tx_fifo_wr_en ),
+ .wr_data (app_txfifo_data ),
+ .full (app_tx_fifo_full ), // sync'ed to wr_clk
+ .wr_total_free_space(tx_fifo_fspace ),
+
+ .rd_clk (line_clk_16x ),
+ .rd_reset_n (line_reset_n ),
+ .rd_en (tx_fifo_rd ),
+ .empty (tx_fifo_rd_empty ), // sync'ed to rd_clk
+ .rd_total_aval ( ),
+ .rd_data (tx_fifo_rd_data )
+ );
+
+
+double_sync_low u_si_sync (
+ .in_data (rxd ),
+ .out_clk (line_clk_16x ),
+ .out_rst_n (line_reset_n ),
+ .out_data (si_ss )
+ );
+
+wire frm_error = (error_ind == 2'b01);
+wire par_error = (error_ind == 2'b10);
+wire rx_fifo_full_err = (error_ind == 2'b11);
+
+double_sync_low u_frm_err (
+ .in_data ( frm_error ),
+ .out_clk ( app_clk ),
+ .out_rst_n ( app_reset_n ),
+ .out_data ( frm_error_o )
+ );
+
+double_sync_low u_par_err (
+ .in_data ( par_error ),
+ .out_clk ( app_clk ),
+ .out_rst_n ( app_reset_n ),
+ .out_data ( par_error_o )
+ );
+
+double_sync_low u_rxfifo_err (
+ .in_data ( rx_fifo_full_err ),
+ .out_clk ( app_clk ),
+ .out_rst_n ( app_reset_n ),
+ .out_data ( rx_fifo_full_err_o )
+ );
+
+
+endmodule
diff --git a/verilog/rtl/uart/src/uart_rxfsm.sv b/verilog/rtl/uart/src/uart_rxfsm.sv
new file mode 100644
index 0000000..58916e6
--- /dev/null
+++ b/verilog/rtl/uart/src/uart_rxfsm.sv
@@ -0,0 +1,221 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// UART RX FSM ////
+//// ////
+//// This file is part of the YIFive cores project ////
+//// https://github.com/dineshannayya/yifive_r0.git ////
+//// http://www.opencores.org/cores/yifive/ ////
+//// ////
+//// Description ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.1 - 20th June 2021, Dinesh A ////
+//// 1. initial version picked from ////
+//// http://www.opencores.org/cores/oms8051mini ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+module uart_rxfsm (
+ reset_n ,
+ baud_clk_16x ,
+
+ cfg_rx_enable ,
+ cfg_stop_bit ,
+ cfg_pri_mod ,
+
+ error_ind ,
+
+ // FIFO control signal
+ fifo_aval ,
+ fifo_wr ,
+ fifo_data ,
+
+ // Line Interface
+ si
+ );
+
+
+input reset_n ; // active low reset signal
+input baud_clk_16x ; // baud clock-16x
+
+input cfg_rx_enable ; // transmit interface enable
+input cfg_stop_bit ; // stop bit
+ // 0 --> 1 stop, 1 --> 2 Stop
+input [1:0] cfg_pri_mod ;// Priority Mode
+ // 2'b00 --> None
+ // 2'b10 --> Even priority
+ // 2'b11 --> Odd priority
+
+output [1:0] error_ind ; // 2'b00 --> Normal
+ // 2'b01 --> framing error
+ // 2'b10 --> parity error
+ // 2'b11 --> fifo full
+//--------------------------------------
+// FIFO control signal
+//--------------------------------------
+input fifo_aval ; // fifo empty
+output fifo_wr ; // fifo write, assumed no back to back write
+output [7:0] fifo_data ; // fifo write data
+
+// Line Interface
+input si ; // rxd pin
+
+
+
+reg [7:0] fifo_data ; // fifo write data
+reg fifo_wr ; // fifo write
+reg [1:0] error_ind ;
+reg [2:0] cnt ;
+reg [3:0] offset ; // free-running counter from 0 - 15
+reg [3:0] rxpos ; // stable rx position
+reg [2:0] rxstate ;
+
+parameter idle_st = 3'b000;
+parameter xfr_start = 3'b001;
+parameter xfr_data_st = 3'b010;
+parameter xfr_pri_st = 3'b011;
+parameter xfr_stop_st1 = 3'b100;
+parameter xfr_stop_st2 = 3'b101;
+
+
+always @(negedge reset_n or posedge baud_clk_16x) begin
+ if(reset_n == 0) begin
+ rxstate <= 3'b0;
+ offset <= 4'b0;
+ rxpos <= 4'b0;
+ cnt <= 3'b0;
+ error_ind <= 2'b0;
+ fifo_wr <= 1'b0;
+ fifo_data <= 8'h0;
+ end
+ else begin
+ offset <= offset + 1;
+ case(rxstate)
+ idle_st : begin
+ if(!si) begin // Start indication
+ if(fifo_aval && cfg_rx_enable) begin
+ rxstate <= xfr_start;
+ cnt <= 0;
+ rxpos <= offset + 8; // Assign center rxoffset
+ error_ind <= 2'b00;
+ end
+ else begin
+ error_ind <= 2'b11; // fifo full error indication
+ end
+ end else begin
+ error_ind <= 2'b00; // Reset Error
+ end
+ end
+ xfr_start : begin
+ // Make Sure that minimum 8 cycle low is detected
+ if(cnt < 7 && si) begin // Start indication
+ rxstate <= idle_st;
+ end
+ else if(cnt == 7 && !si) begin // Start indication
+ rxstate <= xfr_data_st;
+ cnt <= 0;
+ end else begin
+ cnt <= cnt +1;
+ end
+ end
+ xfr_data_st : begin
+ if(rxpos == offset) begin
+ fifo_data[cnt] <= si;
+ cnt <= cnt+1;
+ if(cnt == 7) begin
+ fifo_wr <= 1;
+ if(cfg_pri_mod == 2'b00) // No Priority
+ rxstate <= xfr_stop_st1;
+ else rxstate <= xfr_pri_st;
+ end
+ end
+ end
+ xfr_pri_st : begin
+ fifo_wr <= 0;
+ if(rxpos == offset) begin
+ if(cfg_pri_mod == 2'b10) // even priority
+ if( si != ^fifo_data) error_ind <= 2'b10;
+ else // Odd Priority
+ if( si != ~(^fifo_data)) error_ind <= 2'b10;
+ rxstate <= xfr_stop_st1;
+ end
+ end
+ xfr_stop_st1 : begin
+ fifo_wr <= 0;
+ if(rxpos == offset) begin
+ if(si) begin
+ if(cfg_stop_bit) // Two Stop bit
+ rxstate <= xfr_stop_st2;
+ else
+ rxstate <= idle_st;
+ end else begin // Framing error
+ error_ind <= 2'b01;
+ rxstate <= idle_st;
+ end
+ end
+ end
+ xfr_stop_st2 : begin
+ if(rxpos == offset) begin
+ if(si) begin
+ rxstate <= idle_st;
+ end else begin // Framing error
+ error_ind <= 2'b01;
+ rxstate <= idle_st;
+ end
+ end
+ end
+ default: rxstate <= idle_st;
+ endcase
+ end
+end
+
+
+endmodule
diff --git a/verilog/rtl/uart/src/uart_txfsm.sv b/verilog/rtl/uart/src/uart_txfsm.sv
new file mode 100644
index 0000000..ad6507e
--- /dev/null
+++ b/verilog/rtl/uart/src/uart_txfsm.sv
@@ -0,0 +1,190 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// UART TX FSM ////
+//// ////
+//// This file is part of the YIFive cores project ////
+//// https://github.com/dineshannayya/yifive_r0.git ////
+//// http://www.opencores.org/cores/yifive/ ////
+//// ////
+//// Description ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.1 - 20th June 2021, Dinesh A ////
+//// 1. initial version picked from ////
+//// http://www.opencores.org/cores/oms8051mini ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+
+module uart_txfsm (
+ reset_n ,
+ baud_clk_16x ,
+
+ cfg_tx_enable ,
+ cfg_stop_bit ,
+ cfg_pri_mod ,
+
+ // FIFO control signal
+ fifo_empty ,
+ fifo_rd ,
+ fifo_data ,
+
+ // Line Interface
+ so
+ );
+
+
+input reset_n ; // active low reset signal
+input baud_clk_16x ; // baud clock-16x
+
+input cfg_tx_enable ; // transmit interface enable
+input cfg_stop_bit ; // stop bit
+ // 0 --> 1 stop, 1 --> 2 Stop
+input [1:0] cfg_pri_mod ;// Priority Mode
+ // 2'b00 --> None
+ // 2'b10 --> Even priority
+ // 2'b11 --> Odd priority
+
+//--------------------------------------
+// FIFO control signal
+//--------------------------------------
+input fifo_empty ; // fifo empty
+output fifo_rd ; // fifo read, assumed no back to back read
+input [7:0] fifo_data ; // fifo read data
+
+// Line Interface
+output so ; // txd pin
+
+
+reg [2:0] txstate ; // tx state
+reg so ; // txd pin
+reg [7:0] txdata ; // local txdata
+reg fifo_rd ; // Fifo read enable
+reg [2:0] cnt ; // local data cont
+reg [3:0] divcnt ; // clock div count
+
+parameter idle_st = 3'b000;
+parameter xfr_data_st = 3'b001;
+parameter xfr_pri_st = 3'b010;
+parameter xfr_stop_st1 = 3'b011;
+parameter xfr_stop_st2 = 3'b100;
+
+
+always @(negedge reset_n or posedge baud_clk_16x)
+begin
+ if(reset_n == 1'b0) begin
+ txstate <= idle_st;
+ so <= 1'b1;
+ cnt <= 3'b0;
+ txdata <= 8'h0;
+ fifo_rd <= 1'b0;
+ divcnt <= 4'b0;
+ end
+ else begin
+ divcnt <= divcnt+1;
+ if(divcnt == 4'b0000) begin // Do at once in 16 clock
+ case(txstate)
+ idle_st : begin
+ if(!fifo_empty && cfg_tx_enable) begin
+ so <= 1'b0 ; // Start bit
+ cnt <= 3'b0;
+ fifo_rd <= 1'b1;
+ txdata <= fifo_data;
+ txstate <= xfr_data_st;
+ end
+ end
+
+ xfr_data_st : begin
+ fifo_rd <= 1'b0;
+ so <= txdata[cnt];
+ cnt <= cnt+1;
+ if(cnt == 7) begin
+ if(cfg_pri_mod == 2'b00) begin // No Priority
+ txstate <= xfr_stop_st1;
+ end
+ else begin
+ txstate <= xfr_pri_st;
+ end
+ end
+ end
+
+ xfr_pri_st : begin
+ if(cfg_pri_mod == 2'b10) // even priority
+ so <= ^txdata;
+ else begin // Odd Priority
+ so <= ~(^txdata);
+ end
+ txstate <= xfr_stop_st1;
+ end
+
+ xfr_stop_st1 : begin // First Stop Bit
+ so <= 1;
+ if(cfg_stop_bit == 0) // 1 Stop Bit
+ txstate <= idle_st;
+ else // 2 Stop Bit
+ txstate <= xfr_stop_st2;
+ end
+
+ xfr_stop_st2 : begin // Second Stop Bit
+ so <= 1;
+ txstate <= idle_st;
+ end
+ default: txstate <= idle_st;
+ endcase
+ end
+ else begin
+ fifo_rd <= 1'b0;
+ end
+ end
+end
+
+
+endmodule
diff --git a/verilog/rtl/uart2wb/src/run_verilog b/verilog/rtl/uart2wb/src/run_verilog
new file mode 100644
index 0000000..c689827
--- /dev/null
+++ b/verilog/rtl/uart2wb/src/run_verilog
@@ -0,0 +1 @@
+iverilog uart2wb.sv uart2_core.sv uart_msg_handler.v ../../uart/src/uart_rxfsm.sv ../../uart/src/uart_txfsm.sv ../../lib/double_sync_low.v ../../lib/clk_ctl.v ../../lib/reset_sync.sv
diff --git a/verilog/rtl/uart2wb/src/uart2_core.sv b/verilog/rtl/uart2wb/src/uart2_core.sv
new file mode 100755
index 0000000..78daa1a
--- /dev/null
+++ b/verilog/rtl/uart2wb/src/uart2_core.sv
@@ -0,0 +1,192 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Tubo 8051 cores UART Interface Module ////
+//// ////
+//// This file is part of the Turbo 8051 cores project ////
+//// http://www.opencores.org/cores/turbo8051/ ////
+//// ////
+//// Description ////
+//// Turbo 8051 definitions. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+module uart2_core (
+ input wire arst_n , // Async reset
+ input wire app_clk , // Application clock
+
+
+ // configuration control
+ input wire cfg_tx_enable , // Enable Transmit Path
+ input wire cfg_rx_enable , // Enable Received Path
+ input wire cfg_stop_bit , // 0 -> 1 Start , 1 -> 2 Stop Bits
+ input wire [1:0] cfg_pri_mod , // priority mode, 0 -> nop, 1 -> Even, 2 -> Odd
+ input wire [11:0]cfg_baud_16x , // 16x baud rate control
+
+ // TX PATH Information
+ input wire tx_data_avail , // Indicate valid TXD Data
+ output wire tx_rd , // Indicate TXD Data Been Read
+ input wire [7:0]tx_data , // Indicate TXD Data Been
+
+
+ // RXD Information
+ input wire rx_ready , // Indicate Ready to accept the Read Data
+ output wire rx_wr , // Valid RXD Data
+ output wire [7:0]rx_data , // RXD Data
+
+ // Status information
+ output wire frm_error , // framing error
+ output wire par_error , // par error
+
+ output wire baud_clk_16x , // 16x Baud clock
+ output wire line_reset_n , // Reset sync to 16x Baud clock
+
+ // Line Interface
+ input wire rxd , // uart rxd
+ output wire txd // uart txd
+
+ );
+
+
+
+//---------------------------------
+// Global Dec
+// ---------------------------------
+
+// Wire Declaration
+
+wire [1 : 0] error_ind ;
+wire si_ss ;
+
+// OpenSource CTS tool does not work with buffer as source point
+// changed buf to max with select tied=0
+//ctech_clk_buf u_lineclk_buf (.A(line_clk_16x_in), .X(line_clk_16x));
+wire line_clk_16x;
+ctech_mux2x1 u_uart_clk (.A0(line_clk_16x), .A1(1'b0), .S(1'b0), .X(baud_clk_16x));
+
+// 16x Baud clock generation
+// Example: to generate 19200 Baud clock from 50Mhz Link clock
+// 50 * 1000 * 1000 / (2 + cfg_baud_16x) = 19200 * 16
+// cfg_baud_16x = 0xA0 (160)
+
+clk_ctl #(11) u_clk_ctl (
+ // Outputs
+ .clk_o (line_clk_16x),
+
+ // Inputs
+ .mclk (app_clk),
+ .reset_n (arst_n),
+ .clk_div_ratio (cfg_baud_16x)
+ );
+
+
+//###################################
+// Line Reset Synchronization
+//###################################
+reset_sync u_line_rst (
+ .scan_mode (1'b0 ),
+ .dclk (baud_clk_16x ), // Destination clock domain
+ .arst_n (arst_n ), // active low async reset
+ .srst_n (line_reset_n )
+ );
+
+
+
+uart_txfsm u_txfsm (
+ . reset_n ( line_reset_n ),
+ . baud_clk_16x ( baud_clk_16x ),
+
+ . cfg_tx_enable ( cfg_tx_enable ),
+ . cfg_stop_bit ( cfg_stop_bit ),
+ . cfg_pri_mod ( cfg_pri_mod ),
+
+ // FIFO control signal
+ . fifo_empty ( !tx_data_avail ),
+ . fifo_rd ( tx_rd ),
+ . fifo_data ( tx_data ),
+
+ // Line Interface
+ . so ( txd )
+ );
+
+
+uart_rxfsm u_rxfsm (
+ . reset_n ( line_reset_n ),
+ . baud_clk_16x ( baud_clk_16x ) ,
+
+ . cfg_rx_enable ( cfg_rx_enable ),
+ . cfg_stop_bit ( cfg_stop_bit ),
+ . cfg_pri_mod ( cfg_pri_mod ),
+
+ . error_ind ( error_ind ),
+
+ // FIFO control signal
+ . fifo_aval ( rx_ready ),
+ . fifo_wr ( rx_wr ),
+ . fifo_data ( rx_data ),
+
+ // Line Interface
+ . si (si_ss )
+ );
+
+// Double Sync RXD
+double_sync_low u_rxd_sync (
+ .in_data (rxd ),
+ .out_clk (baud_clk_16x ),
+ .out_rst_n (line_reset_n ),
+ .out_data (si_ss )
+ );
+
+
+assign frm_error = (error_ind == 2'b01);
+assign par_error = (error_ind == 2'b10);
+
+
+
+endmodule
diff --git a/verilog/rtl/uart2wb/src/uart2wb.sv b/verilog/rtl/uart2wb/src/uart2wb.sv
new file mode 100755
index 0000000..0bf50b3
--- /dev/null
+++ b/verilog/rtl/uart2wb/src/uart2wb.sv
@@ -0,0 +1,229 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// UART2WB Top Module ////
+//// ////
+//// Description ////
+//// 1. uart_core ////
+//// 2. uart_msg_handler ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+module uart2wb (
+ input wire arst_n , // sync reset
+ input wire app_clk , // sys clock
+
+ // configuration control
+ input wire cfg_tx_enable , // Enable Transmit Path
+ input wire cfg_rx_enable , // Enable Received Path
+ input wire cfg_stop_bit , // 0 -> 1 Start , 1 -> 2 Stop Bits
+ input wire [1:0] cfg_pri_mod , // priority mode, 0 -> nop, 1 -> Even, 2 -> Odd
+ input wire [11:0] cfg_baud_16x , // 16x Baud clock generation
+
+ // Master Port
+ output wire wbm_cyc_o , // strobe/request
+ output wire wbm_stb_o , // strobe/request
+ output wire [31:0] wbm_adr_o , // address
+ output wire wbm_we_o , // write
+ output wire [31:0] wbm_dat_o , // data output
+ output wire [3:0] wbm_sel_o , // byte enable
+ input wire [31:0] wbm_dat_i , // data input
+ input wire wbm_ack_i , // acknowlegement
+ input wire wbm_err_i , // error
+
+ // Status information
+ output wire frm_error , // framing error
+ output wire par_error , // par error
+
+ output wire baud_clk_16x , // 16x Baud clock
+
+ // Line Interface
+ input wire rxd , // uart rxd
+ output wire txd // uart txd
+
+ );
+
+
+
+
+
+
+//-------------------------------------
+//---------------------------------------
+// Control Unit interface
+// --------------------------------------
+
+wire [31:0] reg_addr ; // Register Address
+wire [31:0] reg_wdata ; // Register Wdata
+wire reg_req ; // Register Request
+wire reg_wr ; // 1 -> write; 0 -> read
+wire reg_ack ; // Register Ack
+wire [31:0] reg_rdata ;
+//--------------------------------------
+// TXD Path
+// -------------------------------------
+wire tx_data_avail ; // Indicate valid TXD Data
+wire [7:0] tx_data ; // TXD Data to be transmited
+wire tx_rd ; // Indicate TXD Data Been Read
+
+
+//--------------------------------------
+// RXD Path
+// -------------------------------------
+wire rx_ready ; // Indicate Ready to accept the Read Data
+wire [7:0] rx_data ; // RXD Data
+wire rx_wr ; // Valid RXD Data
+
+wire line_reset_n ;
+
+assign wbm_cyc_o = wbm_stb_o;
+
+
+// Async App clock to Uart clock handling
+
+async_reg_bus #(.AW(32), .DW(32),.BEW(4))
+ u_async_reg_bus (
+ // Initiator declartion
+ .in_clk (baud_clk_16x),
+ .in_reset_n (line_reset_n),
+ // Reg Bus Master
+ // outputs
+ .in_reg_rdata (reg_rdata),
+ .in_reg_ack (reg_ack),
+ .in_reg_timeout (),
+
+ // Inputs
+ .in_reg_cs (reg_req),
+ .in_reg_addr (reg_addr),
+ .in_reg_wdata (reg_wdata),
+ .in_reg_wr (reg_wr),
+ .in_reg_be (4'hF), // No byte enable based support
+
+ // Target Declaration
+ .out_clk (app_clk),
+ .out_reset_n (arst_n),
+ // Reg Bus Slave
+ // output
+ .out_reg_cs (wbm_stb_o),
+ .out_reg_addr (wbm_adr_o),
+ .out_reg_wdata (wbm_dat_o),
+ .out_reg_wr (wbm_we_o),
+ .out_reg_be (wbm_sel_o),
+
+ // Inputs
+ .out_reg_rdata (wbm_dat_i),
+ .out_reg_ack (wbm_ack_i)
+ );
+
+
+uart2_core u_core (
+ .arst_n (arst_n) ,
+ .app_clk (app_clk) ,
+
+ // configuration control
+ .cfg_tx_enable (cfg_tx_enable) ,
+ .cfg_rx_enable (cfg_rx_enable) ,
+ .cfg_stop_bit (cfg_stop_bit) ,
+ .cfg_pri_mod (cfg_pri_mod) ,
+ .cfg_baud_16x (cfg_baud_16x) ,
+
+ // TXD Information
+ .tx_data_avail (tx_data_avail) ,
+ .tx_rd (tx_rd) ,
+ .tx_data (tx_data) ,
+
+
+ // RXD Information
+ .rx_ready (rx_ready) ,
+ .rx_wr (rx_wr) ,
+ .rx_data (rx_data) ,
+
+ // Status information
+ .frm_error (frm_error) ,
+ .par_error (par_error) ,
+
+ .baud_clk_16x (baud_clk_16x) ,
+ .line_reset_n (line_reset_n),
+
+ // Line Interface
+ .rxd (rxd) ,
+ .txd (txd)
+
+ );
+
+
+
+uart_msg_handler u_msg (
+ .reset_n (arst_n ) ,
+ .sys_clk (baud_clk_16x ) ,
+
+
+ // UART-TX Information
+ .tx_data_avail (tx_data_avail) ,
+ .tx_rd (tx_rd) ,
+ .tx_data (tx_data) ,
+
+
+ // UART-RX Information
+ .rx_ready (rx_ready) ,
+ .rx_wr (rx_wr) ,
+ .rx_data (rx_data) ,
+
+ // Towards Control Unit
+ .reg_addr (reg_addr),
+ .reg_wr (reg_wr),
+ .reg_wdata (reg_wdata),
+ .reg_req (reg_req),
+ .reg_ack (reg_ack),
+ .reg_rdata (reg_rdata)
+
+ );
+
+endmodule
diff --git a/verilog/rtl/uart2wb/src/uart_msg_handler.v b/verilog/rtl/uart2wb/src/uart_msg_handler.v
new file mode 100755
index 0000000..471ff88
--- /dev/null
+++ b/verilog/rtl/uart2wb/src/uart_msg_handler.v
@@ -0,0 +1,376 @@
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// UART Message Handler Module ////
+//// ////
+//// This file is part of the uart2spi cores project ////
+//// http://www.opencores.org/cores/uart2spi/ ////
+//// ////
+//// Description ////
+//// Uart Message Handler definitions. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+module uart_msg_handler (
+ reset_n ,
+ sys_clk ,
+
+
+ // UART-TX Information
+ tx_data_avail,
+ tx_rd,
+ tx_data,
+
+
+ // UART-RX Information
+ rx_ready,
+ rx_wr,
+ rx_data,
+
+ // Towards Register Interface
+ reg_addr,
+ reg_wr,
+ reg_wdata,
+ reg_req,
+ reg_ack,
+ reg_rdata
+
+ );
+
+
+// Define the Message Hanlde States
+`define IDLE 4'h0
+`define IDLE_TX_MSG1 4'h1
+`define IDLE_TX_MSG2 4'h2
+`define RX_CMD_PHASE 4'h3
+`define ADR_PHASE 4'h4
+`define WR_DATA_PHASE 4'h5
+`define SEND_WR_REQ 4'h6
+`define SEND_RD_REQ 4'h7
+`define SEND_RD_DATA 4'h8
+`define TX_MSG 4'h9
+
+`define BREAK_CHAR 8'h0A
+
+//---------------------------------
+// Global Dec
+// ---------------------------------
+
+input reset_n ; // line reset
+input sys_clk ; // line clock
+
+
+//--------------------------------------
+// UART TXD Path
+// -------------------------------------
+output tx_data_avail ; // Indicate valid TXD Data available
+output [7:0] tx_data ; // TXD Data to be transmited
+input tx_rd ; // Indicate TXD Data Been Read
+
+
+//--------------------------------------
+// UART RXD Path
+// -------------------------------------
+output rx_ready ; // Indicate Ready to accept the Read Data
+input [7:0] rx_data ; // RXD Data
+input rx_wr ; // Valid RXD Data
+
+//---------------------------------------
+// Control Unit interface
+// --------------------------------------
+
+output [31:0] reg_addr ; // Operend-1
+output [31:0] reg_wdata ; // Operend-2
+output reg_req ; // Register Request
+output reg_wr ; // 1 -> write; 0 -> read
+input reg_ack ; // Register Ack
+input [31:0] reg_rdata ;
+
+// Local Wire/Register Decleration
+//
+//
+reg tx_data_avail ;
+reg [7:0] tx_data ;
+reg [16*8-1:0] TxMsgBuf ; // 16 Byte Tx Message Buffer
+reg [4:0] TxMsgSize ;
+reg [4:0] RxMsgCnt ; // Count the Receive Message Count
+reg [3:0] State ;
+reg [3:0] NextState ;
+reg [15:0] cmd ; // command
+reg [31:0] reg_addr ; // reg_addr
+reg [31:0] reg_wdata ; // reg_addr
+reg reg_wr ; // 1 -> Reg Write request, 0 -> Read Requestion
+reg reg_req ; // 1 -> Register request
+
+
+wire rx_ready = 1;
+/****************************************************************
+* UART Message Hanlding Steps
+*
+* 1. On Reset Or Unknown command, Send the Default Message
+* Select Option:
+* wr <addr> <data>
+* rd <addr>
+* 2. Wait for User command <wr/rd>
+* 3. On <wr> command move to write address phase;
+* phase
+* A. After write address phase move to write data phase
+* B. After write data phase, once user press \r command ; send register req
+* and write request and address + data
+* C. On receiving register ack response; send <success> message back and move
+* to state-2
+* 3. On <rd> command move to read address phase;
+* A. After read address phase , once user press '\r' command; send
+* register req , read request
+* C. On receiving register ack response; send <response + read_data> message and move
+* to state-2
+* *****************************************************************/
+
+always @(negedge reset_n or posedge sys_clk)
+begin
+ if(reset_n == 1'b0) begin
+ tx_data_avail <= 0;
+ reg_req <= 0;
+ reg_addr <= 0;
+ reg_wr <= 1'b0; // Read request
+ reg_wdata <= 0;
+ State <= `IDLE;
+ NextState <= `IDLE;
+ end else begin
+ case(State)
+ // Send Default Message
+ `IDLE: begin
+ TxMsgBuf <= "Command Format:\n"; // Align to 16 character format by appending space character
+ TxMsgSize <= 16;
+ tx_data_avail <= 0;
+ State <= `TX_MSG;
+ NextState <= `IDLE_TX_MSG1;
+ end
+
+ // Send Default Message (Contd..)
+ `IDLE_TX_MSG1: begin
+ TxMsgBuf <= "wm <ad> <data>\n "; // Align to 16 character format by appending space character
+ TxMsgSize <= 15;
+ tx_data_avail <= 0;
+ State <= `TX_MSG;
+ NextState <= `IDLE_TX_MSG2;
+ end
+
+ // Send Default Message (Contd..)
+ `IDLE_TX_MSG2: begin
+ TxMsgBuf <= "rm <ad>\n>> "; // Align to 16 character format by appending space character
+ TxMsgSize <= 10;
+ tx_data_avail <= 0;
+ RxMsgCnt <= 0;
+ State <= `TX_MSG;
+ NextState <= `RX_CMD_PHASE;
+ end
+
+ // Wait for Response
+ `RX_CMD_PHASE: begin
+ if(rx_wr == 1) begin
+ //if(RxMsgCnt == 0 && rx_data == " ") begin // Ignore the same
+ if(RxMsgCnt == 0 && rx_data == 8'h20) begin // Ignore the same
+ //end else if(RxMsgCnt > 0 && rx_data == " ") begin // Check the command
+ end else if(RxMsgCnt > 0 && rx_data == 8'h20) begin // Check the command
+ reg_addr <= 0;
+ RxMsgCnt <= 0;
+ //if(cmd == "wm") begin
+ if(cmd == 16'h776D) begin
+ State <= `ADR_PHASE;
+ //end else if(cmd == "rm") begin
+ end else if(cmd == 16'h726D) begin
+
+ State <= `ADR_PHASE;
+ end else begin // Unknow command
+ State <= `IDLE;
+ end
+ //end else if(rx_data == "\n") begin // Error State
+ end else if(rx_data == `BREAK_CHAR) begin // Error State
+ State <= `IDLE;
+ end
+ else begin
+ cmd <= (cmd << 8) | rx_data ;
+ RxMsgCnt <= RxMsgCnt+1;
+ end
+ end
+ end
+ // Write Address Phase
+ `ADR_PHASE: begin
+ if(rx_wr == 1) begin
+ //if(RxMsgCnt == 0 && rx_data == " ") begin // Ignore the Space character
+ if(RxMsgCnt == 0 && rx_data == 8'h20) begin // Ignore the Space character
+ end else if(RxMsgCnt > 0 && (rx_data == 8'h20 || rx_data == `BREAK_CHAR)) begin // Move to write data phase
+ //if(RxMsgCnt > 0 && "wm" && rx_data == " ") begin // Move to write data phase
+ if(cmd == 16'h776D && rx_data == 8'h20) begin // Move to write data phase
+ reg_wdata <= 0;
+ State <= `WR_DATA_PHASE;
+ // end else if(RxMsgCnt > 0 && "rm" && rx_data == "\n") begin // Move to read data phase
+ end else if(cmd == 16'h726D && rx_data == `BREAK_CHAR) begin // Move to read data phase
+ reg_wr <= 1'b0; // Read request
+ reg_req <= 1'b1; // Reg Request
+ State <= `SEND_RD_REQ;
+ end else begin // Unknow command
+ State <= `IDLE;
+ end
+ //end else if(rx_data == "\n") begin // Error State
+ end else if(rx_data == `BREAK_CHAR) begin // Error State
+ State <= `IDLE;
+ end else begin
+ reg_addr <= (reg_addr << 4) | char2hex(rx_data);
+ RxMsgCnt <= RxMsgCnt+1;
+ end
+ end
+ end
+ // Write Data Phase
+ `WR_DATA_PHASE: begin
+ if(rx_wr == 1) begin
+ //if(rx_data == " ") begin // Ignore the Space character
+ if(rx_data == 8'h20) begin // Ignore the Space character
+ //end else if(rx_data == "\n") begin // Error State
+ end else if(rx_data == `BREAK_CHAR) begin // Error State
+ State <= `SEND_WR_REQ;
+ reg_wr <= 1'b1; // Write request
+ reg_req <= 1'b1;
+ end else begin // A to F
+ reg_wdata <= (reg_wdata << 4) | char2hex(rx_data);
+ end
+ end
+ end
+ `SEND_WR_REQ: begin
+ if(reg_ack) begin
+ reg_req <= 1'b0;
+ TxMsgBuf <= "cmd success\n>> "; // Align to 16 character format by appending space character
+ TxMsgSize <= 14;
+ tx_data_avail <= 0;
+ State <= `TX_MSG;
+ NextState <= `RX_CMD_PHASE;
+ end
+ end
+
+ `SEND_RD_REQ: begin
+ if(reg_ack) begin
+ reg_req <= 1'b0;
+ TxMsgBuf <= "Response: "; // Align to 16 character format by appending space character
+ TxMsgSize <= 10;
+ tx_data_avail <= 0;
+ State <= `TX_MSG;
+ NextState <= `SEND_RD_DATA;
+ end
+ end
+ `SEND_RD_DATA: begin // Wait for Operation Completion
+ TxMsgBuf[16*8-1:15*8] <= hex2char(reg_rdata[31:28]);
+ TxMsgBuf[15*8-1:14*8] <= hex2char(reg_rdata[27:24]);
+ TxMsgBuf[14*8-1:13*8] <= hex2char(reg_rdata[23:20]);
+ TxMsgBuf[13*8-1:12*8] <= hex2char(reg_rdata[19:16]);
+ TxMsgBuf[12*8-1:11*8] <= hex2char(reg_rdata[15:12]);
+ TxMsgBuf[11*8-1:10*8] <= hex2char(reg_rdata[11:8]);
+ TxMsgBuf[10*8-1:9*8] <= hex2char(reg_rdata[7:4]);
+ TxMsgBuf[9*8-1:8*8] <= hex2char(reg_rdata[3:0]);
+ TxMsgBuf[8*8-1:7*8] <= "\n";
+ TxMsgSize <= 9;
+ tx_data_avail <= 0;
+ State <= `TX_MSG;
+ NextState <= `RX_CMD_PHASE;
+ end
+
+ // Send Default Message (Contd..)
+ `TX_MSG: begin
+ tx_data_avail <= 1;
+ tx_data <= TxMsgBuf[16*8-1:15*8];
+ if(TxMsgSize == 0) begin
+ tx_data_avail <= 0;
+ State <= NextState;
+ end else if(tx_rd) begin
+ TxMsgBuf <= TxMsgBuf << 8;
+ TxMsgSize <= TxMsgSize -1;
+ end
+ end
+ endcase
+ end
+end
+
+
+// Character to hex number
+function [3:0] char2hex;
+input [7:0] data_in;
+case (data_in)
+ 8'h30: char2hex = 4'h0; // character '0'
+ 8'h31: char2hex = 4'h1; // character '1'
+ 8'h32: char2hex = 4'h2; // character '2'
+ 8'h33: char2hex = 4'h3; // character '3'
+ 8'h34: char2hex = 4'h4; // character '4'
+ 8'h35: char2hex = 4'h5; // character '5'
+ 8'h36: char2hex = 4'h6; // character '6'
+ 8'h37: char2hex = 4'h7; // character '7'
+ 8'h38: char2hex = 4'h8; // character '8'
+ 8'h39: char2hex = 4'h9; // character '9'
+ 8'h41: char2hex = 4'hA; // character 'A'
+ 8'h42: char2hex = 4'hB; // character 'B'
+ 8'h43: char2hex = 4'hC; // character 'C'
+ 8'h44: char2hex = 4'hD; // character 'D'
+ 8'h45: char2hex = 4'hE; // character 'E'
+ 8'h46: char2hex = 4'hF; // character 'F'
+ 8'h61: char2hex = 4'hA; // character 'a'
+ 8'h62: char2hex = 4'hB; // character 'b'
+ 8'h63: char2hex = 4'hC; // character 'c'
+ 8'h64: char2hex = 4'hD; // character 'd'
+ 8'h65: char2hex = 4'hE; // character 'e'
+ 8'h66: char2hex = 4'hF; // character 'f'
+ default : char2hex = 4'hF;
+ endcase
+endfunction
+
+// Hex to Asci Character
+function [7:0] hex2char;
+input [3:0] data_in;
+case (data_in)
+ 4'h0: hex2char = 8'h30; // character '0'
+ 4'h1: hex2char = 8'h31; // character '1'
+ 4'h2: hex2char = 8'h32; // character '2'
+ 4'h3: hex2char = 8'h33; // character '3'
+ 4'h4: hex2char = 8'h34; // character '4'
+ 4'h5: hex2char = 8'h35; // character '5'
+ 4'h6: hex2char = 8'h36; // character '6'
+ 4'h7: hex2char = 8'h37; // character '7'
+ 4'h8: hex2char = 8'h38; // character '8'
+ 4'h9: hex2char = 8'h39; // character '9'
+ 4'hA: hex2char = 8'h41; // character 'A'
+ 4'hB: hex2char = 8'h42; // character 'B'
+ 4'hC: hex2char = 8'h43; // character 'C'
+ 4'hD: hex2char = 8'h44; // character 'D'
+ 4'hE: hex2char = 8'h45; // character 'E'
+ 4'hF: hex2char = 8'h46; // character 'F'
+ endcase
+endfunction
+endmodule
diff --git a/verilog/rtl/uprj_netlists.v b/verilog/rtl/uprj_netlists.v
new file mode 100644
index 0000000..96c4399
--- /dev/null
+++ b/verilog/rtl/uprj_netlists.v
@@ -0,0 +1,95 @@
+// SPDX-FileCopyrightText: 2020 Efabless Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+
+// Include caravel global defines for the number of the user project IO pads
+`include "defines.v"
+`define USE_POWER_PINS
+`define UNIT_DELAY #0.1
+
+`ifdef GL
+ // Assume default net type to be wire because GL netlists don't have the wire definitions
+ `default_nettype wire
+ `include "libs.ref/sky130_fd_sc_hd/verilog/primitives.v"
+ `include "libs.ref/sky130_fd_sc_hd/verilog/sky130_fd_sc_hd.v"
+ `include "libs.ref/sky130_fd_sc_hvl/verilog/primitives.v"
+ `include "libs.ref/sky130_fd_sc_hvl/verilog/sky130_fd_sc_hvl.v"
+ `include "gl/user_project_wrapper.v"
+ `include "gl/glbl_cfg.v"
+ `include "gl/mbist1.v"
+ `include "gl/mbist2.v"
+ `include "gl/wb_host.v"
+ `include "gl/wb_interconnect.v"
+ `include "sram_macros/sky130_sram_2kbyte_1rw1r_32x512_8.v"
+ `include "sram_macros/sky130_sram_1kbyte_1rw1r_32x256_8.v"
+
+`else
+ `include "libs.ref/sky130_fd_sc_hd/verilog/primitives.v"
+ `include "libs.ref/sky130_fd_sc_hd/verilog/sky130_fd_sc_hd.v"
+ `include "libs.ref/sky130_fd_sc_hvl/verilog/primitives.v"
+ `include "libs.ref/sky130_fd_sc_hvl/verilog/sky130_fd_sc_hvl.v"
+
+ `include "user_project_wrapper.v"
+
+
+ `include "mbist/src/core/mbist_addr_gen.sv"
+ `include "mbist/src/core/mbist_fsm.sv"
+ `include "mbist/src/core/mbist_op_sel.sv"
+ `include "mbist/src/core/mbist_repair_addr.sv"
+ `include "mbist/src/core/mbist_sti_sel.sv"
+ `include "mbist/src/core/mbist_pat_sel.sv"
+ `include "mbist/src/core/mbist_mux.sv"
+ `include "mbist/src/core/mbist_data_cmp.sv"
+ `include "mbist/src/core/mbist_mem_wrapper.sv"
+
+ `include "mbist/src/top/mbist_top1.sv"
+ `include "mbist/src/top/mbist_top2.sv"
+
+ `include "wb_host/src/wb_host.sv"
+ `include "lib/async_fifo.sv"
+ `include "lib/async_wb.sv"
+ `include "lib/registers.v"
+ `include "lib/clk_ctl.v"
+ `include "lib/reset_sync.sv"
+ `include "lib/ser_inf_32b.sv"
+ `include "lib/ctech_cells.sv"
+ `include "lib/async_reg_bus.sv"
+ `include "lib/clk_gate.sv"
+ `include "lib/crc_32.sv"
+
+ `include "lib/wb_stagging.sv"
+ `include "wb_interconnect/src/wb_interconnect.sv"
+ `include "glbl/src/glbl_cfg.sv"
+ `include "lbist/src/lbist_top.sv"
+ `include "lbist/src/lbist_core.sv"
+ `include "lbist/src/lbist_reg.sv"
+
+ `include "uart/src/uart_core.sv"
+ `include "uart/src/uart_cfg.sv"
+ `include "uart/src/uart_rxfsm.sv"
+ `include "uart/src/uart_txfsm.sv"
+ `include "lib/async_fifo_th.sv"
+ `include "lib/double_sync_low.v"
+ `include "lib/clk_buf.v"
+ `include "lib/wb_arb.sv"
+
+ `include "uart2wb/src/uart2wb.sv"
+ `include "uart2wb/src/uart2_core.sv"
+ `include "uart2wb/src/uart_msg_handler.v"
+
+ `include "clk_skew_adjust/src/clk_skew_adjust.v"
+ `include "sram_macros/sky130_sram_2kbyte_1rw1r_32x512_8.v"
+ `include "sram_macros/sky130_sram_1kbyte_1rw1r_32x256_8.v"
+
+`endif
diff --git a/verilog/rtl/user_defines.v b/verilog/rtl/user_defines.v
new file mode 100644
index 0000000..1e2cb90
--- /dev/null
+++ b/verilog/rtl/user_defines.v
@@ -0,0 +1,87 @@
+// SPDX-FileCopyrightText: 2020 Efabless Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+
+`default_nettype none
+
+`ifndef __USER_DEFINES_H
+// User GPIO initial configuration parameters
+`define __USER_DEFINES_H
+
+// Useful GPIO mode values. These match the names used in defs.h.
+`define GPIO_MODE_MGMT_STD_INPUT_NOPULL 13'h0403
+`define GPIO_MODE_MGMT_STD_INPUT_PULLDOWN 13'h0803
+`define GPIO_MODE_MGMT_STD_INPUT_PULLUP 13'h0c03
+`define GPIO_MODE_MGMT_STD_OUTPUT 13'h1809
+`define GPIO_MODE_MGMT_STD_BIDIRECTIONAL 13'h1801
+`define GPIO_MODE_MGMT_STD_ANALOG 13'h000b
+
+`define GPIO_MODE_USER_STD_INPUT_NOPULL 13'h0402
+`define GPIO_MODE_USER_STD_INPUT_PULLDOWN 13'h0802
+`define GPIO_MODE_USER_STD_INPUT_PULLUP 13'h0c02
+`define GPIO_MODE_USER_STD_OUTPUT 13'h1808
+`define GPIO_MODE_USER_STD_BIDIRECTIONAL 13'h1800
+`define GPIO_MODE_USER_STD_OUT_MONITORED 13'h1802
+`define GPIO_MODE_USER_STD_ANALOG 13'h000a
+
+// The power-on configuration for GPIO 0 to 4 is fixed and cannot be
+// modified (allowing the SPI and debug to always be accessible unless
+// overridden by a flash program).
+
+// The values below can be any of the standard types defined above,
+// or they can be any 13-bit value if the user wants a non-standard
+// startup state for the GPIO. By default, every GPIO from 5 to 37
+// is set to power up as an input controlled by the management SoC.
+// Users may want to redefine these so that the user project powers
+// up in a state that can be used immediately without depending on
+// the management SoC to run a startup program to configure the GPIOs.
+
+`define USER_CONFIG_GPIO_5_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL // UART_TXD[1]
+`define USER_CONFIG_GPIO_6_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL // UART_RXD[1]
+`define USER_CONFIG_GPIO_7_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_8_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_9_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_10_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_11_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_12_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_13_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_14_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+
+// Configurations of GPIO 15 to 25 are used on caravel but not caravan.
+`define USER_CONFIG_GPIO_15_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_16_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_17_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_18_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_19_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_20_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_21_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_22_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_23_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_24_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_25_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+
+`define USER_CONFIG_GPIO_26_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_27_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_28_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_29_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_30_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_31_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_32_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_33_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_34_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_35_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_36_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+`define USER_CONFIG_GPIO_37_INIT `GPIO_MODE_USER_STD_BIDIRECTIONAL
+
+`endif // __USER_DEFINES_H
diff --git a/verilog/rtl/user_project_wrapper.v b/verilog/rtl/user_project_wrapper.v
new file mode 100644
index 0000000..62c35bf
--- /dev/null
+++ b/verilog/rtl/user_project_wrapper.v
@@ -0,0 +1,1805 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Digital core ////
+//// ////
+//// This file is part of the mbist_ctrl project ////
+//// https://github.com/dineshannayya/mbist_ctrl.git ////
+//// ////
+//// Description ////
+//// This is digital core and integrate all the main block ////
+//// here. ////
+//// 1. Wishbone Host ////
+//// 2. 4x MBIST Controller ////
+//// 3. 2x SRAM 2KB ////
+//// 4. 2x SRAM 1KB ////
+//// 5. Wishbone Interconnect ////
+//// 6. Global Register ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.1 - 13th Oct 2021, Dinesh A ////
+//// Initial Version ////
+//// 0.2 - 19, Nov 2021, Dinesh A ////
+//// Following things are integrated ////
+//// 2x SRAM 2KB, 2x SRAM 1KB, 4 MBIST , ////
+//// 1 Wishbone Interconnect, 1 Global register ////
+//// 0.3 - 20, Nov 2021, Dinesh A ////
+//// Following are integrated ////
+//// 4x SRAM 2KB, 4x SRAM 1KB, 8 MBIST , ////
+//// 1 Wishbone Interconnect, 1 Global register ////
+//// 0.4 - 23 Nov 2021, Dinesh A ////
+//// Three Software Register added for signature at glbl ////
+//// 1.0 - 01 Dec 2021, Dinesh A -MPW-4 ////
+//// A. Logic Bist Integrated inside the Wb_host ////
+//// B. Below Scan chain created ////
+//// WB_HOST(LBIST) => GLBL => MBIST5 => MBIST6 => MBIST7 ////
+//// => MBIST8 => WB_INTERCONNECT => MBIST4 => MBIST3 => ////
+//// MBIST2 => MBIST1 => WB_HOST(LBIST) ////
+//// 1.1 - 03 Dec 2021, Dinesh A ////
+//// Timing closure clean-up ////
+//// 1.2 - 10 Dec 2021, Dinesh A ////
+//// Full Chip Timing closure wth caravel ////
+//// 1.3 - 21 Dec 2021, Dinesh A ////
+//// A. LBIST bypass added, SCAN can be controlled through ////
+//// LA ports ////
+//// B. LBIST reset chain check compare bypass added ////
+//// 1.4 Jan 02, 2022, Dinesh A ////
+//// 1. LA[0] is added as soft reset option at wb_port ////
+//// 2. Uart Master is added at wb_port ////
+//// 1.5 Feb 18, 2022, Dinesh A ////
+//// As SRAM timing model are not accurate, added additionl ////
+//// drive data towards SRAM in negedge phase(cfg_mem_lphase)///
+//// 1.6 Mar 16, 2022, Dinesh A ////
+//// RTL changes in wb_host to fix caraval wb address ////
+//// reduction to 0x3000_0000 to 0x300F_FFFF ////
+//////////////////////////////////////////////////////////////////////
+`default_nettype none
+
+module user_project_wrapper(
+`ifdef USE_POWER_PINS
+ inout vdda1, // User area 1 3.3V supply
+ inout vdda2, // User area 2 3.3V supply
+ inout vssa1, // User area 1 analog ground
+ inout vssa2, // User area 2 analog ground
+ inout vccd1, // User area 1 1.8V supply
+ inout vccd2, // User area 2 1.8v supply
+ inout vssd1, // User area 1 digital ground
+ inout vssd2, // User area 2 digital ground
+`endif
+
+ // Wishbone Slave ports (WB MI A)
+ input wb_clk_i,
+ input wb_rst_i,
+ input wbs_stb_i,
+ input wbs_cyc_i,
+ input wbs_we_i,
+ input [3:0] wbs_sel_i,
+ input [31:0] wbs_dat_i,
+ input [31:0] wbs_adr_i,
+ output wbs_ack_o,
+ output [31:0] wbs_dat_o,
+
+ // Logic Analyzer Signals
+ input [127:0] la_data_in,
+ output [127:0] la_data_out,
+ input [127:0] la_oenb,
+
+ // IOs
+ input [37:0] io_in,
+ output [37:0] io_out,
+ output [37:0] io_oeb,
+
+ // Analog (direct connection to GPIO pad---use with caution)
+ // Note that analog I/O is not available on the 7 lowest-numbered
+ // GPIO pads, and so the analog_io indexing is offset from the
+ // GPIO indexing by 7 (also upper 2 GPIOs do not have analog_io).
+ inout [28:0] analog_io,
+
+ // Independent clock (on independent integer divider)
+ input user_clock2,
+
+ // User maskable interrupt signals
+ output [2:0] user_irq
+);
+
+parameter BIST1_ADDR_WD = 11; // 512x32 SRAM
+parameter BIST2_ADDR_WD = 10; // 256x32 SRAM
+parameter BIST_DATA_WD = 32;
+parameter WB_WIDTH = 32; // WB ADDRESS/DARA WIDTH
+
+parameter SCW = 8; // SCAN CHAIN WIDTH
+//---------------------------------------------------------------------
+// WB HOST Interface
+//---------------------------------------------------------------------
+wire wbd_int_cyc_i; // strobe/request
+wire wbd_int_stb_i; // strobe/request
+wire [WB_WIDTH-1:0] wbd_int_adr_i; // address
+wire wbd_int_we_i; // write
+wire [WB_WIDTH-1:0] wbd_int_dat_i; // data output
+wire [3:0] wbd_int_sel_i; // byte enable
+wire [WB_WIDTH-1:0] wbd_int_dat_o; // data input
+wire wbd_int_ack_o; // acknowlegement
+wire wbd_int_err_o; // error
+
+//---------------------------------------------------------------------
+// Global Register Wishbone Interface
+//---------------------------------------------------------------------
+wire wbd_glbl_stb_o; // strobe/request
+wire [7:0] wbd_glbl_adr_o; // address
+wire wbd_glbl_we_o; // write
+wire [WB_WIDTH-1:0] wbd_glbl_dat_o; // data output
+wire [3:0] wbd_glbl_sel_o; // byte enable
+wire wbd_glbl_cyc_o ;
+wire [WB_WIDTH-1:0] wbd_glbl_dat_i; // data input
+wire wbd_glbl_ack_i; // acknowlegement
+wire wbd_glbl_err_i; // error
+
+//---------------------------------------------------------------------
+// MBIST1
+//---------------------------------------------------------------------
+wire wbd_mbist1_stb_o; // strobe/request
+wire [BIST1_ADDR_WD-1:0] wbd_mbist1_adr_o; // address
+wire wbd_mbist1_we_o; // write
+wire [WB_WIDTH-1:0] wbd_mbist1_dat_o; // data output
+wire [3:0] wbd_mbist1_sel_o; // byte enable
+wire wbd_mbist1_cyc_o ;
+wire [WB_WIDTH-1:0] wbd_mbist1_dat_i; // data input
+wire wbd_mbist1_ack_i; // acknowlegement
+wire wbd_mbist1_err_i; // error
+
+//---------------------------------------------------------------------
+// MBIST2
+//---------------------------------------------------------------------
+wire wbd_mbist2_stb_o; // strobe/request
+wire [BIST1_ADDR_WD-1:0] wbd_mbist2_adr_o; // address
+wire wbd_mbist2_we_o; // write
+wire [WB_WIDTH-1:0] wbd_mbist2_dat_o; // data output
+wire [3:0] wbd_mbist2_sel_o; // byte enable
+wire wbd_mbist2_cyc_o ;
+wire [WB_WIDTH-1:0] wbd_mbist2_dat_i; // data input
+wire wbd_mbist2_ack_i; // acknowlegement
+wire wbd_mbist2_err_i; // error
+
+//---------------------------------------------------------------------
+// MBIST3
+//---------------------------------------------------------------------
+wire wbd_mbist3_stb_o; // strobe/request
+wire [BIST1_ADDR_WD-1:0] wbd_mbist3_adr_o; // address
+wire wbd_mbist3_we_o; // write
+wire [WB_WIDTH-1:0] wbd_mbist3_dat_o; // data output
+wire [3:0] wbd_mbist3_sel_o; // byte enable
+wire wbd_mbist3_cyc_o ;
+wire [WB_WIDTH-1:0] wbd_mbist3_dat_i; // data input
+wire wbd_mbist3_ack_i; // acknowlegement
+wire wbd_mbist3_err_i; // error
+
+//---------------------------------------------------------------------
+// MBIST4
+//---------------------------------------------------------------------
+wire wbd_mbist4_stb_o; // strobe/request
+wire [BIST1_ADDR_WD-1:0] wbd_mbist4_adr_o; // address
+wire wbd_mbist4_we_o; // write
+wire [WB_WIDTH-1:0] wbd_mbist4_dat_o; // data output
+wire [3:0] wbd_mbist4_sel_o; // byte enable
+wire wbd_mbist4_cyc_o ;
+wire [WB_WIDTH-1:0] wbd_mbist4_dat_i; // data input
+wire wbd_mbist4_ack_i; // acknowlegement
+wire wbd_mbist4_err_i; // error
+
+//---------------------------------------------------------------------
+// MBIST5
+//---------------------------------------------------------------------
+wire wbd_mbist5_stb_o; // strobe/request
+wire [BIST2_ADDR_WD-1:0] wbd_mbist5_adr_o; // address
+wire wbd_mbist5_we_o; // write
+wire [WB_WIDTH-1:0] wbd_mbist5_dat_o; // data output
+wire [3:0] wbd_mbist5_sel_o; // byte enable
+wire wbd_mbist5_cyc_o ;
+wire [WB_WIDTH-1:0] wbd_mbist5_dat_i; // data input
+wire wbd_mbist5_ack_i; // acknowlegement
+wire wbd_mbist5_err_i; // error
+
+//---------------------------------------------------------------------
+// MBIST6
+//---------------------------------------------------------------------
+wire wbd_mbist6_stb_o; // strobe/request
+wire [BIST2_ADDR_WD-1:0] wbd_mbist6_adr_o; // address
+wire wbd_mbist6_we_o; // write
+wire [WB_WIDTH-1:0] wbd_mbist6_dat_o; // data output
+wire [3:0] wbd_mbist6_sel_o; // byte enable
+wire wbd_mbist6_cyc_o ;
+wire [WB_WIDTH-1:0] wbd_mbist6_dat_i; // data input
+wire wbd_mbist6_ack_i; // acknowlegement
+wire wbd_mbist6_err_i; // error
+
+//---------------------------------------------------------------------
+// MBIST7
+//---------------------------------------------------------------------
+wire wbd_mbist7_stb_o; // strobe/request
+wire [BIST2_ADDR_WD-1:0] wbd_mbist7_adr_o; // address
+wire wbd_mbist7_we_o; // write
+wire [WB_WIDTH-1:0] wbd_mbist7_dat_o; // data output
+wire [3:0] wbd_mbist7_sel_o; // byte enable
+wire wbd_mbist7_cyc_o ;
+wire [WB_WIDTH-1:0] wbd_mbist7_dat_i; // data input
+wire wbd_mbist7_ack_i; // acknowlegement
+wire wbd_mbist7_err_i; // error
+
+//---------------------------------------------------------------------
+// MBIST8
+//---------------------------------------------------------------------
+wire wbd_mbist8_stb_o; // strobe/request
+wire [BIST2_ADDR_WD-1:0] wbd_mbist8_adr_o; // address
+wire wbd_mbist8_we_o; // write
+wire [WB_WIDTH-1:0] wbd_mbist8_dat_o; // data output
+wire [3:0] wbd_mbist8_sel_o; // byte enable
+wire wbd_mbist8_cyc_o ;
+wire [WB_WIDTH-1:0] wbd_mbist8_dat_i; // data input
+wire wbd_mbist8_ack_i; // acknowlegement
+wire wbd_mbist8_err_i; // error
+
+
+wire wbd_int_rst_n;
+wire bist_rst_n;
+
+// MBIST I/F
+wire [7:0] bist_en;
+wire [7:0] bist_run;
+wire [7:0] bist_shift;
+wire [7:0] bist_load;
+wire [7:0] bist_sdi;
+
+wire [7:0] bist_correct;
+wire [7:0] bist_error;
+wire [7:0] bist_done;
+wire [7:0] bist_sdo;
+
+wire [3:0] bist_error_cnt0;
+wire [3:0] bist_error_cnt1;
+wire [3:0] bist_error_cnt2;
+wire [3:0] bist_error_cnt3;
+wire [3:0] bist_error_cnt4;
+wire [3:0] bist_error_cnt5;
+wire [3:0] bist_error_cnt6;
+wire [3:0] bist_error_cnt7;
+
+// MBIST I/F Buffered
+wire [7:0] bist_en_int;
+wire [7:0] bist_run_int;
+wire [7:0] bist_shift_int;
+wire [7:0] bist_load_int;
+wire [7:0] bist_sdi_int;
+
+wire [7:0] bist_correct_int;
+wire [7:0] bist_error_int;
+wire [7:0] bist_done_int;
+wire [7:0] bist_sdo_int;
+
+wire [3:0] bist_error_cnt0_int;
+wire [3:0] bist_error_cnt1_int;
+wire [3:0] bist_error_cnt2_int;
+wire [3:0] bist_error_cnt3_int;
+wire [3:0] bist_error_cnt4_int;
+wire [3:0] bist_error_cnt5_int;
+wire [3:0] bist_error_cnt6_int;
+wire [3:0] bist_error_cnt7_int;
+
+// towards memory MBIST1
+// PORT-A
+wire mem1_clk_a;
+wire [BIST1_ADDR_WD-1:2] mem1_addr_a;
+wire mem1_cen_a;
+wire [BIST_DATA_WD-1:0] mem1_din_b;
+
+// PORT-B
+wire mem1_clk_b;
+wire mem1_cen_b;
+wire mem1_web_b;
+wire [BIST_DATA_WD/8-1:0] mem1_mask_b;
+wire [BIST1_ADDR_WD-1:2] mem1_addr_b;
+wire [BIST_DATA_WD-1:0] mem1_dout_a;
+
+// towards memory MBIST2
+// PORT-A
+wire mem2_clk_a;
+wire [BIST1_ADDR_WD-1:2] mem2_addr_a;
+wire mem2_cen_a;
+wire [BIST_DATA_WD-1:0] mem2_din_b;
+
+// PORT-B
+wire mem2_clk_b;
+wire mem2_cen_b;
+wire mem2_web_b;
+wire [BIST_DATA_WD/8-1:0] mem2_mask_b;
+wire [BIST1_ADDR_WD-1:2] mem2_addr_b;
+wire [BIST_DATA_WD-1:0] mem2_dout_a;
+
+// towards memory MBIST3
+// PORT-A
+wire mem3_clk_a;
+wire [BIST1_ADDR_WD-1:2] mem3_addr_a;
+wire mem3_cen_a;
+wire [BIST_DATA_WD-1:0] mem3_din_b;
+
+// PORT-B
+wire mem3_clk_b;
+wire mem3_cen_b;
+wire mem3_web_b;
+wire [BIST_DATA_WD/8-1:0] mem3_mask_b;
+wire [BIST1_ADDR_WD-1:2] mem3_addr_b;
+wire [BIST_DATA_WD-1:0] mem3_dout_a;
+
+// towards memory MBIST4
+// PORT-A
+wire mem4_clk_a;
+wire [BIST1_ADDR_WD-1:2] mem4_addr_a;
+wire mem4_cen_a;
+wire [BIST_DATA_WD-1:0] mem4_din_b;
+
+// PORT-B
+wire mem4_clk_b;
+wire mem4_cen_b;
+wire mem4_web_b;
+wire [BIST_DATA_WD/8-1:0] mem4_mask_b;
+wire [BIST1_ADDR_WD-1:2] mem4_addr_b;
+wire [BIST_DATA_WD-1:0] mem4_dout_a;
+
+// towards memory MBIST5
+// PORT-A
+wire mem5_clk_a;
+wire [BIST2_ADDR_WD-1:2] mem5_addr_a;
+wire mem5_cen_a;
+wire [BIST_DATA_WD-1:0] mem5_din_b;
+
+// PORT-B
+wire mem5_clk_b;
+wire mem5_cen_b;
+wire mem5_web_b;
+wire [BIST_DATA_WD/8-1:0] mem5_mask_b;
+wire [BIST2_ADDR_WD-1:2] mem5_addr_b;
+wire [BIST_DATA_WD-1:0] mem5_dout_a;
+
+// towards memory MBIST6
+// PORT-A
+wire mem6_clk_a;
+wire [BIST2_ADDR_WD-1:2] mem6_addr_a;
+wire mem6_cen_a;
+wire [BIST_DATA_WD-1:0] mem6_din_b;
+
+// PORT-B
+wire mem6_clk_b;
+wire mem6_cen_b;
+wire mem6_web_b;
+wire [BIST_DATA_WD/8-1:0] mem6_mask_b;
+wire [BIST2_ADDR_WD-1:2] mem6_addr_b;
+wire [BIST_DATA_WD-1:0] mem6_dout_a;
+
+// towards memory MBIST7
+// PORT-A
+wire mem7_clk_a;
+wire [BIST2_ADDR_WD-1:2] mem7_addr_a;
+wire mem7_cen_a;
+wire [BIST_DATA_WD-1:0] mem7_din_b;
+
+// PORT-B
+wire mem7_clk_b;
+wire mem7_cen_b;
+wire mem7_web_b;
+wire [BIST_DATA_WD/8-1:0] mem7_mask_b;
+wire [BIST2_ADDR_WD-1:2] mem7_addr_b;
+wire [BIST_DATA_WD-1:0] mem7_dout_a;
+
+// towards memory MBIST8
+// PORT-A
+wire mem8_clk_a;
+wire [BIST2_ADDR_WD-1:2] mem8_addr_a;
+wire mem8_cen_a;
+wire [BIST_DATA_WD-1:0] mem8_din_b;
+
+// PORT-B
+wire mem8_clk_b;
+wire mem8_cen_b;
+wire mem8_web_b;
+wire [BIST_DATA_WD/8-1:0] mem8_mask_b;
+wire [BIST2_ADDR_WD-1:2] mem8_addr_b;
+wire [BIST_DATA_WD-1:0] mem8_dout_a;
+
+wire lbist_clk ;
+wire wbd_clk_wh ;
+wire wbd_clk_int ;
+wire wbd_clk_glbl_int ;
+wire wbd_clk_mbist1_int ;
+wire wbd_clk_mbist2_int ;
+wire wbd_clk_mbist3_int ;
+wire wbd_clk_mbist4_int ;
+wire wbd_clk_mbist5_int ;
+wire wbd_clk_mbist6_int ;
+wire wbd_clk_mbist7_int ;
+wire wbd_clk_mbist8_int ;
+wire wbd_clk_wi ;
+wire wbd_clk_glbl ; // clock for global reg
+wire wbd_clk_mbist1 ; // clock for global reg
+wire wbd_clk_mbist2 ; // clock for global reg
+wire wbd_clk_mbist3 ; // clock for global reg
+wire wbd_clk_mbist4 ; // clock for global reg
+wire wbd_clk_mbist5 ; // clock for global reg
+wire wbd_clk_mbist6 ; // clock for global reg
+wire wbd_clk_mbist7 ; // clock for global reg
+wire wbd_clk_mbist8 ; // clock for global reg
+
+wire [31:0] cfg_clk_ctrl1 ;
+wire [31:0] cfg_clk_ctrl2 ;
+
+// Scan Control Signal
+wire scan_clk ;
+wire scan_rst_n ;
+
+wire scan_mode ;
+wire scan_en ;
+wire [SCW-1:0] scan_in ;
+wire [SCW-1:0] scan_out ;
+
+wire scan_mode_glbl ;
+wire scan_en_glbl ;
+wire [SCW-1:0] scan_out_glbl ;
+
+wire scan_mode_wbi ;
+wire scan_en_wbi ;
+wire [SCW-1:0] scan_out_wbi ;
+
+wire scan_mode_mbist1 ;
+wire scan_en_mbist1 ;
+wire [SCW-1:0] scan_out_mbist1 ;
+
+wire scan_mode_mbist2 ;
+wire scan_en_mbist2 ;
+wire [SCW-1:0] scan_out_mbist2 ;
+
+wire scan_mode_mbist3 ;
+wire scan_en_mbist3 ;
+wire [SCW-1:0] scan_out_mbist3 ;
+
+wire scan_mode_mbist4 ;
+wire scan_en_mbist4 ;
+wire [SCW-1:0] scan_out_mbist4 ;
+
+wire scan_mode_mbist5 ;
+wire scan_en_mbist5 ;
+wire [SCW-1:0] scan_out_mbist5 ;
+
+wire scan_mode_mbist6 ;
+wire scan_en_mbist6 ;
+wire [SCW-1:0] scan_out_mbist6 ;
+
+wire scan_mode_mbist7 ;
+wire scan_en_mbist7 ;
+wire [SCW-1:0] scan_out_mbist7 ;
+
+wire scan_mode_mbist8 ;
+wire scan_en_mbist8 ;
+wire [SCW-1:0] scan_out_mbist8 ;
+
+////////////////////////////////////////////////////////////
+// Scan Tree Map
+///////////////////////////////////////////////////////////
+
+// WB_HOST(LBIST) => GLBL => MBIST5 => MBIST6 => MBIST7
+// => MBIST8 => WB_INTERCONNECT => MBIST4 => MBIST3
+// => MBIST2 => MBIST1 => WB_HOST(LBIST)
+
+/////////////////////////////////////////////////////////
+// Clock Skew Ctrl
+////////////////////////////////////////////////////////
+
+wire [3:0] cfg_cska_wh = cfg_clk_ctrl1[3:0];
+wire [3:0] cfg_cska_wi = cfg_clk_ctrl1[7:4];
+wire [3:0] cfg_cska_glbl = cfg_clk_ctrl1[11:8];
+wire [3:0] cfg_cska_lbist = cfg_clk_ctrl1[15:12];
+
+wire cfg_mem_lphase = cfg_clk_ctrl1[31]; // SRAM data lanuch phase selection
+
+wire [3:0] cfg_cska_mbist1 = cfg_clk_ctrl2[3:0];
+wire [3:0] cfg_cska_mbist2 = cfg_clk_ctrl2[7:4];
+wire [3:0] cfg_cska_mbist3 = cfg_clk_ctrl2[11:8];
+wire [3:0] cfg_cska_mbist4 = cfg_clk_ctrl2[15:12];
+wire [3:0] cfg_cska_mbist5 = cfg_clk_ctrl2[19:16];
+wire [3:0] cfg_cska_mbist6 = cfg_clk_ctrl2[23:20];
+wire [3:0] cfg_cska_mbist7 = cfg_clk_ctrl2[27:24];
+wire [3:0] cfg_cska_mbist8 = cfg_clk_ctrl2[31:28];
+
+wb_host
+ #(
+ `ifndef SYNTHESIS
+ .SCW(SCW) // SCAN CHAIN WIDTH
+ `endif
+ )
+ u_wb_host(
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1 ),// User area 1 1.8V supply
+ .vssd1 (vssd1 ),// User area 1 digital ground
+`endif
+ .user_clock1 (wb_clk_i ),
+ .user_clock2 (user_clock2 ),
+ .user_irq (user_irq ),
+
+ // Master Port
+ .wbm_rst_i (wb_rst_i ),
+ .wbm_clk_i (wb_clk_i ),
+ .wbm_cyc_i (wbs_cyc_i ),
+ .wbm_stb_i (wbs_stb_i ),
+ .wbm_adr_i (wbs_adr_i ),
+ .wbm_we_i (wbs_we_i ),
+ .wbm_dat_i (wbs_dat_i ),
+ .wbm_sel_i (wbs_sel_i ),
+ .wbm_dat_o (wbs_dat_o ),
+ .wbm_ack_o (wbs_ack_o ),
+ .wbm_err_o ( ),
+
+ // Clock Skeq Adjust
+ .wbd_clk_int (wbd_clk_int ),
+ .wbd_clk_wh (wbd_clk_wh ),
+ .cfg_cska_wh (cfg_cska_wh ),
+
+ // Clock Skeq Adjust
+ .lbist_clk_int (lbist_clk ),
+ .lbist_clk_out (lbist_clk ),
+ .cfg_cska_lbist (cfg_cska_lbist ),
+
+ // Slave Port
+ .wbs_clk_out (wbd_clk_int ),
+ .wbs_clk_i (wbd_clk_wh ),
+ .wbs_cyc_o (wbd_int_cyc_i ),
+ .wbs_stb_o (wbd_int_stb_i ),
+ .wbs_adr_o (wbd_int_adr_i ),
+ .wbs_we_o (wbd_int_we_i ),
+ .wbs_dat_o (wbd_int_dat_i ),
+ .wbs_sel_o (wbd_int_sel_i ),
+ .wbs_dat_i (wbd_int_dat_o ),
+ .wbs_ack_i (wbd_int_ack_o ),
+ .wbs_err_i (wbd_int_err_o ),
+
+ .cfg_clk_ctrl1 (cfg_clk_ctrl1 ),
+ .cfg_clk_ctrl2 (cfg_clk_ctrl2 ),
+
+ .bist_rst_n (bist_rst_n ),
+ .wbd_int_rst_n (wbd_int_rst_n ),
+
+ .io_in (io_in[0] ),
+ .io_out (io_out ),
+ .io_oeb (io_oeb ),
+ .la_data_in (la_data_in[35:0] ),
+ .la_data_out (la_data_out ),
+
+
+ // Scan Control Signal
+ .scan_clk (scan_clk ),
+ .scan_rst_n (scan_rst_n ),
+ .scan_mode (scan_mode ),
+ .scan_en (scan_en ),
+ .scan_in (scan_in ),
+ .scan_out (scan_out_mbist1 )
+
+ );
+
+wb_interconnect #(
+ `ifndef SYNTHESIS
+ .SCW(SCW), // SCAN CHAIN WIDTH
+ .CH_CLK_WD(9),
+ .CH_DATA_WD(104)
+ `endif
+ )
+ u_intercon (
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1 ),// User area 1 1.8V supply
+ .vssd1 (vssd1 ),// User area 1 digital ground
+`endif
+ // SCAN I/F
+ .scan_en (scan_en_mbist8 ),
+ .scan_mode (scan_mode_mbist8 ),
+ .scan_si (scan_out_mbist8 ),
+
+ .scan_en_o (scan_en_wbi ),
+ .scan_mode_o (scan_mode_wbi ),
+ .scan_so (scan_out_wbi ),
+ // Clock Skew adjust
+ .wbd_clk_int (wbd_clk_int ),
+ .cfg_cska_wi (cfg_cska_wi ),
+ .wbd_clk_wi (wbd_clk_wi ),
+
+ .ch_clk_in ({
+ wbd_clk_int,
+ wbd_clk_int,
+ wbd_clk_int,
+ wbd_clk_int,
+ wbd_clk_int,
+ wbd_clk_int,
+ wbd_clk_int,
+ wbd_clk_int,
+ wbd_clk_int}),
+ .ch_clk_out ({
+ wbd_clk_mbist8_int,
+ wbd_clk_mbist7_int,
+ wbd_clk_mbist6_int,
+ wbd_clk_mbist5_int,
+ wbd_clk_mbist4_int,
+ wbd_clk_mbist3_int,
+ wbd_clk_mbist2_int,
+ wbd_clk_mbist1_int,
+ wbd_clk_glbl_int
+ }),
+ .ch_data_in ({
+ bist_error_cnt7,
+ bist_correct[7],
+ bist_error[7],
+ bist_done[7],
+ bist_sdo[7],
+ bist_sdi[7],
+ bist_load[7],
+ bist_shift[7],
+ bist_run[7],
+ bist_en[7],
+
+ bist_error_cnt6,
+ bist_correct[6],
+ bist_error[6],
+ bist_done[6],
+ bist_sdo[6],
+ bist_sdi[6],
+ bist_load[6],
+ bist_shift[6],
+ bist_run[6],
+ bist_en[6],
+
+ bist_error_cnt5,
+ bist_correct[5],
+ bist_error[5],
+ bist_done[5],
+ bist_sdo[5],
+ bist_sdi[5],
+ bist_load[5],
+ bist_shift[5],
+ bist_run[5],
+ bist_en[5],
+
+ bist_error_cnt4,
+ bist_correct[4],
+ bist_error[4],
+ bist_done[4],
+ bist_sdo[4],
+ bist_sdi[4],
+ bist_load[4],
+ bist_shift[4],
+ bist_run[4],
+ bist_en[4],
+
+ bist_error_cnt3,
+ bist_correct[3],
+ bist_error[3],
+ bist_done[3],
+ bist_sdo[3],
+ bist_sdi[3],
+ bist_load[3],
+ bist_shift[3],
+ bist_run[3],
+ bist_en[3],
+
+ bist_error_cnt2,
+ bist_correct[2],
+ bist_error[2],
+ bist_done[2],
+ bist_sdo[2],
+ bist_sdi[2],
+ bist_load[2],
+ bist_shift[2],
+ bist_run[2],
+ bist_en[2],
+
+ bist_error_cnt1,
+ bist_correct[1],
+ bist_error[1],
+ bist_done[1],
+ bist_sdo[1],
+ bist_sdi[1],
+ bist_load[1],
+ bist_shift[1],
+ bist_run[1],
+ bist_en[1],
+
+ bist_error_cnt0,
+ bist_correct[0],
+ bist_error[0],
+ bist_done[0],
+ bist_sdo[0],
+ bist_sdi[0],
+ bist_load[0],
+ bist_shift[0],
+ bist_run[0],
+ bist_en[0]
+ } ),
+ .ch_data_out ({
+ bist_error_cnt7_int,
+ bist_correct_int[7],
+ bist_error_int[7],
+ bist_done_int[7],
+ bist_sdo_int[7],
+ bist_sdi_int[7],
+ bist_load_int[7],
+ bist_shift_int[7],
+ bist_run_int[7],
+ bist_en_int[7],
+
+ bist_error_cnt6_int,
+ bist_correct_int[6],
+ bist_error_int[6],
+ bist_done_int[6],
+ bist_sdo_int[6],
+ bist_sdi_int[6],
+ bist_load_int[6],
+ bist_shift_int[6],
+ bist_run_int[6],
+ bist_en_int[6],
+
+ bist_error_cnt5_int,
+ bist_correct_int[5],
+ bist_error_int[5],
+ bist_done_int[5],
+ bist_sdo_int[5],
+ bist_sdi_int[5],
+ bist_load_int[5],
+ bist_shift_int[5],
+ bist_run_int[5],
+ bist_en_int[5],
+
+ bist_error_cnt4_int,
+ bist_correct_int[4],
+ bist_error_int[4],
+ bist_done_int[4],
+ bist_sdo_int[4],
+ bist_sdi_int[4],
+ bist_load_int[4],
+ bist_shift_int[4],
+ bist_run_int[4],
+ bist_en_int[4],
+
+ bist_error_cnt3_int,
+ bist_correct_int[3],
+ bist_error_int[3],
+ bist_done_int[3],
+ bist_sdo_int[3],
+ bist_sdi_int[3],
+ bist_load_int[3],
+ bist_shift_int[3],
+ bist_run_int[3],
+ bist_en_int[3],
+
+ bist_error_cnt2_int,
+ bist_correct_int[2],
+ bist_error_int[2],
+ bist_done_int[2],
+ bist_sdo_int[2],
+ bist_sdi_int[2],
+ bist_load_int[2],
+ bist_shift_int[2],
+ bist_run_int[2],
+ bist_en_int[2],
+
+ bist_error_cnt1_int,
+ bist_correct_int[1],
+ bist_error_int[1],
+ bist_done_int[1],
+ bist_sdo_int[1],
+ bist_sdi_int[1],
+ bist_load_int[1],
+ bist_shift_int[1],
+ bist_run_int[1],
+ bist_en_int[1],
+
+ bist_error_cnt0_int,
+ bist_correct_int[0],
+ bist_error_int[0],
+ bist_done_int[0],
+ bist_sdo_int[0],
+ bist_sdi_int[0],
+ bist_load_int[0],
+ bist_shift_int[0],
+ bist_run_int[0],
+ bist_en_int[0]
+ }),
+
+ .clk_i (wbd_clk_wi ),
+ .rst_n (wbd_int_rst_n ),
+
+ // Master 0 Interface
+ .m0_wbd_dat_i (wbd_int_dat_i ),
+ .m0_wbd_adr_i (wbd_int_adr_i ),
+ .m0_wbd_sel_i (wbd_int_sel_i ),
+ .m0_wbd_we_i (wbd_int_we_i ),
+ .m0_wbd_cyc_i (wbd_int_cyc_i ),
+ .m0_wbd_stb_i (wbd_int_stb_i ),
+ .m0_wbd_dat_o (wbd_int_dat_o ),
+ .m0_wbd_ack_o (wbd_int_ack_o ),
+ .m0_wbd_err_o (wbd_int_err_o ),
+
+ // Slave 0 Interface
+ // .s0_wbd_err_i (1'b0 ), - Moved inside IP
+ .s0_wbd_dat_i (wbd_glbl_dat_i ),
+ .s0_wbd_ack_i (wbd_glbl_ack_i ),
+ .s0_wbd_dat_o (wbd_glbl_dat_o ),
+ .s0_wbd_adr_o (wbd_glbl_adr_o ),
+ .s0_wbd_sel_o (wbd_glbl_sel_o ),
+ .s0_wbd_we_o (wbd_glbl_we_o ),
+ .s0_wbd_cyc_o (wbd_glbl_cyc_o ),
+ .s0_wbd_stb_o (wbd_glbl_stb_o ),
+
+ // Slave 0 Interface
+ // .s0_wbd_err_i (1'b0 ), - Moved inside IP
+ .s1_wbd_dat_i (wbd_mbist1_dat_i ),
+ .s1_wbd_ack_i (wbd_mbist1_ack_i ),
+ .s1_wbd_dat_o (wbd_mbist1_dat_o ),
+ .s1_wbd_adr_o (wbd_mbist1_adr_o ),
+ .s1_wbd_sel_o (wbd_mbist1_sel_o ),
+ .s1_wbd_we_o (wbd_mbist1_we_o ),
+ .s1_wbd_cyc_o (wbd_mbist1_cyc_o ),
+ .s1_wbd_stb_o (wbd_mbist1_stb_o ),
+
+ // Slave 1 Interface
+ // .s1_wbd_err_i (1'b0 ), - Moved inside IP
+ .s2_wbd_dat_i (wbd_mbist2_dat_i ),
+ .s2_wbd_ack_i (wbd_mbist2_ack_i ),
+ .s2_wbd_dat_o (wbd_mbist2_dat_o ),
+ .s2_wbd_adr_o (wbd_mbist2_adr_o ),
+ .s2_wbd_sel_o (wbd_mbist2_sel_o ),
+ .s2_wbd_we_o (wbd_mbist2_we_o ),
+ .s2_wbd_cyc_o (wbd_mbist2_cyc_o ),
+ .s2_wbd_stb_o (wbd_mbist2_stb_o ),
+
+ // Slave 2 Interface
+ // .s2_wbd_err_i (1'b0 ), - Moved inside IP
+ .s3_wbd_dat_i (wbd_mbist3_dat_i ),
+ .s3_wbd_ack_i (wbd_mbist3_ack_i ),
+ .s3_wbd_dat_o (wbd_mbist3_dat_o ),
+ .s3_wbd_adr_o (wbd_mbist3_adr_o ),
+ .s3_wbd_sel_o (wbd_mbist3_sel_o ),
+ .s3_wbd_we_o (wbd_mbist3_we_o ),
+ .s3_wbd_cyc_o (wbd_mbist3_cyc_o ),
+ .s3_wbd_stb_o (wbd_mbist3_stb_o ),
+
+ // Slave 3 Interface
+ // .s3_wbd_err_i (1'b0 ), - Moved inside IP
+ .s4_wbd_dat_i (wbd_mbist4_dat_i ),
+ .s4_wbd_ack_i (wbd_mbist4_ack_i ),
+ .s4_wbd_dat_o (wbd_mbist4_dat_o ),
+ .s4_wbd_adr_o (wbd_mbist4_adr_o ),
+ .s4_wbd_sel_o (wbd_mbist4_sel_o ),
+ .s4_wbd_we_o (wbd_mbist4_we_o ),
+ .s4_wbd_cyc_o (wbd_mbist4_cyc_o ),
+ .s4_wbd_stb_o (wbd_mbist4_stb_o ),
+
+ // Slave 4 Interface
+ // .s0_wbd_err_i (1'b0 ), - Moved inside IP
+ .s5_wbd_dat_i (wbd_mbist5_dat_i ),
+ .s5_wbd_ack_i (wbd_mbist5_ack_i ),
+ .s5_wbd_dat_o (wbd_mbist5_dat_o ),
+ .s5_wbd_adr_o (wbd_mbist5_adr_o ),
+ .s5_wbd_sel_o (wbd_mbist5_sel_o ),
+ .s5_wbd_we_o (wbd_mbist5_we_o ),
+ .s5_wbd_cyc_o (wbd_mbist5_cyc_o ),
+ .s5_wbd_stb_o (wbd_mbist5_stb_o ),
+
+ // Slave 5 Interface
+ // .s6_wbd_err_i (1'b0 ), - Moved inside IP
+ .s6_wbd_dat_i (wbd_mbist6_dat_i ),
+ .s6_wbd_ack_i (wbd_mbist6_ack_i ),
+ .s6_wbd_dat_o (wbd_mbist6_dat_o ),
+ .s6_wbd_adr_o (wbd_mbist6_adr_o ),
+ .s6_wbd_sel_o (wbd_mbist6_sel_o ),
+ .s6_wbd_we_o (wbd_mbist6_we_o ),
+ .s6_wbd_cyc_o (wbd_mbist6_cyc_o ),
+ .s6_wbd_stb_o (wbd_mbist6_stb_o ),
+
+ // Slave 6 Interface
+ // .s7_wbd_err_i (1'b0 ), - Moved inside IP
+ .s7_wbd_dat_i (wbd_mbist7_dat_i ),
+ .s7_wbd_ack_i (wbd_mbist7_ack_i ),
+ .s7_wbd_dat_o (wbd_mbist7_dat_o ),
+ .s7_wbd_adr_o (wbd_mbist7_adr_o ),
+ .s7_wbd_sel_o (wbd_mbist7_sel_o ),
+ .s7_wbd_we_o (wbd_mbist7_we_o ),
+ .s7_wbd_cyc_o (wbd_mbist7_cyc_o ),
+ .s7_wbd_stb_o (wbd_mbist7_stb_o ),
+
+ // Slave 7 Interface
+ // .s8_wbd_err_i (1'b0 ), - Moved inside IP
+ .s8_wbd_dat_i (wbd_mbist8_dat_i ),
+ .s8_wbd_ack_i (wbd_mbist8_ack_i ),
+ .s8_wbd_dat_o (wbd_mbist8_dat_o ),
+ .s8_wbd_adr_o (wbd_mbist8_adr_o ),
+ .s8_wbd_sel_o (wbd_mbist8_sel_o ),
+ .s8_wbd_we_o (wbd_mbist8_we_o ),
+ .s8_wbd_cyc_o (wbd_mbist8_cyc_o ),
+ .s8_wbd_stb_o (wbd_mbist8_stb_o )
+ );
+
+
+glbl_cfg #(
+ `ifndef SYNTHESIS
+ .SCW(SCW) // SCAN CHAIN WIDTH
+ `endif
+ ) u_glbl(
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1 ),// User area 1 1.8V supply
+ .vssd1 (vssd1 ),// User area 1 digital ground
+`endif
+ // SCAN I/F
+ .scan_en (scan_en ),
+ .scan_mode (scan_mode ),
+ .scan_si (scan_in ),
+
+ .scan_en_o (scan_en_glbl ),
+ .scan_mode_o (scan_mode_glbl ),
+ .scan_so (scan_out_glbl ),
+
+
+ .wbd_clk_int (wbd_clk_glbl_int ),
+ .cfg_cska_glbl (cfg_cska_glbl ),
+ .wbd_clk_glbl (wbd_clk_glbl ),
+
+ .mclk (wbd_clk_glbl ),
+ .reset_n (wbd_int_rst_n ),
+
+ // Reg Bus Interface Signal
+ .reg_cs (wbd_glbl_stb_o ),
+ .reg_wr (wbd_glbl_we_o ),
+ .reg_addr (wbd_glbl_adr_o ),
+ .reg_wdata (wbd_glbl_dat_o ),
+ .reg_be (wbd_glbl_sel_o ),
+
+ // Outputs
+ .reg_rdata (wbd_glbl_dat_i ),
+ .reg_ack (wbd_glbl_ack_i ),
+
+
+ // BIST I/F Outputs
+ .bist_en (bist_en),
+ .bist_run (bist_run),
+ .bist_load (bist_load),
+
+ .bist_sdi (bist_sdi),
+ .bist_shift (bist_shift),
+
+ // BIST Inputs
+ .bist_sdo (bist_sdo_int),
+ .bist_done (bist_done_int),
+ .bist_error (bist_error_int),
+ .bist_correct (bist_correct_int),
+ .bist_error_cnt0 (bist_error_cnt0_int),
+ .bist_error_cnt1 (bist_error_cnt1_int),
+ .bist_error_cnt2 (bist_error_cnt2_int),
+ .bist_error_cnt3 (bist_error_cnt3_int),
+ .bist_error_cnt4 (bist_error_cnt4_int),
+ .bist_error_cnt5 (bist_error_cnt5_int),
+ .bist_error_cnt6 (bist_error_cnt6_int),
+ .bist_error_cnt7 (bist_error_cnt7_int)
+
+ );
+
+
+//------------- MBIST1 - 512x32 ----
+
+mbist_top1 #(
+ `ifndef SYNTHESIS
+ .SCW (SCW), // SCAN CHAIN WIDTH
+ .BIST_ADDR_WD (BIST1_ADDR_WD-2 ),
+ .BIST_DATA_WD (BIST_DATA_WD ),
+ .BIST_ADDR_START (9'h000 ),
+ .BIST_ADDR_END (9'h1FB ),
+ .BIST_REPAIR_ADDR_START (9'h1FC ),
+ .BIST_RAD_WD_I (BIST1_ADDR_WD-2 ),
+ .BIST_RAD_WD_O (BIST1_ADDR_WD-2 )
+ `endif
+ )
+ u_mbist1 (
+
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1 ),// User area 1 1.8V supply
+ .vssd1 (vssd1 ),// User area 1 digital ground
+`endif
+ // SCAN I/F
+ .scan_en (scan_en_mbist2 ),
+ .scan_mode (scan_mode_mbist2 ),
+ .scan_si (scan_out_mbist2 ),
+
+ .scan_en_o (scan_en_mbist1 ),
+ .scan_mode_o (scan_mode_mbist1 ),
+ .scan_so (scan_out_mbist1 ),
+
+ .cfg_mem_lphase (cfg_mem_lphase ),
+
+ // Clock Skew adjust
+ .wbd_clk_int (wbd_clk_mbist1_int),
+ .cfg_cska_mbist (cfg_cska_mbist1 ),
+ .wbd_clk_mbist (wbd_clk_mbist1 ),
+
+ // WB I/F
+ .wb_clk_i (wbd_clk_mbist1 ),
+ .wb_cyc_i (wbd_mbist1_cyc_o),
+ .wb_stb_i (wbd_mbist1_stb_o),
+ .wb_adr_i (wbd_mbist1_adr_o[BIST1_ADDR_WD-1:2]),
+ .wb_we_i (wbd_mbist1_we_o ),
+ .wb_dat_i (wbd_mbist1_dat_o),
+ .wb_sel_i (wbd_mbist1_sel_o),
+ .wb_dat_o (wbd_mbist1_dat_i),
+ .wb_ack_o (wbd_mbist1_ack_i),
+ .wb_err_o ( ),
+
+ .rst_n (bist_rst_n ),
+
+
+ .bist_en (bist_en_int[0] ),
+ .bist_run (bist_run_int[0] ),
+ .bist_shift (bist_shift_int[0] ),
+ .bist_load (bist_load_int[0] ),
+ .bist_sdi (bist_sdi_int[0] ),
+
+ .bist_error_cnt (bist_error_cnt0 ),
+ .bist_correct (bist_correct[0] ),
+ .bist_error (bist_error[0] ),
+ .bist_done (bist_done[0] ),
+ .bist_sdo (bist_sdo[0] ),
+
+ // towards memory
+ // PORT-A
+ .mem_clk_a (mem1_clk_a ),
+ .mem_addr_a (mem1_addr_a ),
+ .mem_cen_a (mem1_cen_a ),
+ .mem_dout_a (mem1_dout_a ),
+ // PORT-B
+ .mem_clk_b (mem1_clk_b ),
+ .mem_cen_b (mem1_cen_b ),
+ .mem_web_b (mem1_web_b ),
+ .mem_mask_b (mem1_mask_b ),
+ .mem_addr_b (mem1_addr_b ),
+ .mem_din_b (mem1_din_b )
+
+
+);
+
+sky130_sram_2kbyte_1rw1r_32x512_8 u_sram1_2kb(
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1),// User area 1 1.8V supply
+ .vssd1 (vssd1),// User area 1 digital ground
+`endif
+// Port 0: RW
+ .clk0 (mem1_clk_b),
+ .csb0 (mem1_cen_b),
+ .web0 (mem1_web_b),
+ .wmask0 (mem1_mask_b),
+ .addr0 (mem1_addr_b),
+ .din0 (mem1_din_b),
+ .dout0 (),
+// Port 1: R
+ .clk1 (mem1_clk_a),
+ .csb1 (mem1_cen_a),
+ .addr1 (mem1_addr_a),
+ .dout1 (mem1_dout_a)
+ );
+
+//------------- MBIST2 - 512x32 ----
+
+mbist_top1 #(
+ `ifndef SYNTHESIS
+ .SCW (SCW), // SCAN CHAIN WIDTH
+ .BIST_ADDR_WD (BIST1_ADDR_WD-2 ),
+ .BIST_DATA_WD (BIST_DATA_WD ),
+ .BIST_ADDR_START (9'h000 ),
+ .BIST_ADDR_END (9'h1FB ),
+ .BIST_REPAIR_ADDR_START (9'h1FC ),
+ .BIST_RAD_WD_I (BIST1_ADDR_WD-2 ),
+ .BIST_RAD_WD_O (BIST1_ADDR_WD-2 )
+ `endif
+ )
+ u_mbist2 (
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1 ),// User area 1 1.8V supply
+ .vssd1 (vssd1 ),// User area 1 digital ground
+`endif
+ // SCAN I/F
+ .scan_en (scan_en_mbist3 ),
+ .scan_mode (scan_mode_mbist3 ),
+ .scan_si (scan_out_mbist3 ),
+
+ .scan_en_o (scan_en_mbist2 ),
+ .scan_mode_o (scan_mode_mbist2 ),
+ .scan_so (scan_out_mbist2 ),
+
+ .cfg_mem_lphase (cfg_mem_lphase ),
+
+ // Clock Skew adjust
+ .wbd_clk_int (wbd_clk_mbist2_int),
+ .cfg_cska_mbist (cfg_cska_mbist2 ),
+ .wbd_clk_mbist (wbd_clk_mbist2 ),
+
+ // WB I/F
+ .wb_clk_i (wbd_clk_mbist2 ),
+ .wb_cyc_i (wbd_mbist2_cyc_o),
+ .wb_stb_i (wbd_mbist2_stb_o),
+ .wb_adr_i (wbd_mbist2_adr_o[BIST1_ADDR_WD-1:2]),
+ .wb_we_i (wbd_mbist2_we_o ),
+ .wb_dat_i (wbd_mbist2_dat_o),
+ .wb_sel_i (wbd_mbist2_sel_o),
+ .wb_dat_o (wbd_mbist2_dat_i),
+ .wb_ack_o (wbd_mbist2_ack_i),
+ .wb_err_o ( ),
+
+ .rst_n (bist_rst_n ),
+
+
+ .bist_en (bist_en_int[1] ),
+ .bist_run (bist_run_int[1] ),
+ .bist_shift (bist_shift_int[1] ),
+ .bist_load (bist_load_int[1] ),
+ .bist_sdi (bist_sdi_int[1] ),
+
+ .bist_error_cnt (bist_error_cnt1 ),
+ .bist_correct (bist_correct[1] ),
+ .bist_error (bist_error[1] ),
+ .bist_done (bist_done[1] ),
+ .bist_sdo (bist_sdo[1] ),
+
+ // towards memory
+ // PORT-A
+ .mem_clk_a (mem2_clk_a ),
+ .mem_addr_a (mem2_addr_a ),
+ .mem_cen_a (mem2_cen_a ),
+ .mem_dout_a (mem2_dout_a ),
+ // PORT-B
+ .mem_clk_b (mem2_clk_b ),
+ .mem_cen_b (mem2_cen_b ),
+ .mem_web_b (mem2_web_b ),
+ .mem_mask_b (mem2_mask_b ),
+ .mem_addr_b (mem2_addr_b ),
+ .mem_din_b (mem2_din_b )
+
+
+);
+
+sky130_sram_2kbyte_1rw1r_32x512_8 u_sram2_2kb(
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1),// User area 1 1.8V supply
+ .vssd1 (vssd1),// User area 1 digital ground
+`endif
+// Port 0: RW
+ .clk0 (mem2_clk_b),
+ .csb0 (mem2_cen_b),
+ .web0 (mem2_web_b),
+ .wmask0 (mem2_mask_b),
+ .addr0 (mem2_addr_b),
+ .din0 (mem2_din_b),
+ .dout0 (),
+// Port 1: R
+ .clk1 (mem2_clk_a),
+ .csb1 (mem2_cen_a),
+ .addr1 (mem2_addr_a),
+ .dout1 (mem2_dout_a)
+ );
+
+//------------- MBIST3 - 512x32 ----
+
+mbist_top1 #(
+ `ifndef SYNTHESIS
+ .SCW (SCW), // SCAN CHAIN WIDTH
+ .BIST_ADDR_WD (BIST1_ADDR_WD-2 ),
+ .BIST_DATA_WD (BIST_DATA_WD ),
+ .BIST_ADDR_START (9'h000 ),
+ .BIST_ADDR_END (9'h1FB ),
+ .BIST_REPAIR_ADDR_START (9'h1FC ),
+ .BIST_RAD_WD_I (BIST1_ADDR_WD-2 ),
+ .BIST_RAD_WD_O (BIST1_ADDR_WD-2 )
+ `endif
+ )
+ u_mbist3 (
+
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1 ),// User area 1 1.8V supply
+ .vssd1 (vssd1 ),// User area 1 digital ground
+`endif
+ // SCAN I/F
+ .scan_en (scan_en_mbist4 ),
+ .scan_mode (scan_mode_mbist4 ),
+ .scan_si (scan_out_mbist4 ),
+
+ .scan_en_o (scan_en_mbist3 ),
+ .scan_mode_o (scan_mode_mbist3 ),
+ .scan_so (scan_out_mbist3 ),
+
+ .cfg_mem_lphase (cfg_mem_lphase ),
+
+ // Clock Skew adjust
+ .wbd_clk_int (wbd_clk_mbist3_int ),
+ .cfg_cska_mbist (cfg_cska_mbist3 ),
+ .wbd_clk_mbist (wbd_clk_mbist3 ),
+
+ // WB I/F
+ .wb_clk_i (wbd_clk_mbist3 ),
+ .wb_cyc_i (wbd_mbist3_cyc_o),
+ .wb_stb_i (wbd_mbist3_stb_o),
+ .wb_adr_i (wbd_mbist3_adr_o[BIST1_ADDR_WD-1:2]),
+ .wb_we_i (wbd_mbist3_we_o ),
+ .wb_dat_i (wbd_mbist3_dat_o),
+ .wb_sel_i (wbd_mbist3_sel_o),
+ .wb_dat_o (wbd_mbist3_dat_i),
+ .wb_ack_o (wbd_mbist3_ack_i),
+ .wb_err_o ( ),
+
+ .rst_n (bist_rst_n ),
+
+
+ .bist_en (bist_en_int[2] ),
+ .bist_run (bist_run_int[2] ),
+ .bist_shift (bist_shift_int[2]),
+ .bist_load (bist_load_int[2] ),
+ .bist_sdi (bist_sdi_int[2] ),
+
+ .bist_error_cnt (bist_error_cnt2 ),
+ .bist_correct (bist_correct[2] ),
+ .bist_error (bist_error[2] ),
+ .bist_done (bist_done[2] ),
+ .bist_sdo (bist_sdo[2] ),
+
+ // towards memory
+ // PORT-A
+ .mem_clk_a (mem3_clk_a ),
+ .mem_addr_a (mem3_addr_a ),
+ .mem_cen_a (mem3_cen_a ),
+ .mem_dout_a (mem3_dout_a ),
+ // PORT-B
+ .mem_clk_b (mem3_clk_b ),
+ .mem_cen_b (mem3_cen_b ),
+ .mem_web_b (mem3_web_b ),
+ .mem_mask_b (mem3_mask_b ),
+ .mem_addr_b (mem3_addr_b ),
+ .mem_din_b (mem3_din_b )
+
+
+);
+
+sky130_sram_2kbyte_1rw1r_32x512_8 u_sram3_2kb(
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1),// User area 1 1.8V supply
+ .vssd1 (vssd1),// User area 1 digital ground
+`endif
+// Port 0: RW
+ .clk0 (mem3_clk_b),
+ .csb0 (mem3_cen_b),
+ .web0 (mem3_web_b),
+ .wmask0 (mem3_mask_b),
+ .addr0 (mem3_addr_b),
+ .din0 (mem3_din_b),
+ .dout0 (),
+// Port 1: R
+ .clk1 (mem3_clk_a),
+ .csb1 (mem3_cen_a),
+ .addr1 (mem3_addr_a),
+ .dout1 (mem3_dout_a)
+ );
+
+//------------- MBIST4 - 512x32 ----
+
+mbist_top1 #(
+ `ifndef SYNTHESIS
+ .SCW (SCW), // SCAN CHAIN WIDTH
+ .BIST_ADDR_WD (BIST1_ADDR_WD-2 ),
+ .BIST_DATA_WD (BIST_DATA_WD ),
+ .BIST_ADDR_START (9'h000 ),
+ .BIST_ADDR_END (9'h1FB ),
+ .BIST_REPAIR_ADDR_START (9'h1FC ),
+ .BIST_RAD_WD_I (BIST1_ADDR_WD-2 ),
+ .BIST_RAD_WD_O (BIST1_ADDR_WD-2 )
+ `endif
+ )
+ u_mbist4 (
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1 ),// User area 1 1.8V supply
+ .vssd1 (vssd1 ),// User area 1 digital ground
+`endif
+ // SCAN I/F
+ .scan_en (scan_en_wbi ),
+ .scan_mode (scan_mode_wbi ),
+ .scan_si (scan_out_wbi ),
+
+ .scan_en_o (scan_en_mbist4 ),
+ .scan_mode_o (scan_mode_mbist4 ),
+ .scan_so (scan_out_mbist4 ),
+
+ .cfg_mem_lphase (cfg_mem_lphase ),
+
+ // Clock Skew adjust
+ .wbd_clk_int (wbd_clk_mbist4_int ),
+ .cfg_cska_mbist (cfg_cska_mbist4 ),
+ .wbd_clk_mbist (wbd_clk_mbist4 ),
+
+ // WB I/F
+ .wb_clk_i (wbd_clk_mbist4 ),
+ .wb_cyc_i (wbd_mbist4_cyc_o),
+ .wb_stb_i (wbd_mbist4_stb_o),
+ .wb_adr_i (wbd_mbist4_adr_o[BIST1_ADDR_WD-1:2]),
+ .wb_we_i (wbd_mbist4_we_o ),
+ .wb_dat_i (wbd_mbist4_dat_o),
+ .wb_sel_i (wbd_mbist4_sel_o),
+ .wb_dat_o (wbd_mbist4_dat_i),
+ .wb_ack_o (wbd_mbist4_ack_i),
+ .wb_err_o ( ),
+
+ .rst_n (bist_rst_n ),
+
+
+ .bist_en (bist_en_int[3] ),
+ .bist_run (bist_run_int[3] ),
+ .bist_shift (bist_shift_int[3] ),
+ .bist_load (bist_load_int[3] ),
+ .bist_sdi (bist_sdi_int[3] ),
+
+ .bist_error_cnt (bist_error_cnt3 ),
+ .bist_correct (bist_correct[3] ),
+ .bist_error (bist_error[3] ),
+ .bist_done (bist_done[3] ),
+ .bist_sdo (bist_sdo[3] ),
+
+ // towards memory
+ // PORT-A
+ .mem_clk_a (mem4_clk_a ),
+ .mem_addr_a (mem4_addr_a ),
+ .mem_cen_a (mem4_cen_a ),
+ .mem_dout_a (mem4_dout_a ),
+ // PORT-B
+ .mem_clk_b (mem4_clk_b ),
+ .mem_cen_b (mem4_cen_b ),
+ .mem_web_b (mem4_web_b ),
+ .mem_mask_b (mem4_mask_b ),
+ .mem_addr_b (mem4_addr_b ),
+ .mem_din_b (mem4_din_b )
+
+
+);
+
+sky130_sram_2kbyte_1rw1r_32x512_8 u_sram4_2kb(
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1),// User area 1 1.8V supply
+ .vssd1 (vssd1),// User area 1 digital ground
+`endif
+// Port 0: RW
+ .clk0 (mem4_clk_b),
+ .csb0 (mem4_cen_b),
+ .web0 (mem4_web_b),
+ .wmask0 (mem4_mask_b),
+ .addr0 (mem4_addr_b),
+ .din0 (mem4_din_b),
+ .dout0 (),
+// Port 1: R
+ .clk1 (mem4_clk_a),
+ .csb1 (mem4_cen_a),
+ .addr1 (mem4_addr_a),
+ .dout1 (mem4_dout_a)
+ );
+
+//------------- MBIST5 - 256x32 ----
+
+mbist_top2 #(
+ `ifndef SYNTHESIS
+ .SCW (SCW), // SCAN CHAIN WIDTH
+ .BIST_ADDR_WD (BIST2_ADDR_WD-2 ),
+ .BIST_DATA_WD (BIST_DATA_WD ),
+ .BIST_ADDR_START (8'h00 ),
+ .BIST_ADDR_END (8'hFB ),
+ .BIST_REPAIR_ADDR_START (8'hFC ),
+ .BIST_RAD_WD_I (BIST2_ADDR_WD-2 ),
+ .BIST_RAD_WD_O (BIST2_ADDR_WD-2 )
+ `endif
+ )
+ u_mbist5 (
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1 ),// User area 1 1.8V supply
+ .vssd1 (vssd1 ),// User area 1 digital ground
+`endif
+ // SCAN I/F
+ .scan_en (scan_en_glbl ),
+ .scan_mode (scan_mode_glbl ),
+ .scan_si (scan_out_glbl ),
+
+ .scan_en_o (scan_en_mbist5 ),
+ .scan_mode_o (scan_mode_mbist5 ),
+ .scan_so (scan_out_mbist5 ),
+
+ .cfg_mem_lphase (cfg_mem_lphase ),
+
+ // Clock Skew adjust
+ .wbd_clk_int (wbd_clk_mbist5_int ),
+ .cfg_cska_mbist (cfg_cska_mbist5 ),
+ .wbd_clk_mbist (wbd_clk_mbist5 ),
+
+ // WB I/F
+ .wb_clk_i (wbd_clk_mbist5 ),
+ .wb_cyc_i (wbd_mbist5_cyc_o),
+ .wb_stb_i (wbd_mbist5_stb_o),
+ .wb_adr_i (wbd_mbist5_adr_o[BIST2_ADDR_WD-1:2]),
+ .wb_we_i (wbd_mbist5_we_o ),
+ .wb_dat_i (wbd_mbist5_dat_o),
+ .wb_sel_i (wbd_mbist5_sel_o),
+ .wb_dat_o (wbd_mbist5_dat_i),
+ .wb_ack_o (wbd_mbist5_ack_i),
+ .wb_err_o ( ),
+
+ .rst_n (bist_rst_n ),
+
+
+ .bist_en (bist_en_int[4] ),
+ .bist_run (bist_run_int[4] ),
+ .bist_shift (bist_shift_int[4]),
+ .bist_load (bist_load_int[4] ),
+ .bist_sdi (bist_sdi_int[4] ),
+
+ .bist_error_cnt (bist_error_cnt4 ),
+ .bist_correct (bist_correct[4] ),
+ .bist_error (bist_error[4] ),
+ .bist_done (bist_done[4] ),
+ .bist_sdo (bist_sdo[4] ),
+
+
+ // towards memory
+ // PORT-A
+ .mem_clk_a (mem5_clk_a ),
+ .mem_addr_a (mem5_addr_a ),
+ .mem_cen_a (mem5_cen_a ),
+ .mem_dout_a (mem5_dout_a ),
+ // PORT-B
+ .mem_clk_b (mem5_clk_b ),
+ .mem_cen_b (mem5_cen_b ),
+ .mem_web_b (mem5_web_b ),
+ .mem_mask_b (mem5_mask_b ),
+ .mem_addr_b (mem5_addr_b ),
+ .mem_din_b (mem5_din_b )
+
+
+);
+
+sky130_sram_1kbyte_1rw1r_32x256_8 u_sram5_1kb(
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1),// User area 1 1.8V supply
+ .vssd1 (vssd1),// User area 1 digital ground
+`endif
+// Port 0: RW
+ .clk0 (mem5_clk_b),
+ .csb0 (mem5_cen_b),
+ .web0 (mem5_web_b),
+ .wmask0 (mem5_mask_b),
+ .addr0 (mem5_addr_b),
+ .din0 (mem5_din_b),
+ .dout0 (),
+// Port 1: R
+ .clk1 (mem5_clk_a),
+ .csb1 (mem5_cen_a),
+ .addr1 (mem5_addr_a),
+ .dout1 (mem5_dout_a)
+ );
+
+//------------- MBIST6 - 256x32 ----
+
+mbist_top2 #(
+ `ifndef SYNTHESIS
+ .SCW (SCW), // SCAN CHAIN WIDTH
+ .BIST_ADDR_WD (BIST2_ADDR_WD-2 ),
+ .BIST_DATA_WD (BIST_DATA_WD ),
+ .BIST_ADDR_START (8'h00 ),
+ .BIST_ADDR_END (8'hFB ),
+ .BIST_REPAIR_ADDR_START (8'hFC ),
+ .BIST_RAD_WD_I (BIST2_ADDR_WD-2 ),
+ .BIST_RAD_WD_O (BIST2_ADDR_WD-2 )
+ `endif
+ )
+ u_mbist6 (
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1 ),// User area 1 1.8V supply
+ .vssd1 (vssd1 ),// User area 1 digital ground
+`endif
+ // SCAN I/F
+ .scan_en (scan_en_mbist5 ),
+ .scan_mode (scan_mode_mbist5 ),
+ .scan_si (scan_out_mbist5 ),
+
+ .scan_en_o (scan_en_mbist6 ),
+ .scan_mode_o (scan_mode_mbist6 ),
+ .scan_so (scan_out_mbist6 ),
+
+ .cfg_mem_lphase (cfg_mem_lphase ),
+
+ // Clock Skew adjust
+ .wbd_clk_int (wbd_clk_mbist6_int ),
+ .cfg_cska_mbist (cfg_cska_mbist6 ),
+ .wbd_clk_mbist (wbd_clk_mbist6 ),
+
+ // WB I/F
+ .wb_clk_i (wbd_clk_mbist6 ),
+ .wb_cyc_i (wbd_mbist6_cyc_o),
+ .wb_stb_i (wbd_mbist6_stb_o),
+ .wb_adr_i (wbd_mbist6_adr_o[BIST2_ADDR_WD-1:2]),
+ .wb_we_i (wbd_mbist6_we_o ),
+ .wb_dat_i (wbd_mbist6_dat_o),
+ .wb_sel_i (wbd_mbist6_sel_o),
+ .wb_dat_o (wbd_mbist6_dat_i),
+ .wb_ack_o (wbd_mbist6_ack_i),
+ .wb_err_o ( ),
+
+ .rst_n (bist_rst_n ),
+
+
+ .bist_en (bist_en_int[5] ),
+ .bist_run (bist_run_int[5] ),
+ .bist_shift (bist_shift_int[5]),
+ .bist_load (bist_load_int[5] ),
+ .bist_sdi (bist_sdi_int[5] ),
+
+ .bist_error_cnt (bist_error_cnt5 ),
+ .bist_correct (bist_correct[5] ),
+ .bist_error (bist_error[5] ),
+ .bist_done (bist_done[5] ),
+ .bist_sdo (bist_sdo[5] ),
+
+ // towards memory
+ // PORT-A
+ .mem_clk_a (mem6_clk_a ),
+ .mem_addr_a (mem6_addr_a ),
+ .mem_cen_a (mem6_cen_a ),
+ .mem_dout_a (mem6_dout_a ),
+ // PORT-B
+ .mem_clk_b (mem6_clk_b ),
+ .mem_cen_b (mem6_cen_b ),
+ .mem_web_b (mem6_web_b ),
+ .mem_mask_b (mem6_mask_b ),
+ .mem_addr_b (mem6_addr_b ),
+ .mem_din_b (mem6_din_b )
+
+
+);
+
+sky130_sram_1kbyte_1rw1r_32x256_8 u_sram6_1kb(
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1),// User area 1 1.8V supply
+ .vssd1 (vssd1),// User area 1 digital ground
+`endif
+// Port 0: RW
+ .clk0 (mem6_clk_b),
+ .csb0 (mem6_cen_b),
+ .web0 (mem6_web_b),
+ .wmask0 (mem6_mask_b),
+ .addr0 (mem6_addr_b),
+ .din0 (mem6_din_b),
+ .dout0 (),
+// Port 1: R
+ .clk1 (mem6_clk_a),
+ .csb1 (mem6_cen_a),
+ .addr1 (mem6_addr_a),
+ .dout1 (mem6_dout_a)
+ );
+//------------- MBIST7 - 256x32 ----
+
+mbist_top2 #(
+ `ifndef SYNTHESIS
+ .SCW (SCW), // SCAN CHAIN WIDTH
+ .BIST_ADDR_WD (BIST2_ADDR_WD-2 ),
+ .BIST_DATA_WD (BIST_DATA_WD ),
+ .BIST_ADDR_START (8'h00 ),
+ .BIST_ADDR_END (8'hFB ),
+ .BIST_REPAIR_ADDR_START (8'hFC ),
+ .BIST_RAD_WD_I (BIST2_ADDR_WD-2 ),
+ .BIST_RAD_WD_O (BIST2_ADDR_WD-2 )
+ `endif
+ )
+ u_mbist7 (
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1 ),// User area 1 1.8V supply
+ .vssd1 (vssd1 ),// User area 1 digital ground
+`endif
+ // SCAN I/F
+ .scan_en (scan_en_mbist6 ),
+ .scan_mode (scan_mode_mbist6 ),
+ .scan_si (scan_out_mbist6 ),
+
+ .scan_en_o (scan_en_mbist7 ),
+ .scan_mode_o (scan_mode_mbist7 ),
+ .scan_so (scan_out_mbist7 ),
+
+ .cfg_mem_lphase (cfg_mem_lphase ),
+ // Clock Skew adjust
+ .wbd_clk_int (wbd_clk_mbist7_int ),
+ .cfg_cska_mbist (cfg_cska_mbist7 ),
+ .wbd_clk_mbist (wbd_clk_mbist7 ),
+
+ // WB I/F
+ .wb_clk_i (wbd_clk_mbist7 ),
+ .wb_cyc_i (wbd_mbist7_cyc_o),
+ .wb_stb_i (wbd_mbist7_stb_o),
+ .wb_adr_i (wbd_mbist7_adr_o[BIST2_ADDR_WD-1:2]),
+ .wb_we_i (wbd_mbist7_we_o ),
+ .wb_dat_i (wbd_mbist7_dat_o),
+ .wb_sel_i (wbd_mbist7_sel_o),
+ .wb_dat_o (wbd_mbist7_dat_i),
+ .wb_ack_o (wbd_mbist7_ack_i),
+ .wb_err_o ( ),
+
+ .rst_n (bist_rst_n ),
+
+
+ .bist_en (bist_en_int[6] ),
+ .bist_run (bist_run_int[6] ),
+ .bist_shift (bist_shift_int[6]),
+ .bist_load (bist_load_int[6] ),
+ .bist_sdi (bist_sdi_int[6] ),
+
+ .bist_error_cnt (bist_error_cnt6 ),
+ .bist_correct (bist_correct[6] ),
+ .bist_error (bist_error[6] ),
+ .bist_done (bist_done[6] ),
+ .bist_sdo (bist_sdo[6] ),
+
+
+ // towards memory
+ // PORT-A
+ .mem_clk_a (mem7_clk_a ),
+ .mem_addr_a (mem7_addr_a ),
+ .mem_cen_a (mem7_cen_a ),
+ .mem_dout_a (mem7_dout_a ),
+ // PORT-B
+ .mem_clk_b (mem7_clk_b ),
+ .mem_cen_b (mem7_cen_b ),
+ .mem_web_b (mem7_web_b ),
+ .mem_mask_b (mem7_mask_b ),
+ .mem_addr_b (mem7_addr_b ),
+ .mem_din_b (mem7_din_b )
+
+
+);
+
+sky130_sram_1kbyte_1rw1r_32x256_8 u_sram7_1kb(
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1),// User area 1 1.8V supply
+ .vssd1 (vssd1),// User area 1 digital ground
+`endif
+// Port 0: RW
+ .clk0 (mem7_clk_b),
+ .csb0 (mem7_cen_b),
+ .web0 (mem7_web_b),
+ .wmask0 (mem7_mask_b),
+ .addr0 (mem7_addr_b),
+ .din0 (mem7_din_b),
+ .dout0 (),
+// Port 1: R
+ .clk1 (mem7_clk_a),
+ .csb1 (mem7_cen_a),
+ .addr1 (mem7_addr_a),
+ .dout1 (mem7_dout_a)
+ );
+
+//------------- MBIST6 - 256x32 ----
+
+mbist_top2 #(
+ `ifndef SYNTHESIS
+ .SCW (SCW), // SCAN CHAIN WIDTH
+ .BIST_ADDR_WD (BIST2_ADDR_WD-2 ),
+ .BIST_DATA_WD (BIST_DATA_WD ),
+ .BIST_ADDR_START (8'h00 ),
+ .BIST_ADDR_END (8'hFB ),
+ .BIST_REPAIR_ADDR_START (8'hFC ),
+ .BIST_RAD_WD_I (BIST2_ADDR_WD-2 ),
+ .BIST_RAD_WD_O (BIST2_ADDR_WD-2 )
+ `endif
+ )
+ u_mbist8 (
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1 ),// User area 1 1.8V supply
+ .vssd1 (vssd1 ),// User area 1 digital ground
+`endif
+ // SCAN I/F
+ .scan_en (scan_en_mbist7 ),
+ .scan_mode (scan_mode_mbist7 ),
+ .scan_si (scan_out_mbist7 ),
+
+ .scan_en_o (scan_en_mbist8 ),
+ .scan_mode_o (scan_mode_mbist8 ),
+ .scan_so (scan_out_mbist8 ),
+
+ .cfg_mem_lphase (cfg_mem_lphase ),
+
+ // Clock Skew adjust
+ .wbd_clk_int (wbd_clk_mbist8_int),
+ .cfg_cska_mbist (cfg_cska_mbist8 ),
+ .wbd_clk_mbist (wbd_clk_mbist8 ),
+
+ // WB I/F
+ .wb_clk_i (wbd_clk_mbist8 ),
+ .wb_cyc_i (wbd_mbist8_cyc_o),
+ .wb_stb_i (wbd_mbist8_stb_o),
+ .wb_adr_i (wbd_mbist8_adr_o[BIST2_ADDR_WD-1:2]),
+ .wb_we_i (wbd_mbist8_we_o ),
+ .wb_dat_i (wbd_mbist8_dat_o),
+ .wb_sel_i (wbd_mbist8_sel_o),
+ .wb_dat_o (wbd_mbist8_dat_i),
+ .wb_ack_o (wbd_mbist8_ack_i),
+ .wb_err_o ( ),
+
+ .rst_n (bist_rst_n ),
+
+
+ .bist_en (bist_en_int[7] ),
+ .bist_run (bist_run_int[7] ),
+ .bist_shift (bist_shift_int[7]),
+ .bist_load (bist_load_int[7] ),
+ .bist_sdi (bist_sdi_int[7] ),
+
+ .bist_error_cnt (bist_error_cnt7 ),
+ .bist_correct (bist_correct[7] ),
+ .bist_error (bist_error[7] ),
+ .bist_done (bist_done[7] ),
+ .bist_sdo (bist_sdo[7] ),
+
+ // towards memory
+ // PORT-A
+ .mem_clk_a (mem8_clk_a ),
+ .mem_addr_a (mem8_addr_a ),
+ .mem_cen_a (mem8_cen_a ),
+ .mem_dout_a (mem8_dout_a ),
+ // PORT-B
+ .mem_clk_b (mem8_clk_b ),
+ .mem_cen_b (mem8_cen_b ),
+ .mem_web_b (mem8_web_b ),
+ .mem_mask_b (mem8_mask_b ),
+ .mem_addr_b (mem8_addr_b ),
+ .mem_din_b (mem8_din_b )
+
+
+);
+
+sky130_sram_1kbyte_1rw1r_32x256_8 u_sram8_1kb(
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1),// User area 1 1.8V supply
+ .vssd1 (vssd1),// User area 1 digital ground
+`endif
+// Port 0: RW
+ .clk0 (mem8_clk_b),
+ .csb0 (mem8_cen_b),
+ .web0 (mem8_web_b),
+ .wmask0 (mem8_mask_b),
+ .addr0 (mem8_addr_b),
+ .din0 (mem8_din_b),
+ .dout0 (),
+// Port 1: R
+ .clk1 (mem8_clk_a),
+ .csb1 (mem8_cen_a),
+ .addr1 (mem8_addr_a),
+ .dout1 (mem8_dout_a)
+ );
+
+endmodule // user_project_wrapper
+
+`default_nettype wire
diff --git a/verilog/rtl/user_reg_map.v b/verilog/rtl/user_reg_map.v
new file mode 100644
index 0000000..0868a11
--- /dev/null
+++ b/verilog/rtl/user_reg_map.v
@@ -0,0 +1,47 @@
+
+// Note in caravel, 0x300X_XXXX only come to user interface
+// So, using wb_host bank select we have changing MSB address [31:16] = 0x1000
+//
+`define ADDR_SPACE_WBHOST 32'h3008_0000
+`define ADDR_SPACE_LBIST 32'h300C_0000
+`define ADDR_SPACE_GLBL 32'h3000_0000
+`define ADDR_SPACE_MBIST1 32'h3000_1000
+`define ADDR_SPACE_MBIST2 32'h3000_2000
+`define ADDR_SPACE_MBIST3 32'h3000_3000
+`define ADDR_SPACE_MBIST4 32'h3000_4000
+`define ADDR_SPACE_MBIST5 32'h3000_5000
+`define ADDR_SPACE_MBIST6 32'h3000_6000
+`define ADDR_SPACE_MBIST7 32'h3000_7000
+`define ADDR_SPACE_MBIST8 32'h3000_8000
+
+//--------------------------------------------------
+// WB Host Register
+//--------------------------------------------------
+`define WBHOST_GLBL_CFG 8'h00 // reg_0 - Global Config
+`define WBHOST_BANK_SEL 8'h04 // reg_1 - Bank Select
+`define WBHOST_CLK_CTRL1 8'h08 // reg_2 - Clock Control-1
+`define WBHOST_CLK_CTRL2 8'h0C // reg_3 - Clock Control-2
+
+//--------------------------------------------------
+// LBIST Register
+//--------------------------------------------------
+`define LBIST_CTRL1 8'h00
+`define LBIST_CTRL2 8'h04
+`define LBIST_SIG 8'h08
+
+//-------------------------------------------------
+// GLBL Register
+//-------------------------------------------------
+
+`define GLBL_BIST_CTRL1 'h08
+`define GLBL_BIST_CTRL2 'h0C
+`define GLBL_BIST_STAT1 'h10
+`define GLBL_BIST_STAT2 'h14
+`define GLBL_BIST_SWDATA 'h18
+`define GLBL_BIST_SRDATA 'h1C
+`define GLBL_BIST_SPDATA 'h20
+`define GLBL_BIST_SOFT1 'h24
+`define GLBL_BIST_SOFT2 'h28
+`define GLBL_BIST_SOFT3 'h2C
+
+
diff --git a/verilog/rtl/wb_host/src/run_iverilog b/verilog/rtl/wb_host/src/run_iverilog
new file mode 100755
index 0000000..f3b96e3
--- /dev/null
+++ b/verilog/rtl/wb_host/src/run_iverilog
@@ -0,0 +1,10 @@
+iverilog -g2005-sv \
+wb_host.sv \
+../../lib/async_wb.sv \
+../../lib/async_fifo.sv \
+../../lib/clk_ctl.v \
+../../lib/ctech_cells.sv \
+../../lib/registers.v \
+../../clk_skew_adjust/src/clk_skew_adjust.gv \
+$PDK_ROOT/sky130A/libs.ref/sky130_fd_sc_hd/verilog/sky130_fd_sc_hd.v \
+$PDK_ROOT/sky130A/libs.ref/sky130_fd_sc_hd/verilog/primitives.v
diff --git a/verilog/rtl/wb_host/src/run_verilator b/verilog/rtl/wb_host/src/run_verilator
new file mode 100755
index 0000000..89514ed
--- /dev/null
+++ b/verilog/rtl/wb_host/src/run_verilator
@@ -0,0 +1,12 @@
+verilator -cc \
+wb_host.sv \
+../../lib/async_wb.sv \
+../../lib/async_fifo.sv \
+../../lib/clk_ctl.v \
+../../lib/ctech_cells.sv \
+../../lib/registers.v \
+../../clk_skew_adjust/src/clk_skew_adjust.gv \
+$PDK_ROOT/sky130A/libs.ref/sky130_fd_sc_hd/verilog/sky130_fd_sc_hd.v \
+$PDK_ROOT/sky130A/libs.ref/sky130_fd_sc_hd/verilog/primitives.v \
+--timescale 1ns/100ps --bbox-unsup \
+--top-module wb_host
diff --git a/verilog/rtl/wb_host/src/wb_host.sv b/verilog/rtl/wb_host/src/wb_host.sv
new file mode 100644
index 0000000..b9a8749
--- /dev/null
+++ b/verilog/rtl/wb_host/src/wb_host.sv
@@ -0,0 +1,649 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Wishbone host Interface ////
+//// ////
+//// This file is part of the mbist_ctrl project ////
+//// https://github.com/dineshannayya/mbist_ctrl.git ////
+//// ////
+//// Description ////
+//// This block does async Wishbone from one clock to other ////
+//// clock domain ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.1 - 25th Feb 2021, Dinesh A ////
+//// initial version ////
+//// 0.2 - 14th Nov 2021, Dinesh A ////
+//// reset_n connectivity fix for bist and memclock ////
+//// 0.1 - Nov 16 2021, Dinesh A ////
+//// Wishbone out are register for better timing ////
+//// 0.2 - Mar 15 2021, Dinesh A ////
+//// 1. To fix the bug in caravel mgmt soc address range ////
+//// reduction to 0x3000_0000 to 0x300F_FFFF ////
+//// Address Map has changes as follows ////
+//// 0x3008_0000 to 0x3008_00FF - Local Wishbone Reg ////
+//// 0x3000_0000 to 0x3007_FFFF - SOC access with ////
+//// indirect Map {Bank_Sel[15:3], wbm_adr_i[18:0]} ////
+//// 2.wbm_cyc_i need to qualified with wbm_stb_i ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+module wb_host
+ #(parameter SCW = 8 // SCAN CHAIN WIDTH
+ ) (
+
+`ifdef USE_POWER_PINS
+ inout vccd1, // User area 1 1.8V supply
+ inout vssd1, // User area 1 digital ground
+`endif
+ input logic user_clock1 ,
+ input logic user_clock2 ,
+ output logic [2:0] user_irq ,
+
+ output logic wbd_int_rst_n ,
+ output logic bist_rst_n ,
+
+ // Master Port
+ input logic wbm_rst_i , // Regular Reset signal
+ input logic wbm_clk_i , // System clock
+ input logic wbm_cyc_i , // strobe/request
+ input logic wbm_stb_i , // strobe/request
+ input logic [31:0] wbm_adr_i , // address
+ input logic wbm_we_i , // write
+ input logic [31:0] wbm_dat_i , // data output
+ input logic [3:0] wbm_sel_i , // byte enable
+ output logic [31:0] wbm_dat_o , // data input
+ output logic wbm_ack_o , // acknowlegement
+ output logic wbm_err_o , // error
+
+ // Clock Skew Adjust
+ input logic wbd_clk_int ,
+ output logic wbd_clk_wh ,
+ input logic [3:0] cfg_cska_wh , // clock skew adjust for web host
+
+ // lbist Clock Skew Adjust
+ input logic lbist_clk_int ,
+ output logic lbist_clk_out ,
+ input logic [3:0] cfg_cska_lbist , // clock skew adjust for web host
+
+ // Slave Port
+ output logic wbs_clk_out , // System clock
+ input logic wbs_clk_i , // System clock
+ output logic wbs_cyc_o , // strobe/request
+ output logic wbs_stb_o , // strobe/request
+ output logic [31:0] wbs_adr_o , // address
+ output logic wbs_we_o , // write
+ output logic [31:0] wbs_dat_o , // data output
+ output logic [3:0] wbs_sel_o , // byte enable
+ input logic [31:0] wbs_dat_i , // data input
+ input logic wbs_ack_i , // acknowlegement
+ input logic wbs_err_i , // error
+
+ output logic [31:0] cfg_clk_ctrl1 ,
+ output logic [31:0] cfg_clk_ctrl2 ,
+ // MBIST I/F
+
+
+ input logic io_in,
+ output logic [37:0] io_out,
+ output logic [37:0] io_oeb,
+ input logic [35:0] la_data_in,
+ output logic [127:0] la_data_out,
+
+ // Scan Control Signal
+ output logic scan_clk,
+ output logic scan_rst_n,
+ output logic scan_mode,
+ output logic scan_en,
+ output logic [SCW-1:0] scan_in,
+ input logic [SCW-1:0] scan_out
+
+ );
+
+
+//--------------------------------
+// local dec
+//
+//--------------------------------
+logic wbm_rst_n;
+logic wbs_rst_n;
+logic [31:0] wbm_dat_int; // data input
+logic wbm_ack_int; // acknowlegement
+logic wbm_err_int; // error
+
+logic wb_reg_sel ; // Local Register Select
+logic [31:0] wb_reg_rdata ;
+logic [31:0] wb_reg_out ;
+logic wb_reg_ack ;
+
+logic lbist_reg_sel ; // LBIST Register Select
+logic [31:0] lbist_reg_rdata ;
+logic lbist_reg_ack ;
+logic lbist_reg_err ;
+
+logic [1:0] sw_addr ;
+logic sw_rd_en ;
+logic sw_wr_en ;
+logic sw_wr_en_0;
+logic sw_wr_en_1;
+logic sw_wr_en_2;
+logic sw_wr_en_3;
+logic sw_wr_en_4;
+logic sw_rd_en_5;
+logic [15:0] cfg_bank_sel;
+logic [31:0] wbm_adr_int;
+logic wbm_stb_int;
+logic [31:0] reg_0; // Software_Reg_0
+logic [31:0] reg_1; // Software_Reg_0
+
+logic [3:0] cfg_wb_clk_ctrl;
+logic [3:0] cfg_lbist_clk_ctrl;
+logic [7:0] cfg_glb_ctrl;
+logic cfg_la_lbist;
+
+// uart Master Port
+logic wbm_uart_cyc_i ; // strobe/request
+logic wbm_uart_stb_i ; // strobe/request
+logic [31:0] wbm_uart_adr_i ; // address
+logic wbm_uart_we_i ; // write
+logic [31:0] wbm_uart_dat_i ; // data output
+logic [3:0] wbm_uart_sel_i ; // byte enable
+logic [31:0] wbm_uart_dat_o ; // data input
+logic wbm_uart_ack_o ; // acknowlegement
+logic wbm_uart_err_o ; // error
+
+// Selected Master Port
+logic wb_cyc_i ; // strobe/request
+logic wb_stb_i ; // strobe/request
+logic [31:0] wb_adr_i ; // address
+logic wb_we_i ; // write
+logic [31:0] wb_dat_i ; // data output
+logic [3:0] wb_sel_i ; // byte enable
+logic [31:0] wb_dat_o ; // data input
+logic wb_ack_o ; // acknowlegement
+logic wb_err_o ; // error
+logic [31:0] wb_adr_int ;
+logic wb_stb_int ;
+logic [31:0] wb_dat_int ; // data input
+logic wb_ack_int ; // acknowlegement
+logic wb_err_int ; // error
+
+logic lbist_clk_skew ; // LBIST clock
+logic scan_mode_int ;
+// LBIST Control Signal
+logic lbist_scan_clk;
+logic lbist_scan_rst_n;
+logic lbist_scan_mode;
+logic lbist_scan_en;
+logic [SCW-1:0] lbist_scan_in;
+
+logic uartm_rxd ;
+logic uartm_txd ;
+
+// Drive UART TXD/RXD
+assign uartm_rxd = io_in;
+assign io_oeb[0] = 1'b1;
+assign io_out[0] = 1'b0;
+
+assign io_out[1] = uartm_txd;
+assign io_oeb[1] = 1'b0;
+
+assign io_out[37:2] = 'h0;
+assign io_oeb[37:2] = 'h0;
+
+//---------------------------------------------------
+// Local OR LA based Logic BIST Selection
+// --------------------------------------------------
+
+assign scan_clk = (cfg_la_lbist) ? la_data_in[35] : lbist_scan_clk;
+assign scan_rst_n = (cfg_la_lbist) ? la_data_in[34] : lbist_scan_rst_n;
+assign scan_mode_int = (cfg_la_lbist) ? la_data_in[33] : lbist_scan_mode;
+assign scan_en = (cfg_la_lbist) ? la_data_in[32] : lbist_scan_en;
+assign scan_in = (cfg_la_lbist) ? la_data_in[31:24]: lbist_scan_in;
+assign la_data_out = {120'h0,scan_out};
+
+
+//-------------------
+assign user_irq = 'h0;
+
+//--------------------------------------------------------------------------------
+// Look like wishbone reset removed early than user Power up sequence
+// To control the reset phase, we have added additional control through la[0]
+// ------------------------------------------------------------------------------
+wire arst_n = !wbm_rst_i & la_data_in[0];
+reset_sync u_wbm_rst (
+ .scan_mode (1'b0 ),
+ .dclk (wbm_clk_i ), // Destination clock domain
+ .arst_n (arst_n ), // active low async reset
+ .srst_n (wbm_rst_n )
+ );
+
+reset_sync u_wbs_rst (
+ .scan_mode (1'b0 ),
+ .dclk (wbs_clk_i ), // Destination clock domain
+ .arst_n (arst_n ), // active low async reset
+ .srst_n (wbs_rst_n )
+ );
+
+// UART Master
+uart2wb u_uart2wb (
+ .arst_n (wbm_rst_n ), // sync reset
+ .app_clk (wbm_clk_i ), // sys clock
+
+ // configuration control
+ .cfg_tx_enable (la_data_in[1] ), // Enable Transmit Path
+ .cfg_rx_enable (la_data_in[2] ), // Enable Received Path
+ .cfg_stop_bit (la_data_in[3] ), // 0 -> 1 Start , 1 -> 2 Stop Bits
+ .cfg_baud_16x (la_data_in[15:4] ), // 16x Baud clock generation
+ .cfg_pri_mod (la_data_in[17:16] ), // priority mode, 0 -> nop, 1 -> Even, 2 -> Odd
+
+ // Master Port
+ .wbm_cyc_o (wbm_uart_cyc_i ), // strobe/request
+ .wbm_stb_o (wbm_uart_stb_i ), // strobe/request
+ .wbm_adr_o (wbm_uart_adr_i ), // address
+ .wbm_we_o (wbm_uart_we_i ), // write
+ .wbm_dat_o (wbm_uart_dat_i ), // data output
+ .wbm_sel_o (wbm_uart_sel_i ), // byte enable
+ .wbm_dat_i (wbm_uart_dat_o ), // data input
+ .wbm_ack_i (wbm_uart_ack_o ), // acknowlegement
+ .wbm_err_i (wbm_uart_err_o ), // error
+
+ // Status information
+ .frm_error (), // framing error
+ .par_error (), // par error
+
+ .baud_clk_16x (), // 16x Baud clock
+
+ // Line Interface
+ .rxd (uartm_rxd) , // uart rxd
+ .txd (uartm_txd) // uart txd
+
+ );
+
+
+// Arbitor to select between external wb vs uart wb
+wire [1:0] grnt;
+wb_arb u_arb(
+ .clk (wbm_clk_i),
+ .rstn (wbm_rst_n),
+ .req ({1'b0,wbm_uart_stb_i,(wbm_stb_i & wbm_cyc_i)}),
+ .gnt (grnt)
+ );
+
+// Select the master based on the grant
+assign wb_cyc_i = (grnt == 2'b00) ? wbm_cyc_i : wbm_uart_cyc_i;
+assign wb_stb_i = (grnt == 2'b00) ? (wbm_cyc_i & wbm_stb_i) : wbm_uart_stb_i;
+assign wb_adr_i = (grnt == 2'b00) ? wbm_adr_i : wbm_uart_adr_i;
+assign wb_we_i = (grnt == 2'b00) ? wbm_we_i : wbm_uart_we_i;
+assign wb_dat_i = (grnt == 2'b00) ? wbm_dat_i : wbm_uart_dat_i;
+assign wb_sel_i = (grnt == 2'b00) ? wbm_sel_i : wbm_uart_sel_i;
+
+assign wbm_dat_o = (grnt == 2'b00) ? wb_dat_o : 'h0;
+assign wbm_ack_o = (grnt == 2'b00) ? wb_ack_o : 'h0;
+assign wbm_err_o = (grnt == 2'b00) ? wb_err_o : 'h0;
+
+
+assign wbm_uart_dat_o = (grnt == 2'b01) ? wb_dat_o : 'h0;
+assign wbm_uart_ack_o = (grnt == 2'b01) ? wb_ack_o : 'h0;
+assign wbm_uart_err_o = (grnt == 2'b01) ? wb_err_o : 'h0;
+
+
+
+
+
+ctech_buf u_scan_buf (.A(scan_mode_int), .X(scan_mode));
+// Reset bypass for scan mode
+ctech_mux2x1 u_wb_rst_scan_sel (.A0 (cfg_glb_ctrl[0]), .A1 (scan_rst_n), .S (scan_mode), .X (wbd_int_rst_n));
+ctech_mux2x1 u_bist_rst_scan_sel (.A0 (cfg_glb_ctrl[1]), .A1 (scan_rst_n), .S (scan_mode), .X (bist_rst_n));
+
+// wb_host clock skew control
+clk_skew_adjust u_skew_wh
+ (
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1 ),// User area 1 1.8V supply
+ .vssd1 (vssd1 ),// User area 1 digital ground
+`endif
+ .clk_in (wbd_clk_int ),
+ .sel (cfg_cska_wh ),
+ .clk_out (wbd_clk_wh )
+ );
+
+// To reduce the load/Timing Wishbone I/F, Strobe is register to create
+// multi-cycle
+wire [31:0] wb_dat_o1 = (wb_reg_sel) ? wb_reg_rdata : (lbist_reg_sel) ? lbist_reg_rdata : wb_dat_int; // data input
+wire wb_ack_o1 = (wb_reg_sel) ? wb_reg_ack : (lbist_reg_sel) ? lbist_reg_ack : wb_ack_int; // acknowlegement
+wire wb_err_o1 = (wb_reg_sel) ? 1'b0 : (lbist_reg_sel) ? lbist_reg_err : wb_err_int; // error
+
+logic wb_req;
+// Hold fix for STROBE
+wire wb_stb_d1,wb_stb_d2,wb_stb_d3;
+ctech_delay_buf u_delay1_stb0 (.X(wb_stb_d1),.A(wb_stb_i));
+ctech_delay_buf u_delay2_stb1 (.X(wb_stb_d2),.A(wb_stb_d1));
+ctech_delay_buf u_delay2_stb2 (.X(wb_stb_d3),.A(wb_stb_d2));
+always_ff @(negedge wbm_rst_n or posedge wbm_clk_i) begin
+ if ( wbm_rst_n == 1'b0 ) begin
+ wb_req <= '0;
+ wb_dat_o <= '0;
+ wb_ack_o <= '0;
+ wb_err_o <= '0;
+ end else begin
+ wb_req <= wb_stb_d3 && ((wb_ack_o == 0) && (wb_ack_o1 == 0)) ;
+ wb_ack_o <= wb_ack_o1;
+ wb_err_o <= wb_err_o1;
+ if(wb_ack_o1) // Keep last data in the bus
+ wb_dat_o <= wb_dat_o1;
+ end
+end
+
+
+//-----------------------------------------------------------------------
+// Local register decide based on address[19] == 1
+//
+// Locally there register are define to control the reset and clock for user
+// area
+//-----------------------------------------------------------------------
+// caravel user space is 0x3000_0000 to 0x3007_FFFF
+// So we have allocated
+// 0x3008_0000 - 0x3008_00FF - Assigned to WB Host Address Space
+// Since We need more than 16MB Address space to access SDRAM/SPI we have
+// added indirect MSB 8 bit address select option
+// So Address will be {Bank_Sel[15:2], wbm_adr_i[17:0]}
+// ---------------------------------------------------------------------
+assign wb_reg_sel = wb_req & (wb_adr_i[19:18] == 2'b10);
+assign lbist_reg_sel = wb_req & (wb_adr_i[19:18] == 2'b11);
+
+assign sw_addr = wb_adr_i [3:2];
+assign sw_rd_en = wb_reg_sel & !wb_we_i;
+assign sw_wr_en = wb_reg_sel & wb_we_i;
+
+assign sw_wr_en_0 = sw_wr_en && (sw_addr==0);
+assign sw_wr_en_1 = sw_wr_en && (sw_addr==1);
+assign sw_wr_en_2 = sw_wr_en && (sw_addr==2);
+assign sw_wr_en_3 = sw_wr_en && (sw_addr==3);
+
+always @ (posedge wbm_clk_i or negedge wbm_rst_n)
+begin : preg_out_Seq
+ if (wbm_rst_n == 1'b0)
+ begin
+ wb_reg_rdata <= 'h0;
+ wb_reg_ack <= 1'b0;
+ end
+ else if (sw_rd_en && !wb_reg_ack)
+ begin
+ wb_reg_rdata <= wb_reg_out ;
+ wb_reg_ack <= 1'b1;
+ end
+ else if (sw_wr_en && !wb_reg_ack)
+ wb_reg_ack <= 1'b1;
+ else
+ begin
+ wb_reg_ack <= 1'b0;
+ end
+end
+
+
+//-------------------------------------
+// Global + Clock Control
+// -------------------------------------
+assign cfg_glb_ctrl = reg_0[7:0];
+assign cfg_wb_clk_ctrl = reg_0[11:8];
+assign cfg_lbist_clk_ctrl = reg_0[15:12];
+assign cfg_la_lbist = reg_0[31]; // Use LA as Logic BIST
+
+
+always @( *)
+begin
+ wb_reg_out [31:0] = 32'h0;
+
+ case (sw_addr [1:0])
+ 2'b00 : wb_reg_out [31:0] = reg_0;
+ 2'b01 : wb_reg_out [31:0] = {16'h0,cfg_bank_sel [15:0]};
+ 2'b10 : wb_reg_out [31:0] = cfg_clk_ctrl1 [31:0];
+ 2'b11 : wb_reg_out [31:0] = cfg_clk_ctrl2 [31:0];
+ default : wb_reg_out [31:0] = 'h0;
+ endcase
+end
+
+
+gen_32b_reg #(32'h00) u_glb_ctrl (
+ //List of Inputs
+ .reset_n (wbm_rst_n ),
+ .clk (wbm_clk_i ),
+ .cs (sw_wr_en_0 ),
+ .we (wb_sel_i ),
+ .data_in (wb_dat_i ),
+
+ //List of Outs
+ .data_out (reg_0 )
+ );
+
+
+generic_register #(16,16'h1000 ) u_bank_sel (
+ .we ({16{sw_wr_en_1}} ),
+ .data_in (wb_dat_i[15:0] ),
+ .reset_n (wbm_rst_n ),
+ .clk (wbm_clk_i ),
+
+ //List of Outs
+ .data_out (cfg_bank_sel[15:0] )
+ );
+
+
+generic_register #(32,0 ) u_clk_ctrl1 (
+ .we ({32{sw_wr_en_2}} ),
+ .data_in (wb_dat_i[31:0] ),
+ .reset_n (wbm_rst_n ),
+ .clk (wbm_clk_i ),
+
+ //List of Outs
+ .data_out (cfg_clk_ctrl1[31:0])
+ );
+
+generic_register #(32,0 ) u_clk_ctrl2 (
+ .we ({32{sw_wr_en_3}} ),
+ .data_in (wb_dat_i[31:0] ),
+ .reset_n (wbm_rst_n ),
+ .clk (wbm_clk_i ),
+
+ //List of Outs
+ .data_out (cfg_clk_ctrl2[31:0])
+ );
+
+
+assign wb_stb_int = wb_req & (!wb_reg_sel & !lbist_reg_sel);
+
+// Since design need more than 16MB address space, we have implemented
+// indirect access
+assign wb_adr_int = {cfg_bank_sel[15:2],wb_adr_i[17:0]};
+
+// During scan mode, feedback the input back for better scan coverage
+logic wbs_cyc_o1 ; // strobe/request
+logic wbs_stb_o1 ; // strobe/request
+logic [31:0] wbs_adr_o1 ; // address
+logic wbs_we_o1 ; // write
+logic [31:0] wbs_dat_o1 ; // data output
+logic [3:0] wbs_sel_o1 ; // byte enable
+
+
+assign wbs_cyc_o = (scan_mode) ? wbs_ack_i : wbs_cyc_o1;
+assign wbs_stb_o = (scan_mode) ? wbs_ack_i : wbs_stb_o1;
+assign wbs_adr_o = (scan_mode) ? wbs_dat_i : wbs_adr_o1;
+assign wbs_we_o = (scan_mode) ? wbs_ack_i : wbs_we_o1;
+assign wbs_dat_o = (scan_mode) ? wbs_dat_i : wbs_dat_o1;
+assign wbs_sel_o = (scan_mode) ? wbs_dat_i[3:0] : wbs_sel_o1;
+
+async_wb u_async_wb(
+// Master Port
+ .wbm_rst_n (wbm_rst_n ),
+ .wbm_clk_i (wbm_clk_i ),
+ .wbm_cyc_i (wb_cyc_i ),
+ .wbm_stb_i (wb_stb_int ),
+ .wbm_adr_i (wb_adr_int ),
+ .wbm_we_i (wb_we_i ),
+ .wbm_dat_i (wb_dat_i ),
+ .wbm_sel_i (wb_sel_i ),
+ .wbm_dat_o (wb_dat_int ),
+ .wbm_ack_o (wb_ack_int ),
+ .wbm_err_o (wb_err_int ),
+
+// Slave Port
+ .wbs_rst_n (wbs_rst_n ),
+ .wbs_clk_i (wbs_clk_i ),
+ .wbs_cyc_o (wbs_cyc_o1 ),
+ .wbs_stb_o (wbs_stb_o1 ),
+ .wbs_adr_o (wbs_adr_o1 ),
+ .wbs_we_o (wbs_we_o1 ),
+ .wbs_dat_o (wbs_dat_o1 ),
+ .wbs_sel_o (wbs_sel_o1 ),
+ .wbs_dat_i (wbs_dat_i ),
+ .wbs_ack_i (wbs_ack_i ),
+ .wbs_err_i (wbs_err_i )
+
+ );
+
+
+//--------------------------------
+// LBIST TOP
+// -------------------------------
+
+lbist_top
+ #(.SCW(SCW) // SCAN CHAIN WIDTH
+ ) u_lbist (
+ // Wishbone Reg I/F
+ .wb_clk (wbm_clk_i),
+ .wb_rst_n (wbm_rst_n),
+ .wb_cs (lbist_reg_sel),
+ .wb_addr (sw_addr),
+ .wb_wr (wb_we_i),
+ .wb_wdata (wb_dat_i),
+ .wb_be (wb_sel_i),
+
+ .wb_rdata (lbist_reg_rdata),
+ .wb_ack (lbist_reg_ack),
+ .wb_err (lbist_reg_err),
+
+ // LBIST I/F
+ .lbist_clk (lbist_clk),
+ .lbist_clk_skew (lbist_clk_int),
+
+
+ // Scan Control Signal
+ .scan_clk (lbist_scan_clk),
+ .scan_rst_n (lbist_scan_rst_n),
+ .scan_mode (lbist_scan_mode),
+ .scan_en (lbist_scan_en),
+ .scan_in (lbist_scan_in),
+ .scan_out (scan_out)
+);
+
+
+//----------------------------------
+// Generate Internal WishBone Clock
+//----------------------------------
+logic wb_clk_div;
+logic wbs_clk;
+logic cfg_wb_clk_div;
+logic [2:0] cfg_wb_clk_ratio;
+
+assign cfg_wb_clk_ratio = cfg_wb_clk_ctrl[2:0];
+assign cfg_wb_clk_div = cfg_wb_clk_ctrl[3];
+
+
+//assign wbs_clk_out = (cfg_wb_clk_div) ? wb_clk_div : wbm_clk_i;
+
+ctech_mux2x1 u_wbs_clk_sel (.A0 (wbm_clk_i), .A1 (wb_clk_div), .S (cfg_wb_clk_div), .X (wbs_clk));
+ctech_mux2x1 u_wbs_clk_scan_sel (.A0 (wbs_clk), .A1 (scan_clk), .S (scan_mode), .X (wbs_clk_out));
+
+
+clk_ctl #(2) u_wbclk (
+ // Outputs
+ .clk_o (wb_clk_div ),
+ // Inputs
+ .mclk (wbm_clk_i ),
+ .reset_n (wbm_rst_n ),
+ .clk_div_ratio (cfg_wb_clk_ratio )
+ );
+
+//----------------------------------
+// Generate Internal WishBone Clock
+//----------------------------------
+logic lbist_clk_div;
+logic cfg_lbist_clk_div;
+logic [2:0] cfg_lbist_clk_ratio;
+
+assign cfg_lbist_clk_ratio = cfg_lbist_clk_ctrl[2:0];
+assign cfg_lbist_clk_div = cfg_lbist_clk_ctrl[3];
+
+
+//assign wbs_clk_out = (cfg_wb_clk_div) ? wb_clk_div : wbm_clk_i;
+ctech_mux2x1 u_lbist_clk_sel (.A0 (wbm_clk_i), .A1 (lbist_clk_div), .S (cfg_lbist_clk_div), .X (lbist_clk));
+
+
+clk_ctl #(2) u_lbist_clk (
+ // Outputs
+ .clk_o (lbist_clk_div ),
+ // Inputs
+ .mclk (wbm_clk_i ),
+ .reset_n (wbm_rst_n ),
+ .clk_div_ratio (cfg_lbist_clk_ratio )
+ );
+
+// wb_host clock skew control
+clk_skew_adjust u_skew_lbist
+ (
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1 ),// User area 1 1.8V supply
+ .vssd1 (vssd1 ),// User area 1 digital ground
+`endif
+ .clk_in (lbist_clk ),
+ .sel (cfg_cska_lbist ),
+ .clk_out (lbist_clk_out )
+ );
+
+endmodule
diff --git a/verilog/rtl/wb_host/src/wb_host.sv.1 b/verilog/rtl/wb_host/src/wb_host.sv.1
new file mode 100644
index 0000000..185226f
--- /dev/null
+++ b/verilog/rtl/wb_host/src/wb_host.sv.1
@@ -0,0 +1,641 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Wishbone host Interface ////
+//// ////
+//// This file is part of the mbist_ctrl project ////
+//// https://github.com/dineshannayya/mbist_ctrl.git ////
+//// ////
+//// Description ////
+//// This block does async Wishbone from one clock to other ////
+//// clock domain ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.1 - 25th Feb 2021, Dinesh A ////
+//// initial version ////
+//// 0.2 - 14th Nov 2021, Dinesh A ////
+//// reset_n connectivity fix for bist and memclock ////
+//// 0.1 - Nov 16 2021, Dinesh A ////
+//// Wishbone out are register for better timing ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+module wb_host
+ #(parameter SCW = 8 // SCAN CHAIN WIDTH
+ ) (
+
+`ifdef USE_POWER_PINS
+ inout vccd1, // User area 1 1.8V supply
+ inout vssd1, // User area 1 digital ground
+`endif
+ input logic user_clock1 ,
+ input logic user_clock2 ,
+ output logic [2:0] user_irq ,
+
+ output logic wbd_int_rst_n ,
+ output logic bist_rst_n ,
+
+ // Master Port
+ input logic wbm_rst_i , // Regular Reset signal
+ input logic wbm_clk_i , // System clock
+ input logic wbm_cyc_i , // strobe/request
+ input logic wbm_stb_i , // strobe/request
+ input logic [31:0] wbm_adr_i , // address
+ input logic wbm_we_i , // write
+ input logic [31:0] wbm_dat_i , // data output
+ input logic [3:0] wbm_sel_i , // byte enable
+ output logic [31:0] wbm_dat_o , // data input
+ output logic wbm_ack_o , // acknowlegement
+ output logic wbm_err_o , // error
+
+ // Clock Skew Adjust
+ input logic wbd_clk_int ,
+ output logic wbd_clk_wh ,
+ input logic [3:0] cfg_cska_wh , // clock skew adjust for web host
+
+ // lbist Clock Skew Adjust
+ input logic lbist_clk_int ,
+ output logic lbist_clk_out ,
+ input logic [3:0] cfg_cska_lbist , // clock skew adjust for web host
+
+ // Slave Port
+ output logic wbs_clk_out , // System clock
+ input logic wbs_clk_i , // System clock
+ output logic wbs_cyc_o , // strobe/request
+ output logic wbs_stb_o , // strobe/request
+ output logic [31:0] wbs_adr_o , // address
+ output logic wbs_we_o , // write
+ output logic [31:0] wbs_dat_o , // data output
+ output logic [3:0] wbs_sel_o , // byte enable
+ input logic [31:0] wbs_dat_i , // data input
+ input logic wbs_ack_i , // acknowlegement
+ input logic wbs_err_i , // error
+
+ output logic [31:0] cfg_clk_ctrl1 ,
+ output logic [31:0] cfg_clk_ctrl2 ,
+ // MBIST I/F
+
+
+ input logic io_in,
+ output logic [37:0] io_out,
+ output logic [37:0] io_oeb,
+ input logic [35:0] la_data_in,
+ output logic [127:0] la_data_out,
+
+ // Scan Control Signal
+ output logic scan_clk,
+ output logic scan_rst_n,
+ output logic scan_mode,
+ output logic scan_en,
+ output logic [SCW-1:0] scan_in,
+ input logic [SCW-1:0] scan_out
+
+ );
+
+
+//--------------------------------
+// local dec
+//
+//--------------------------------
+logic wbm_rst_n;
+logic wbs_rst_n;
+logic [31:0] wbm_dat_int; // data input
+logic wbm_ack_int; // acknowlegement
+logic wbm_err_int; // error
+
+logic wb_reg_sel ; // Local Register Select
+logic [31:0] wb_reg_rdata ;
+logic [31:0] wb_reg_out ;
+logic wb_reg_ack ;
+
+logic lbist_reg_sel ; // LBIST Register Select
+logic [31:0] lbist_reg_rdata ;
+logic lbist_reg_ack ;
+logic lbist_reg_err ;
+
+logic [1:0] sw_addr ;
+logic sw_rd_en ;
+logic sw_wr_en ;
+logic sw_wr_en_0;
+logic sw_wr_en_1;
+logic sw_wr_en_2;
+logic sw_wr_en_3;
+logic sw_wr_en_4;
+logic sw_rd_en_5;
+logic [7:0] cfg_bank_sel;
+logic [31:0] wbm_adr_int;
+logic wbm_stb_int;
+logic [31:0] reg_0; // Software_Reg_0
+logic [31:0] reg_1; // Software_Reg_0
+
+logic [3:0] cfg_wb_clk_ctrl;
+logic [3:0] cfg_lbist_clk_ctrl;
+logic [7:0] cfg_glb_ctrl;
+logic cfg_la_lbist;
+
+// uart Master Port
+logic wbm_uart_cyc_i ; // strobe/request
+logic wbm_uart_stb_i ; // strobe/request
+logic [31:0] wbm_uart_adr_i ; // address
+logic wbm_uart_we_i ; // write
+logic [31:0] wbm_uart_dat_i ; // data output
+logic [3:0] wbm_uart_sel_i ; // byte enable
+logic [31:0] wbm_uart_dat_o ; // data input
+logic wbm_uart_ack_o ; // acknowlegement
+logic wbm_uart_err_o ; // error
+
+// Selected Master Port
+logic wb_cyc_i ; // strobe/request
+logic wb_stb_i ; // strobe/request
+logic [31:0] wb_adr_i ; // address
+logic wb_we_i ; // write
+logic [31:0] wb_dat_i ; // data output
+logic [3:0] wb_sel_i ; // byte enable
+logic [31:0] wb_dat_o ; // data input
+logic wb_ack_o ; // acknowlegement
+logic wb_err_o ; // error
+logic [31:0] wb_adr_int ;
+logic wb_stb_int ;
+logic [31:0] wb_dat_int ; // data input
+logic wb_ack_int ; // acknowlegement
+logic wb_err_int ; // error
+
+logic lbist_clk_skew ; // LBIST clock
+logic scan_mode_int ;
+// LBIST Control Signal
+logic lbist_scan_clk;
+logic lbist_scan_rst_n;
+logic lbist_scan_mode;
+logic lbist_scan_en;
+logic [SCW-1:0] lbist_scan_in;
+
+logic uartm_rxd ;
+logic uartm_txd ;
+
+// Drive UART TXD/RXD
+assign uartm_rxd = io_in;
+assign io_oeb[0] = 1'b1;
+assign io_out[0] = 1'b0;
+
+assign io_out[1] = uartm_txd;
+assign io_oeb[1] = 1'b0;
+
+assign io_out[37:2] = 'h0;
+assign io_oeb[37:2] = 'h0;
+
+//---------------------------------------------------
+// Local OR LA based Logic BIST Selection
+// --------------------------------------------------
+
+assign scan_clk = (cfg_la_lbist) ? la_data_in[35] : lbist_scan_clk;
+assign scan_rst_n = (cfg_la_lbist) ? la_data_in[34] : lbist_scan_rst_n;
+assign scan_mode_int = (cfg_la_lbist) ? la_data_in[33] : lbist_scan_mode;
+assign scan_en = (cfg_la_lbist) ? la_data_in[32] : lbist_scan_en;
+assign scan_in = (cfg_la_lbist) ? la_data_in[31:24]: lbist_scan_in;
+assign la_data_out = {120'h0,scan_out};
+
+
+//-------------------
+assign user_irq = 'h0;
+
+//--------------------------------------------------------------------------------
+// Look like wishbone reset removed early than user Power up sequence
+// To control the reset phase, we have added additional control through la[0]
+// ------------------------------------------------------------------------------
+wire arst_n = !wbm_rst_i & la_data_in[0];
+reset_sync u_wbm_rst (
+ .scan_mode (1'b0 ),
+ .dclk (wbm_clk_i ), // Destination clock domain
+ .arst_n (arst_n ), // active low async reset
+ .srst_n (wbm_rst_n )
+ );
+
+reset_sync u_wbs_rst (
+ .scan_mode (1'b0 ),
+ .dclk (wbs_clk_i ), // Destination clock domain
+ .arst_n (arst_n ), // active low async reset
+ .srst_n (wbs_rst_n )
+ );
+
+// UART Master
+uart2wb u_uart2wb (
+ .arst_n (wbm_rst_n ), // sync reset
+ .app_clk (wbm_clk_i ), // sys clock
+
+ // configuration control
+ .cfg_tx_enable (la_data_in[1] ), // Enable Transmit Path
+ .cfg_rx_enable (la_data_in[2] ), // Enable Received Path
+ .cfg_stop_bit (la_data_in[3] ), // 0 -> 1 Start , 1 -> 2 Stop Bits
+ .cfg_baud_16x (la_data_in[15:4] ), // 16x Baud clock generation
+ .cfg_pri_mod (la_data_in[17:16] ), // priority mode, 0 -> nop, 1 -> Even, 2 -> Odd
+
+ // Master Port
+ .wbm_cyc_o (wbm_uart_cyc_i ), // strobe/request
+ .wbm_stb_o (wbm_uart_stb_i ), // strobe/request
+ .wbm_adr_o (wbm_uart_adr_i ), // address
+ .wbm_we_o (wbm_uart_we_i ), // write
+ .wbm_dat_o (wbm_uart_dat_i ), // data output
+ .wbm_sel_o (wbm_uart_sel_i ), // byte enable
+ .wbm_dat_i (wbm_uart_dat_o ), // data input
+ .wbm_ack_i (wbm_uart_ack_o ), // acknowlegement
+ .wbm_err_i (wbm_uart_err_o ), // error
+
+ // Status information
+ .frm_error (), // framing error
+ .par_error (), // par error
+
+ .baud_clk_16x (), // 16x Baud clock
+
+ // Line Interface
+ .rxd (uartm_rxd) , // uart rxd
+ .txd (uartm_txd) // uart txd
+
+ );
+
+
+// Arbitor to select between external wb vs uart wb
+wire [1:0] grnt;
+wb_arb u_arb(
+ .clk (wbm_clk_i),
+ .rstn (wbm_rst_n),
+ .req ({1'b0,wbm_uart_stb_i,wbm_stb_i}),
+ .gnt (grnt)
+ );
+
+// Select the master based on the grant
+assign wb_cyc_i = (grnt == 2'b00) ? wbm_cyc_i : wbm_uart_cyc_i;
+assign wb_stb_i = (grnt == 2'b00) ? wbm_stb_i : wbm_uart_stb_i;
+assign wb_adr_i = (grnt == 2'b00) ? wbm_adr_i : wbm_uart_adr_i;
+assign wb_we_i = (grnt == 2'b00) ? wbm_we_i : wbm_uart_we_i;
+assign wb_dat_i = (grnt == 2'b00) ? wbm_dat_i : wbm_uart_dat_i;
+assign wb_sel_i = (grnt == 2'b00) ? wbm_sel_i : wbm_uart_sel_i;
+
+assign wbm_dat_o = (grnt == 2'b00) ? wb_dat_o : 'h0;
+assign wbm_ack_o = (grnt == 2'b00) ? wb_ack_o : 'h0;
+assign wbm_err_o = (grnt == 2'b00) ? wb_err_o : 'h0;
+
+
+assign wbm_uart_dat_o = (grnt == 2'b01) ? wb_dat_o : 'h0;
+assign wbm_uart_ack_o = (grnt == 2'b01) ? wb_ack_o : 'h0;
+assign wbm_uart_err_o = (grnt == 2'b01) ? wb_err_o : 'h0;
+
+
+
+
+
+ctech_buf u_scan_buf (.A(scan_mode_int), .X(scan_mode));
+// Reset bypass for scan mode
+ctech_mux2x1 u_wb_rst_scan_sel (.A0 (cfg_glb_ctrl[0]), .A1 (scan_rst_n), .S (scan_mode), .X (wbd_int_rst_n));
+ctech_mux2x1 u_bist_rst_scan_sel (.A0 (cfg_glb_ctrl[1]), .A1 (scan_rst_n), .S (scan_mode), .X (bist_rst_n));
+
+// wb_host clock skew control
+clk_skew_adjust u_skew_wh
+ (
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1 ),// User area 1 1.8V supply
+ .vssd1 (vssd1 ),// User area 1 digital ground
+`endif
+ .clk_in (wbd_clk_int ),
+ .sel (cfg_cska_wh ),
+ .clk_out (wbd_clk_wh )
+ );
+
+
+// To reduce the load/Timing Wishbone I/F, Strobe is register to create
+// multi-cycle
+wire [31:0] wb_dat_o1 = (reg_sel) ? reg_rdata : wb_dat_int; // data input
+wire wb_ack_o1 = (reg_sel) ? reg_ack : wb_ack_int; // acknowlegement
+wire wb_err_o1 = (reg_sel) ? 1'b0 : wb_err_int; // error
+
+logic wb_req;
+// Hold fix for STROBE
+wire wb_stb_d1,wb_stb_d2,wb_stb_d3;
+ctech_delay_buf u_delay1_stb0 (.X(wb_stb_d1),.A(wb_stb_i));
+ctech_delay_buf u_delay2_stb1 (.X(wb_stb_d2),.A(wb_stb_d1));
+ctech_delay_buf u_delay2_stb2 (.X(wb_stb_d3),.A(wb_stb_d2));
+always_ff @(negedge wbm_rst_n or posedge wbm_clk_i) begin
+ if ( wbm_rst_n == 1'b0 ) begin
+ wb_req <= '0;
+ wb_dat_o <= '0;
+ wb_ack_o <= '0;
+ wb_err_o <= '0;
+ end else begin
+ wb_req <= wb_stb_d3 && ((wb_ack_o == 0) && (wb_ack_o1 == 0)) ;
+ wb_ack_o <= wb_ack_o1;
+ wb_err_o <= wb_err_o1;
+ if(wb_ack_o1) // Keep last data in the bus
+ wb_dat_o <= wb_dat_o1;
+ end
+end
+
+
+//-----------------------------------------------------------------------
+// Local register decide based on address[31] == 1
+//
+// Locally there register are define to control the reset and clock for user
+// area
+//-----------------------------------------------------------------------
+// caravel user space is 0x3000_0000 to 0x30FF_FFFF
+// So we have allocated
+// 0x3000_0000 - 0x307F_7FFF - To SRAM Address Space
+// 0x3080_0000 - 0x30B0_00FF - Assigned to WB Host Address Space
+// 0x30C0_0000 - 0x30FF_00FF - Assigned to Logic Bist Address Space
+// ---------------------------------------------------------------------
+assign wb_reg_sel = wb_req & (wb_adr_i[23:22] == 2'b10);
+assign lbist_reg_sel = wb_req & (wb_adr_i[23:22] == 2'b11);
+
+assign sw_addr = wb_adr_i [3:2];
+assign sw_rd_en = wb_reg_sel & !wb_we_i;
+assign sw_wr_en = wb_reg_sel & wb_we_i;
+
+assign sw_wr_en_0 = sw_wr_en && (sw_addr==0);
+assign sw_wr_en_1 = sw_wr_en && (sw_addr==1);
+assign sw_wr_en_2 = sw_wr_en && (sw_addr==2);
+assign sw_wr_en_3 = sw_wr_en && (sw_addr==3);
+
+always @ (posedge wbm_clk_i or negedge wbm_rst_n)
+begin : preg_out_Seq
+ if (wbm_rst_n == 1'b0)
+ begin
+ wb_reg_rdata <= 'h0;
+ wb_reg_ack <= 1'b0;
+ end
+ else if (sw_rd_en && !wb_reg_ack)
+ begin
+ wb_reg_rdata <= wb_reg_out ;
+ wb_reg_ack <= 1'b1;
+ end
+ else if (sw_wr_en && !wb_reg_ack)
+ wb_reg_ack <= 1'b1;
+ else
+ begin
+ wb_reg_ack <= 1'b0;
+ end
+end
+
+
+//-------------------------------------
+// Global + Clock Control
+// -------------------------------------
+assign cfg_glb_ctrl = reg_0[7:0];
+assign cfg_wb_clk_ctrl = reg_0[11:8];
+assign cfg_lbist_clk_ctrl = reg_0[15:12];
+assign cfg_la_lbist = reg_0[31]; // Use LA as Logic BIST
+
+
+always @( *)
+begin
+ wb_reg_out [31:0] = 32'h0;
+
+ case (sw_addr [1:0])
+ 2'b00 : wb_reg_out [31:0] = reg_0;
+ 2'b01 : wb_reg_out [31:0] = {24'h0,cfg_bank_sel [7:0]};
+ 2'b10 : wb_reg_out [31:0] = cfg_clk_ctrl1 [31:0];
+ 2'b11 : wb_reg_out [31:0] = cfg_clk_ctrl2 [31:0];
+ default : wb_reg_out [31:0] = 'h0;
+ endcase
+end
+
+
+gen_32b_reg #(32'h00) u_glb_ctrl (
+ //List of Inputs
+ .reset_n (wbm_rst_n ),
+ .clk (wbm_clk_i ),
+ .cs (sw_wr_en_0 ),
+ .we (wb_sel_i ),
+ .data_in (wb_dat_i ),
+
+ //List of Outs
+ .data_out (reg_0 )
+ );
+
+
+generic_register #(8,8'h00 ) u_bank_sel (
+ .we ({8{sw_wr_en_1}} ),
+ .data_in (wb_dat_i[7:0] ),
+ .reset_n (wbm_rst_n ),
+ .clk (wbm_clk_i ),
+
+ //List of Outs
+ .data_out (cfg_bank_sel[7:0] )
+ );
+
+
+generic_register #(32,0 ) u_clk_ctrl1 (
+ .we ({32{sw_wr_en_2}} ),
+ .data_in (wb_dat_i[31:0] ),
+ .reset_n (wbm_rst_n ),
+ .clk (wbm_clk_i ),
+
+ //List of Outs
+ .data_out (cfg_clk_ctrl1[31:0])
+ );
+
+generic_register #(32,0 ) u_clk_ctrl2 (
+ .we ({32{sw_wr_en_3}} ),
+ .data_in (wb_dat_i[31:0] ),
+ .reset_n (wbm_rst_n ),
+ .clk (wbm_clk_i ),
+
+ //List of Outs
+ .data_out (cfg_clk_ctrl2[31:0])
+ );
+
+
+assign wbm_stb_int = wb_req & (!wb_reg_sel & !lbist_reg_sel);
+
+// Since design need more than 16MB address space, we have implemented
+// indirect access
+assign wbm_adr_int = {4'b0000,cfg_bank_sel[7:0],wbm_adr_i[19:0]};
+
+// During scan mode, feedback the input back for better scan coverage
+logic wbs_cyc_o1 ; // strobe/request
+logic wbs_stb_o1 ; // strobe/request
+logic [31:0] wbs_adr_o1 ; // address
+logic wbs_we_o1 ; // write
+logic [31:0] wbs_dat_o1 ; // data output
+logic [3:0] wbs_sel_o1 ; // byte enable
+
+
+assign wbs_cyc_o = (scan_mode) ? wbs_ack_i : wbs_cyc_o1;
+assign wbs_stb_o = (scan_mode) ? wbs_ack_i : wbs_stb_o1;
+assign wbs_adr_o = (scan_mode) ? wbs_dat_i : wbs_adr_o1;
+assign wbs_we_o = (scan_mode) ? wbs_ack_i : wbs_we_o1;
+assign wbs_dat_o = (scan_mode) ? wbs_dat_i : wbs_dat_o1;
+assign wbs_sel_o = (scan_mode) ? wbs_dat_i[3:0] : wbs_sel_o1;
+
+async_wb u_async_wb(
+// Master Port
+ .wbm_rst_n (wbm_rst_n ),
+ .wbm_clk_i (wbm_clk_i ),
+ .wbm_cyc_i (wb_cyc_i ),
+ .wbm_stb_i (wb_stb_int ),
+ .wbm_adr_i (wb_adr_int ),
+ .wbm_we_i (wb_we_i ),
+ .wbm_dat_i (wb_dat_i ),
+ .wbm_sel_i (wb_sel_i ),
+ .wbm_dat_o (wb_dat_int ),
+ .wbm_ack_o (wb_ack_int ),
+ .wbm_err_o (wb_err_int ),
+
+// Slave Port
+ .wbs_rst_n (wbs_rst_n ),
+ .wbs_clk_i (wbs_clk_i ),
+ .wbs_cyc_o (wbs_cyc_o1 ),
+ .wbs_stb_o (wbs_stb_o1 ),
+ .wbs_adr_o (wbs_adr_o1 ),
+ .wbs_we_o (wbs_we_o1 ),
+ .wbs_dat_o (wbs_dat_o1 ),
+ .wbs_sel_o (wbs_sel_o1 ),
+ .wbs_dat_i (wbs_dat_i ),
+ .wbs_ack_i (wbs_ack_i ),
+ .wbs_err_i (wbs_err_i )
+
+ );
+
+
+//--------------------------------
+// LBIST TOP
+// -------------------------------
+
+lbist_top
+ #(.SCW(SCW) // SCAN CHAIN WIDTH
+ ) u_lbist (
+ // Wishbone Reg I/F
+ .wb_clk (wbm_clk_i),
+ .wb_rst_n (wbm_rst_n),
+ .wb_cs (lbist_reg_sel),
+ .wb_addr (sw_addr),
+ .wb_wr (wbm_we_i),
+ .wb_wdata (wbm_dat_i),
+ .wb_be (wbm_sel_i),
+
+ .wb_rdata (lbist_reg_rdata),
+ .wb_ack (lbist_reg_ack),
+ .wb_err (lbist_reg_err),
+
+ // LBIST I/F
+ .lbist_clk (lbist_clk),
+ .lbist_clk_skew (lbist_clk_int),
+
+
+ // Scan Control Signal
+ .scan_clk (lbist_scan_clk),
+ .scan_rst_n (lbist_scan_rst_n),
+ .scan_mode (lbist_scan_mode),
+ .scan_en (lbist_scan_en),
+ .scan_in (lbist_scan_in),
+ .scan_out (scan_out)
+);
+
+
+//----------------------------------
+// Generate Internal WishBone Clock
+//----------------------------------
+logic wb_clk_div;
+logic wbs_clk;
+logic cfg_wb_clk_div;
+logic [2:0] cfg_wb_clk_ratio;
+
+assign cfg_wb_clk_ratio = cfg_wb_clk_ctrl[2:0];
+assign cfg_wb_clk_div = cfg_wb_clk_ctrl[3];
+
+
+//assign wbs_clk_out = (cfg_wb_clk_div) ? wb_clk_div : wbm_clk_i;
+
+ctech_mux2x1 u_wbs_clk_sel (.A0 (wbm_clk_i), .A1 (wb_clk_div), .S (cfg_wb_clk_div), .X (wbs_clk));
+ctech_mux2x1 u_wbs_clk_scan_sel (.A0 (wbs_clk), .A1 (scan_clk), .S (scan_mode), .X (wbs_clk_out));
+
+
+clk_ctl #(2) u_wbclk (
+ // Outputs
+ .clk_o (wb_clk_div ),
+ // Inputs
+ .mclk (wbm_clk_i ),
+ .reset_n (wbm_rst_n ),
+ .clk_div_ratio (cfg_wb_clk_ratio )
+ );
+
+//----------------------------------
+// Generate Internal WishBone Clock
+//----------------------------------
+logic lbist_clk_div;
+logic cfg_lbist_clk_div;
+logic [2:0] cfg_lbist_clk_ratio;
+
+assign cfg_lbist_clk_ratio = cfg_lbist_clk_ctrl[2:0];
+assign cfg_lbist_clk_div = cfg_lbist_clk_ctrl[3];
+
+
+//assign wbs_clk_out = (cfg_wb_clk_div) ? wb_clk_div : wbm_clk_i;
+ctech_mux2x1 u_lbist_clk_sel (.A0 (wbm_clk_i), .A1 (lbist_clk_div), .S (cfg_lbist_clk_div), .X (lbist_clk));
+
+
+clk_ctl #(2) u_lbist_clk (
+ // Outputs
+ .clk_o (lbist_clk_div ),
+ // Inputs
+ .mclk (wbm_clk_i ),
+ .reset_n (wbm_rst_n ),
+ .clk_div_ratio (cfg_lbist_clk_ratio )
+ );
+
+// wb_host clock skew control
+clk_skew_adjust u_skew_lbist
+ (
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1 ),// User area 1 1.8V supply
+ .vssd1 (vssd1 ),// User area 1 digital ground
+`endif
+ .clk_in (lbist_clk ),
+ .sel (cfg_cska_lbist ),
+ .clk_out (lbist_clk_out )
+ );
+
+endmodule
diff --git a/verilog/rtl/wb_interconnect/src/run_iverilog b/verilog/rtl/wb_interconnect/src/run_iverilog
new file mode 100755
index 0000000..97426bc
--- /dev/null
+++ b/verilog/rtl/wb_interconnect/src/run_iverilog
@@ -0,0 +1,6 @@
+iverilog -g2005-sv \
+wb_interconnect.sv \
+../../lib/wb_stagging.sv \
+../../clk_skew_adjust/src/clk_skew_adjust.gv \
+$PDK_ROOT/sky130A/libs.ref/sky130_fd_sc_hd/verilog/sky130_fd_sc_hd.v \
+$PDK_ROOT/sky130A/libs.ref/sky130_fd_sc_hd/verilog/primitives.v
diff --git a/verilog/rtl/wb_interconnect/src/run_verilator b/verilog/rtl/wb_interconnect/src/run_verilator
new file mode 100755
index 0000000..c5110a9
--- /dev/null
+++ b/verilog/rtl/wb_interconnect/src/run_verilator
@@ -0,0 +1,7 @@
+verilator -cc \
+wb_interconnect.sv \
+../../lib/wb_stagging.sv \
+../../clk_skew_adjust/src/clk_skew_adjust.gv \
+$PDK_ROOT/sky130A/libs.ref/sky130_fd_sc_hd/verilog/sky130_fd_sc_hd.v \
+$PDK_ROOT/sky130A/libs.ref/sky130_fd_sc_hd/verilog/primitives.v \
+--timescale 1ns/100ps --bbox-unsup
diff --git a/verilog/rtl/wb_interconnect/src/wb_interconnect.sv b/verilog/rtl/wb_interconnect/src/wb_interconnect.sv
new file mode 100644
index 0000000..18fc86d
--- /dev/null
+++ b/verilog/rtl/wb_interconnect/src/wb_interconnect.sv
@@ -0,0 +1,518 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Wishbone Interconnect ////
+//// ////
+//// This file is part of the mbist_ctrl cores project ////
+//// https://github.com/dineshannayya/mbist_ctrl.git ////
+//// ////
+//// Description ////
+//// 1. 1 masters and 5 slaves share bus Wishbone connection ////
+//// M0 - WB_PORT ////
+//// S0 - Glbl_Reg ////
+//// S1 - MBIST1 ////
+//// S2 - MBIST2 ////
+//// S3 - MBIST3 ////
+//// S4 - MBIST4 ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+
+
+module wb_interconnect #(
+ parameter SCW = 8, // SCAN CHAIN WIDTH
+ parameter CH_CLK_WD = 9,
+ parameter CH_DATA_WD = 95
+ ) (
+`ifdef USE_POWER_PINS
+ input logic vccd1, // User area 1 1.8V supply
+ input logic vssd1, // User area 1 digital ground
+`endif
+ input logic scan_en,
+ input logic scan_mode,
+ input logic [SCW-1:0] scan_si,
+ output logic [SCW-1:0] scan_so,
+ output logic scan_en_o,
+ output logic scan_mode_o,
+
+ // Clock Skew Adjust
+ input logic [3:0] cfg_cska_wi,
+ input logic wbd_clk_int,
+ output logic wbd_clk_wi,
+
+ // Bus repeaters
+ input [CH_CLK_WD-1:0] ch_clk_in,
+ output [CH_CLK_WD-1:0] ch_clk_out,
+ input [CH_DATA_WD-1:0] ch_data_in,
+ output [CH_DATA_WD-1:0]ch_data_out,
+
+ input logic clk_i,
+ input logic rst_n,
+
+ // Master 0 Interface
+ input logic [31:0] m0_wbd_dat_i,
+ input logic [31:0] m0_wbd_adr_i,
+ input logic [3:0] m0_wbd_sel_i,
+ input logic m0_wbd_we_i,
+ input logic m0_wbd_cyc_i,
+ input logic m0_wbd_stb_i,
+ output logic [31:0] m0_wbd_dat_o,
+ output logic m0_wbd_ack_o,
+ output logic m0_wbd_err_o,
+
+
+ // Slave 0 Interface
+ input logic [31:0] s0_wbd_dat_i,
+ input logic s0_wbd_ack_i,
+ //input logic s0_wbd_err_i, - unused
+ output logic [31:0] s0_wbd_dat_o,
+ output logic [7:0] s0_wbd_adr_o,
+ output logic [3:0] s0_wbd_sel_o,
+ output logic s0_wbd_we_o,
+ output logic s0_wbd_cyc_o,
+ output logic s0_wbd_stb_o,
+
+ // Slave 1 Interface
+ input logic [31:0] s1_wbd_dat_i,
+ input logic s1_wbd_ack_i,
+ // input logic s1_wbd_err_i, - unused
+ output logic [31:0] s1_wbd_dat_o,
+ output logic [10:0] s1_wbd_adr_o,
+ output logic [3:0] s1_wbd_sel_o,
+ output logic s1_wbd_we_o,
+ output logic s1_wbd_cyc_o,
+ output logic s1_wbd_stb_o,
+
+ // Slave 2 Interface
+ input logic [31:0] s2_wbd_dat_i,
+ input logic s2_wbd_ack_i,
+ // input logic s2_wbd_err_i, - unused
+ output logic [31:0] s2_wbd_dat_o,
+ output logic [10:0] s2_wbd_adr_o, // glbl reg need only 8 bits
+ output logic [3:0] s2_wbd_sel_o,
+ output logic s2_wbd_we_o,
+ output logic s2_wbd_cyc_o,
+ output logic s2_wbd_stb_o,
+
+ // Slave 3 Interface
+ // Uart is 8bit interface
+ input logic [31:0] s3_wbd_dat_i,
+ input logic s3_wbd_ack_i,
+ // input logic s3_wbd_err_i,
+ output logic [31:0] s3_wbd_dat_o,
+ output logic [10:0] s3_wbd_adr_o,
+ output logic [3:0] s3_wbd_sel_o,
+ output logic s3_wbd_we_o,
+ output logic s3_wbd_cyc_o,
+ output logic s3_wbd_stb_o,
+
+ // Slave 4 Interface
+ input logic [31:0] s4_wbd_dat_i,
+ input logic s4_wbd_ack_i,
+ // input logic s4_wbd_err_i,
+ output logic [31:0] s4_wbd_dat_o,
+ output logic [10:0] s4_wbd_adr_o,
+ output logic [3:0] s4_wbd_sel_o,
+ output logic s4_wbd_we_o,
+ output logic s4_wbd_cyc_o,
+ output logic s4_wbd_stb_o,
+
+ // Slave 5 Interface
+ input logic [31:0] s5_wbd_dat_i,
+ input logic s5_wbd_ack_i,
+ // input logic s5_wbd_err_i, - unused
+ output logic [31:0] s5_wbd_dat_o,
+ output logic [9:0] s5_wbd_adr_o,
+ output logic [3:0] s5_wbd_sel_o,
+ output logic s5_wbd_we_o,
+ output logic s5_wbd_cyc_o,
+ output logic s5_wbd_stb_o,
+
+ // Slave 6 Interface
+ input logic [31:0] s6_wbd_dat_i,
+ input logic s6_wbd_ack_i,
+ // input logic s6_wbd_err_i, - unused
+ output logic [31:0] s6_wbd_dat_o,
+ output logic [9:0] s6_wbd_adr_o, // glbl reg need only 8 bits
+ output logic [3:0] s6_wbd_sel_o,
+ output logic s6_wbd_we_o,
+ output logic s6_wbd_cyc_o,
+ output logic s6_wbd_stb_o,
+
+ // Slave 7 Interface
+ // Uart is 8bit interface
+ input logic [31:0] s7_wbd_dat_i,
+ input logic s7_wbd_ack_i,
+ // input logic s7_wbd_err_i,
+ output logic [31:0] s7_wbd_dat_o,
+ output logic [9:0] s7_wbd_adr_o,
+ output logic [3:0] s7_wbd_sel_o,
+ output logic s7_wbd_we_o,
+ output logic s7_wbd_cyc_o,
+ output logic s7_wbd_stb_o,
+
+ // Slave 8 Interface
+ input logic [31:0] s8_wbd_dat_i,
+ input logic s8_wbd_ack_i,
+ // input logic s8_wbd_err_i,
+ output logic [31:0] s8_wbd_dat_o,
+ output logic [9:0] s8_wbd_adr_o,
+ output logic [3:0] s8_wbd_sel_o,
+ output logic s8_wbd_we_o,
+ output logic s8_wbd_cyc_o,
+ output logic s8_wbd_stb_o
+ );
+
+////////////////////////////////////////////////////////////////////
+//
+// Type define
+//
+
+
+// WishBone Wr Interface
+typedef struct packed {
+ logic [31:0] wbd_dat;
+ logic [31:0] wbd_adr;
+ logic [3:0] wbd_sel;
+ logic wbd_we;
+ logic wbd_cyc;
+ logic wbd_stb;
+ logic [3:0] wbd_tid; // target id
+} type_wb_wr_intf;
+
+// WishBone Rd Interface
+typedef struct packed {
+ logic [31:0] wbd_dat;
+ logic wbd_ack;
+ logic wbd_err;
+} type_wb_rd_intf;
+
+
+// Master Write Interface
+type_wb_wr_intf m0_wb_wr;
+
+// Master Read Interface
+type_wb_rd_intf m0_wb_rd;
+
+// Slave Write Interface
+type_wb_wr_intf s0_wb_wr;
+type_wb_wr_intf s1_wb_wr;
+type_wb_wr_intf s2_wb_wr;
+type_wb_wr_intf s3_wb_wr;
+type_wb_wr_intf s4_wb_wr;
+type_wb_wr_intf s5_wb_wr;
+type_wb_wr_intf s6_wb_wr;
+type_wb_wr_intf s7_wb_wr;
+type_wb_wr_intf s8_wb_wr;
+
+// Slave Read Interface
+type_wb_rd_intf s0_wb_rd;
+type_wb_rd_intf s1_wb_rd;
+type_wb_rd_intf s2_wb_rd;
+type_wb_rd_intf s3_wb_rd;
+type_wb_rd_intf s4_wb_rd;
+type_wb_rd_intf s5_wb_rd;
+type_wb_rd_intf s6_wb_rd;
+type_wb_rd_intf s7_wb_rd;
+type_wb_rd_intf s8_wb_rd;
+
+
+type_wb_wr_intf m_bus_wr; // Multiplexed Master I/F
+type_wb_rd_intf m_bus_rd; // Multiplexed Slave I/F
+
+type_wb_wr_intf s_bus_wr; // Multiplexed Master I/F
+type_wb_rd_intf s_bus_rd; // Multiplexed Slave I/F
+
+// channel repeater
+assign ch_clk_out = ch_clk_in;
+assign ch_data_out = ch_data_in;
+
+assign scan_en_o = scan_en;
+assign scan_mode_o = scan_mode;
+
+// Wishbone interconnect clock skew control
+clk_skew_adjust u_skew_wi
+ (
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1 ),// User area 1 1.8V supply
+ .vssd1 (vssd1 ),// User area 1 digital ground
+`endif
+ .clk_in (wbd_clk_int ),
+ .sel (cfg_cska_wi ),
+ .clk_out (wbd_clk_wi )
+ );
+
+//-------------------------------------------------------------------
+// EXTERNAL MEMORY MAP
+// 0x0000_0000 to 0x0000_0FFF - GLBL
+// 0x0000_1000 to 0x0000_1FFF - MBIST1
+// 0x0000_2000 to 0x0000_2FFF - MBIST2
+// 0x0000_3000 to 0x0000_3FFF - MBIST3
+// 0x0000_4000 to 0x0000_4FFF - MBIST4
+// 0x0000_5000 to 0x0000_5FFF - MBIST5
+// 0x0000_6000 to 0x0000_6FFF - MBIST6
+// 0x0000_7000 to 0x0000_7FFF - MBIST7
+// 0x0000_8000 to 0x0000_8FFF - MBIST8
+// ---------------------------------------------------------------------------
+//
+wire [3:0] m0_wbd_tid_i = (m0_wbd_adr_i[15:12] == 4'b0000 ) ? 4'b0000 : // GLBL
+ (m0_wbd_adr_i[15:12] == 4'b0001 ) ? 4'b0001 : // MBIST1
+ (m0_wbd_adr_i[15:12] == 4'b0010 ) ? 4'b0010 : // MBIST2
+ (m0_wbd_adr_i[15:12] == 4'b0011 ) ? 4'b0011 : // MBIST3
+ (m0_wbd_adr_i[15:12] == 4'b0100 ) ? 4'b0100 : // MBIST4
+ (m0_wbd_adr_i[15:12] == 4'b0101 ) ? 4'b0101 : // MBIST5
+ (m0_wbd_adr_i[15:12] == 4'b0110 ) ? 4'b0110 : // MBIST6
+ (m0_wbd_adr_i[15:12] == 4'b0111 ) ? 4'b0111 : // MBIST7
+ (m0_wbd_adr_i[15:12] == 4'b1000 ) ? 4'b1000 : // MBIST8
+ 4'b0000;
+
+//----------------------------------------
+// Master Mapping
+// -------------------------------------
+assign m0_wb_wr.wbd_dat = m0_wbd_dat_i;
+assign m0_wb_wr.wbd_adr = {m0_wbd_adr_i[31:2],2'b00};
+assign m0_wb_wr.wbd_sel = m0_wbd_sel_i;
+assign m0_wb_wr.wbd_we = m0_wbd_we_i;
+assign m0_wb_wr.wbd_cyc = m0_wbd_cyc_i;
+assign m0_wb_wr.wbd_stb = m0_wbd_stb_i;
+assign m0_wb_wr.wbd_tid = m0_wbd_tid_i;
+
+assign m0_wbd_dat_o = m0_wb_rd.wbd_dat;
+assign m0_wbd_ack_o = m0_wb_rd.wbd_ack;
+assign m0_wbd_err_o = m0_wb_rd.wbd_err;
+
+
+//----------------------------------------
+// Slave Mapping
+// -------------------------------------
+// Masked Now and added stagging FF now
+ assign s0_wbd_dat_o = s0_wb_wr.wbd_dat ;
+ assign s0_wbd_adr_o = s0_wb_wr.wbd_adr[7:0] ;
+ assign s0_wbd_sel_o = s0_wb_wr.wbd_sel ;
+ assign s0_wbd_we_o = s0_wb_wr.wbd_we ;
+ assign s0_wbd_cyc_o = s0_wb_wr.wbd_cyc ;
+ assign s0_wbd_stb_o = s0_wb_wr.wbd_stb ;
+
+// 2KB SRAM
+ assign s1_wbd_dat_o = s1_wb_wr.wbd_dat ;
+ assign s1_wbd_adr_o = s1_wb_wr.wbd_adr[10:0] ;
+ assign s1_wbd_sel_o = s1_wb_wr.wbd_sel ;
+ assign s1_wbd_we_o = s1_wb_wr.wbd_we ;
+ assign s1_wbd_cyc_o = s1_wb_wr.wbd_cyc ;
+ assign s1_wbd_stb_o = s1_wb_wr.wbd_stb ;
+
+ assign s2_wbd_dat_o = s2_wb_wr.wbd_dat ;
+ assign s2_wbd_adr_o = s2_wb_wr.wbd_adr[10:0] ; // Global Reg Need 8 bit
+ assign s2_wbd_sel_o = s2_wb_wr.wbd_sel ;
+ assign s2_wbd_we_o = s2_wb_wr.wbd_we ;
+ assign s2_wbd_cyc_o = s2_wb_wr.wbd_cyc ;
+ assign s2_wbd_stb_o = s2_wb_wr.wbd_stb ;
+
+ assign s3_wbd_dat_o = s3_wb_wr.wbd_dat;
+ assign s3_wbd_adr_o = s3_wb_wr.wbd_adr[10:0] ; // Global Reg Need 8 bit
+ assign s3_wbd_sel_o = s3_wb_wr.wbd_sel;
+ assign s3_wbd_we_o = s3_wb_wr.wbd_we ;
+ assign s3_wbd_cyc_o = s3_wb_wr.wbd_cyc ;
+ assign s3_wbd_stb_o = s3_wb_wr.wbd_stb ;
+
+ assign s4_wbd_dat_o = s4_wb_wr.wbd_dat ;
+ assign s4_wbd_adr_o = s4_wb_wr.wbd_adr[10:0] ; // Global Reg Need 8 bit
+ assign s4_wbd_sel_o = s4_wb_wr.wbd_sel ;
+ assign s4_wbd_we_o = s4_wb_wr.wbd_we ;
+ assign s4_wbd_cyc_o = s4_wb_wr.wbd_cyc ;
+ assign s4_wbd_stb_o = s4_wb_wr.wbd_stb ;
+
+// 1KB SRAM
+ assign s5_wbd_dat_o = s5_wb_wr.wbd_dat ;
+ assign s5_wbd_adr_o = s5_wb_wr.wbd_adr[9:0] ;
+ assign s5_wbd_sel_o = s5_wb_wr.wbd_sel ;
+ assign s5_wbd_we_o = s5_wb_wr.wbd_we ;
+ assign s5_wbd_cyc_o = s5_wb_wr.wbd_cyc ;
+ assign s5_wbd_stb_o = s5_wb_wr.wbd_stb ;
+
+ assign s6_wbd_dat_o = s6_wb_wr.wbd_dat ;
+ assign s6_wbd_adr_o = s6_wb_wr.wbd_adr[9:0] ; // Global Reg Need 8 bit
+ assign s6_wbd_sel_o = s6_wb_wr.wbd_sel ;
+ assign s6_wbd_we_o = s6_wb_wr.wbd_we ;
+ assign s6_wbd_cyc_o = s6_wb_wr.wbd_cyc ;
+ assign s6_wbd_stb_o = s6_wb_wr.wbd_stb ;
+
+ assign s7_wbd_dat_o = s7_wb_wr.wbd_dat;
+ assign s7_wbd_adr_o = s7_wb_wr.wbd_adr[9:0] ; // Global Reg Need 8 bit
+ assign s7_wbd_sel_o = s7_wb_wr.wbd_sel;
+ assign s7_wbd_we_o = s7_wb_wr.wbd_we ;
+ assign s7_wbd_cyc_o = s7_wb_wr.wbd_cyc ;
+ assign s7_wbd_stb_o = s7_wb_wr.wbd_stb ;
+
+ assign s8_wbd_dat_o = s8_wb_wr.wbd_dat ;
+ assign s8_wbd_adr_o = s8_wb_wr.wbd_adr[9:0] ; // Global Reg Need 8 bit
+ assign s8_wbd_sel_o = s8_wb_wr.wbd_sel ;
+ assign s8_wbd_we_o = s8_wb_wr.wbd_we ;
+ assign s8_wbd_cyc_o = s8_wb_wr.wbd_cyc ;
+ assign s8_wbd_stb_o = s8_wb_wr.wbd_stb ;
+
+ assign s0_wb_rd.wbd_dat = s0_wbd_dat_i ;
+ assign s0_wb_rd.wbd_ack = s0_wbd_ack_i ;
+ assign s0_wb_rd.wbd_err = 1'b0; // s0_wbd_err_i ; - unused
+
+ assign s1_wb_rd.wbd_dat = s1_wbd_dat_i ;
+ assign s1_wb_rd.wbd_ack = s1_wbd_ack_i ;
+ assign s1_wb_rd.wbd_err = 1'b0; // s1_wbd_err_i ; - unused
+
+ assign s2_wb_rd.wbd_dat = s2_wbd_dat_i ;
+ assign s2_wb_rd.wbd_ack = s2_wbd_ack_i ;
+ assign s2_wb_rd.wbd_err = 1'b0; // s2_wbd_err_i ; - unused
+
+ assign s3_wb_rd.wbd_dat = s3_wbd_dat_i ;
+ assign s3_wb_rd.wbd_ack = s3_wbd_ack_i ;
+ assign s3_wb_rd.wbd_err = 1'b0; // s3_wbd_err_i ; - unused
+
+ assign s4_wb_rd.wbd_dat = s4_wbd_dat_i ;
+ assign s4_wb_rd.wbd_ack = s4_wbd_ack_i ;
+ assign s4_wb_rd.wbd_err = 1'b0; // s4_wbd_err_i ; - unused
+
+ assign s5_wb_rd.wbd_dat = s5_wbd_dat_i ;
+ assign s5_wb_rd.wbd_ack = s5_wbd_ack_i ;
+ assign s5_wb_rd.wbd_err = 1'b0; // s5_wbd_err_i ; - unused
+
+ assign s6_wb_rd.wbd_dat = s6_wbd_dat_i ;
+ assign s6_wb_rd.wbd_ack = s6_wbd_ack_i ;
+ assign s6_wb_rd.wbd_err = 1'b0; // s6_wbd_err_i ; - unused
+
+ assign s7_wb_rd.wbd_dat = s7_wbd_dat_i ;
+ assign s7_wb_rd.wbd_ack = s7_wbd_ack_i ;
+ assign s7_wb_rd.wbd_err = 1'b0; // s7_wbd_err_i ; - unused
+
+ assign s8_wb_rd.wbd_dat = s8_wbd_dat_i ;
+ assign s8_wb_rd.wbd_ack = s8_wbd_ack_i ;
+ assign s8_wb_rd.wbd_err = 1'b0; // s8_wbd_err_i ; - unused
+//
+// arbitor removed as only one master
+//
+wire [1:0] gnt = 2'b0;;
+
+
+// Generate Multiplexed Master Interface based on grant
+always_comb begin
+ case(gnt)
+ 2'h0: m_bus_wr = m0_wb_wr;
+ default: m_bus_wr = m0_wb_wr;
+ endcase
+end
+
+
+// Generate Multiplexed Slave Interface based on target Id
+wire [3:0] s_wbd_tid = s_bus_wr.wbd_tid; // to fix iverilog warning
+always_comb begin
+ case(s_wbd_tid)
+ 4'h0: s_bus_rd = s0_wb_rd;
+ 4'h1: s_bus_rd = s1_wb_rd;
+ 4'h2: s_bus_rd = s2_wb_rd;
+ 4'h3: s_bus_rd = s3_wb_rd;
+ 4'h4: s_bus_rd = s4_wb_rd;
+ 4'h5: s_bus_rd = s5_wb_rd;
+ 4'h6: s_bus_rd = s6_wb_rd;
+ 4'h7: s_bus_rd = s7_wb_rd;
+ 4'h8: s_bus_rd = s8_wb_rd;
+ default: s_bus_rd = s0_wb_rd;
+ endcase
+end
+
+
+// Connect Master => Slave
+assign s0_wb_wr = (s_wbd_tid == 4'b0000) ? s_bus_wr : 'h0;
+assign s1_wb_wr = (s_wbd_tid == 4'b0001) ? s_bus_wr : 'h0;
+assign s2_wb_wr = (s_wbd_tid == 4'b0010) ? s_bus_wr : 'h0;
+assign s3_wb_wr = (s_wbd_tid == 4'b0011) ? s_bus_wr : 'h0;
+assign s4_wb_wr = (s_wbd_tid == 4'b0100) ? s_bus_wr : 'h0;
+assign s5_wb_wr = (s_wbd_tid == 4'b0101) ? s_bus_wr : 'h0;
+assign s6_wb_wr = (s_wbd_tid == 4'b0110) ? s_bus_wr : 'h0;
+assign s7_wb_wr = (s_wbd_tid == 4'b0111) ? s_bus_wr : 'h0;
+assign s8_wb_wr = (s_wbd_tid == 4'b1000) ? s_bus_wr : 'h0;
+
+// Connect Slave to Master
+assign m0_wb_rd = (gnt == 2'b00) ? m_bus_rd : 'h0;
+
+
+// Stagging FF to break write and read timing path
+wb_stagging u_m_wb_stage(
+ .clk_i (clk_i ),
+ .rst_n (rst_n ),
+ // WishBone Input master I/P
+ .m_wbd_dat_i (m_bus_wr.wbd_dat ),
+ .m_wbd_adr_i (m_bus_wr.wbd_adr ),
+ .m_wbd_sel_i (m_bus_wr.wbd_sel ),
+ .m_wbd_we_i (m_bus_wr.wbd_we ),
+ .m_wbd_cyc_i (m_bus_wr.wbd_cyc ),
+ .m_wbd_stb_i (m_bus_wr.wbd_stb ),
+ .m_wbd_tid_i (m_bus_wr.wbd_tid ),
+ .m_wbd_dat_o (m_bus_rd.wbd_dat ),
+ .m_wbd_ack_o (m_bus_rd.wbd_ack ),
+ .m_wbd_err_o (m_bus_rd.wbd_err ),
+
+ // Slave Interface
+ .s_wbd_dat_i (s_bus_rd.wbd_dat ),
+ .s_wbd_ack_i (s_bus_rd.wbd_ack ),
+ .s_wbd_err_i (s_bus_rd.wbd_err ),
+ .s_wbd_dat_o (s_bus_wr.wbd_dat ),
+ .s_wbd_adr_o (s_bus_wr.wbd_adr ),
+ .s_wbd_sel_o (s_bus_wr.wbd_sel ),
+ .s_wbd_we_o (s_bus_wr.wbd_we ),
+ .s_wbd_cyc_o (s_bus_wr.wbd_cyc ),
+ .s_wbd_stb_o (s_bus_wr.wbd_stb ),
+ .s_wbd_tid_o (s_bus_wr.wbd_tid )
+
+);
+
+
+endmodule
+