# -*- tcl -*-

# Clock constraints

# Input master clock for all PLLs
create_clock -name "clock_48" -period 20.834ns [get_ports {clock_48}]
derive_pll_clocks

# Handle both the RTC input clock and the internal workaround
# The internal workaround clock should still be treated an asynchronous
create_clock -name "rtc_32khz" -period 30517.578ns [get_ports {rtc_32khz}]
create_clock -name "ctr_32khz" -period 30517.578ns [get_registers {ctr_32khz}]
set_clock_groups -asynchronous -group {rtc_32khz}
set_clock_groups -asynchronous -group {ctr_32khz}

# Automatically calculate clock uncertainty to jitter and other effects.
derive_clock_uncertainty

# Reset isn't actually a clock, but Quartus thinks it is
create_generated_clock -name rst_n \
    -source [get_nets pll|*clk\[1\]] \
    [get_registers rst_n]

# Reset is asynchronous  with everything as far as we are concerned.
set main_clocks [get_clocks pll|*]
set_clock_groups -asynchronous \
    -group $main_clocks \
    -group [get_clocks rst_n]

set sdram_out_clk [get_clocks pll|*|clk\[0\]]
set sdram_clk     [get_clocks pll|*|clk\[4\]]
set cpu_clk       [get_clocks pll|*|clk\[1\]]
set vid_clk       [get_clocks pll|*|clk\[2\]]
set flash_clk     [get_clocks pll|*|clk\[3\]]

# SDRAM I/O constraints
set sr_data_out [remove_from_collection [get_ports sr_*] sr_clk]
set sr_data_in  [get_ports sr_dq\[*\]]
set_max_skew -to $sr_data_out 0.100ns
set_input_delay  -clock $sdram_clk 0.500ns  $sr_data_in

# Anything that feeds into a synchronizer is by definition
# asynchronous, but encode it as allowing multicycle of one
# clock, to limit the possible skew (but it is of course not possible
# to eliminate it...)
set synchro_inputs [get_registers *|synchronizer:*|qreg0*] 
set_multicycle_path -from [all_clocks] -to $synchro_inputs \
    -start -setup 2
set_multicycle_path -from [all_clocks] -to $synchro_inputs \
    -start -hold 1
set_multicycle_path -from $sdram_clk -to $sdram_out_clk \
    -start -setup 2
set_multicycle_path -from $sdram_clk -to $sdram_out_clk \
    -start -hold 0

# Don't report signaltap clock problems...
set_false_path -to [get_registers sld_signaltap:*]
