###############################################################################
#                       CADENCE COPYRIGHT NOTICE
#       � 2008-2009 Cadence Design Systems, Inc. All rights reserved.
#------------------------------------------------------------------------------
#
# This Foundation Flow is provided as an example of how to perform specialized
# tasks within Innovus System.
#
# This work may not be copied, re-published, uploaded, or distributed in any way,
# in any medium, whether in whole or in part, without prior written permission
# from Cadence. Notwithstanding any restrictions herein, subject to compliance
# with the terms and conditions of the Cadence software license agreement under
# which this material was provided, this material may be copied and internally
# distributed solely for internal purposes for use with Cadence tools.
#
# This work is Cadence intellectual property and may under no circumstances be
# given to third parties, neither in original nor in modified versions, without
# explicit written permission from Cadence. The information contained herein is
# the proprietary and confidential information of Cadence or its licensors, and
# is supplied subject to, and may be used only by Cadence's current customers
# in accordance with, a previously executed license agreement between Cadence
# and its customer.
#
#------------------------------------------------------------------------------
# THIS MATERIAL IS PROVIDED BY CADENCE "AS IS" AND ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL CADENCE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL
# OR CONSEQUENTIAL DAMAGES HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS  MATERIAL, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
###############################################################################

global vars
global rda_Input
#if {$vars(flow) == "default"} {
#   set vars(captbl_file) $vars(wc_cap_table)
#}
set rda_Input(assign_buffer) $vars(assign_buffer)
set rda_Input(double_back) $vars(double_back)
set rda_Input(flip_first) $vars(flip_first_row)
set rda_Input(import_mode) $vars(import_mode)
set rda_Input(ui_areaiolib) $vars(area_io_lib)
set rda_Input(ui_aspect_ratio) $vars(aspect_ratio)
set rda_Input(ui_blklib) $vars(blk_lib)
set rda_Input(ui_buf_footprint) $vars(buf_footprint)
set rda_Input(ui_cap_unit) $vars(cap_unit)
set rda_Input(ui_captbl_file) $vars(captbl_file)
set rda_Input(ui_cdb_file) $vars(cdb_file)
set rda_Input(ui_cdb_file,max) $vars(cdb_file,max)
set rda_Input(ui_cdb_file,min) $vars(cdb_file,min)
set rda_Input(ui_celllib) $vars(celllib)
set rda_Input(ui_core_cntl) $vars(core_control)
set rda_Input(ui_core_height) $vars(core_height)
set rda_Input(ui_core_to_bottom) $vars(core_to_bottom)
set rda_Input(ui_core_to_left) $vars(core_to_left)
set rda_Input(ui_core_to_right) $vars(core_to_right)
set rda_Input(ui_core_to_top) $vars(core_to_top)
set rda_Input(ui_core_util) $vars(core_util)
set rda_Input(ui_core_width) $vars(core_width)
set rda_Input(ui_cts_cell_footprint) $vars(cts_cell_footprint)
set rda_Input(ui_cts_cell_list) $vars(cts_cell_list)
if {[info exists vars(coupling_c_thresh)]} {
   set rda_Input(ui_cpl_c_thresh) $vars(coupling_c_thresh)
}
if {[info exists vars(def_cap_factor)]} {
   set rda_Input(ui_preRoute_cap) $vars(def_cap_factor)
}
if {[info exists vars(det_cap_factor)]} {
   set rda_Input(ui_postRoute_cap) $vars(det_cap_factor)
}
if {[info exists vars(def_res_factor)]} {
   set rda_Input(ui_preRoute_res) $vars(def_res_factor)
}
if {[info exists vars(det_res_factor)]} {
   set rda_Input(ui_postRoute_res) $vars(det_res_factor)
}
if {[info exists vars(det_xcap_factor)]} {
   set rda_Input(ui_xcap_scale) $vars(det_xcap_factor)
}
set rda_Input(ui_delay_footprint) $vars(del_footprint)
set rda_Input(ui_delay_limit) $vars(delay_limit)
set rda_Input(ui_dpath) $vars(data_path)
set rda_Input(ui_echo_file) $vars(echo_file)
set rda_Input(ui_echo_file,max) $vars(echo_file,max)
set rda_Input(ui_echo_file,min) $vars(echo_file,min)
set rda_Input(ui_exc_net) $vars(exclude_nets)
set rda_Input(ui_gds_file) ""
set rda_Input(ui_gen_footprint) $vars(gen_footprint)
#set vars(ilm_dir) ""
#if {[info exists vars(ilm_list)]} {
#   foreach cell $vars(ilm_list) {
#      if {[info exists vars($cell,ilm_dir)]} {
#         lappend vars(ilm_dir) $cell
#         lappend vars(ilm_dir) $vars($cell,ilm_dir)
#      } else {
#         Puts "<FF> WARNING: ILM DIRECTORY MISSING FOR $cell ... SKIPPING"
#      }
#   }
#}
#set rda_Input(ui_ilmdir) $vars(ilm_dir)
#set rda_Input(ui_ilmlist) $vars(ilm_list)
#set rda_Input(ui_ilmspef) $vars(ilm_spef)
set rda_Input(ui_ilmdir) {}
set rda_Input(ui_ilmlist) {}
set rda_Input(ui_ilmspef) {}
set rda_Input(ui_in_tran_delay) $vars(default_slew)
set rda_Input(ui_inv_footprint) $vars(inv_footprint)
set rda_Input(ui_ioOri) $vars(io_orientation)
set rda_Input(ui_io_file) $vars(io_file)
set rda_Input(ui_iolib) $vars(io_lib)
set rda_Input(ui_isHorTrackHalfPitch) $vars(hor_track_half_pitch)
set rda_Input(ui_isOrigCenter) $vars(center_origin)
set rda_Input(ui_isVerTrackHalfPitch) $vars(ver_track_half_pitch)
set rda_Input(ui_isVerticalRow) $vars(vertical_rows)
set rda_Input(ui_kboxlib) $vars(kbox_lib)
set rda_Input(ui_latency_file) $vars(latency_file)
if {[info exists vars(lef_files)]} {
   set rda_Input(ui_leffile) $vars(lef_files)
}
set rda_Input(ui_locvlib) $vars(locv_lib)
set rda_Input(ui_max_io_height) $vars(max_io_height)
set rda_Input(ui_net_delay) $vars(default_net_delay)
set rda_Input(ui_net_load) $vars(default_net_load)
if {[info exists vars(netlist)]} {
   set rda_Input(ui_netlist) $vars(netlist)
}
set rda_Input(ui_netlisttype) $vars(netlist_type)
set rda_Input(ui_oa_abstractname) $vars(oa_abstract_name)
set rda_Input(ui_oa_layoutname) $vars(oa_layout_name)
set rda_Input(ui_oa_oa2lefversion) $vars(oa2lefversion)
set rda_Input(ui_oa_reflib) $vars(oa_ref_lib)
set rda_Input(ui_oa_designLib) $vars(oa_design_lib)
set rda_Input(ui_oa_designCell) $vars(oa_design_cell)
set rda_Input(ui_oa_designView) $vars(oa_design_view)

#if {[info exists vars(pg_connections)]} {
#   set rda_Input(ui_pg_connections) $vars(pg_connections)
#   foreach connection $vars(pg_connections) {
#      set rda_Input($connection) $vars($connection)
#   }
#}
set rda_Input(ui_pwrnet) $vars(power_nets)
set rda_Input(ui_gndnet) $vars(ground_nets)
set rda_Input(ui_qxconf_file) $vars(qxconf_file)
set rda_Input(ui_qxlayermap_file) $vars(qxlayermap_file)
set rda_Input(ui_qxlib_file) $vars(qxlib_file)
set rda_Input(ui_qxtech_file) $vars(qxtech_file)
if {[info exists vars(relative_c_thresh)]} {
   set rda_Input(ui_rel_c_thresh) $vars(relative_c_thresh)
}
set rda_Input(ui_row_height) $vars(row_height)
set rda_Input(ui_rtllist) $vars(rtl_list)
set rda_Input(ui_scheduling_file) $vars(scheduling_file)
set rda_Input(ui_settop) $vars(set_top_cell)
set rda_Input(ui_shr_scale) $vars(shr_scale)
set rda_Input(ui_sigstormlib) $vars(signalstorm_lib)
set rda_Input(ui_smodData) $vars(smod_data)
set rda_Input(ui_smodDef) $vars(smod_def)
set rda_Input(ui_tech_file) $vars(tech_file)
set rda_Input(ui_time_unit) $vars(time_unit)
set rda_Input(ui_timelib) $vars(timelib)
set rda_Input(ui_timelib,max) $vars(timelib,max)
set rda_Input(ui_timelib,min) $vars(timelib,min)
if {[info exists vars(timingcon_file)]} {
   set rda_Input(ui_timingcon_file) $vars(timingcon_file)
}
if {[info exists vars(timingcon_file,full)]} {
   set rda_Input(ui_timingcon_file,full) $vars(timingcon_file,full)
}
set rda_Input(ui_topcell) $vars(design)
if {[info exists vars(total_c_thresh)]} {
   set rda_Input(ui_tot_c_thresh) $vars(total_c_thresh)
}
set rda_Input(ui_view_definition_file) $vars(view_definition_file)
set rda_Input(ui_xtwf_file) $vars(xtalk_twf_file)
