################################################################################################
# Copyright 2022 GlobalFoundries PDK Authors
#
# 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
#
#     https://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.
################################################################################################

#================================================
#------------ DEVICES CONNECTIVITY --------------
#================================================

logger.info('Starting GF180 LVS connectivity setup')

#================================
# ----- GENERAL CONNECTIONS -----
#================================

logger.info('Starting GF180 LVS connectivity setup (Inter-layer)')

# Inter-layer
connect(sub,          ptap)
connect(dnwell, ntap_dw)
connect(nwell_con, ntap)
connect(ptap, contact)
connect(ptap_dw, contact)
connect(ntap, contact)
connect(ntap_dw, contact)
connect(psd, contact)
connect(psd_dw, contact)
connect(nsd, contact)
connect(poly2_con, contact)
connect(contact, metal1)
connect(metal1, via1)
connect(via1, metal2_ncap)
if METAL_LEVEL != '2LM'
  connect(metal2_ncap, via2)
  connect(via2, metal3_ncap)
  if METAL_LEVEL != '3LM'
    connect(metal3_ncap, via3)
    connect(via3, metal4_ncap)
    if METAL_LEVEL != '4LM'
      connect(metal4_ncap, via4)
      connect(via4, metal5_ncap)
      if METAL_LEVEL != '5LM'
        connect(metal5_ncap, via5)
        connect(via5, metaltop)
      end
    end
  end
end

logger.info('Starting GF180 LVS connectivity setup (Attaching labels)')

# Attaching labels
connect(comp, comp_label)
connect(poly2_con, poly2_label)
connect(metal1, metal1_label)
connect(metal2_ncap, metal2_label)
if METAL_LEVEL != '2LM'
  connect(metal3_ncap, metal3_label)
  if METAL_LEVEL != '3LM'
    connect(metal4_ncap, metal4_label)
    if METAL_LEVEL != '4LM'
      connect(metal5_ncap, metal5_label)
      connect(metaltop, metaltop_label) if METAL_LEVEL != '5LM'
    end
  end
end

logger.info('Starting GF180 LVS connectivity setup (Global)')

# Global
connect_global(sub, substrate_name)

logger.info('Starting GF180 LVS connectivity setup (Multifinger Devices)')

# Multifinger Devices
connect_implicit('*')


#================================
# ------ BJT CONNECTIONS --------
#================================

# %include bjt_connection.lvs

#================================
# ----- DIODE CONNECTIONS -------
#================================

# %include diode_connection.lvs

#==================================
# ------ MIMCAP CONNECTIONS -------
#==================================

# %include mimcap_connection.lvs

#========================================
# ------ PN Varactors CONNECTIONS -------
#========================================

# %include pn_varactor_connection.lvs

#================================
# ---- RESISTOR DERIVATIONS -----
#================================

# %include res_connection.lvs