Connectivity Report Scripts

 

 

# Auxiliary function:

# Converts DC collection to TCL list

#-----------------------------------

proc c2l {collection} {

  set my_list {}

  foreach_in_collection coll_element $collection {

    set element [get_object_name $coll_element]

    lappend my_list $element

  }

  return $my_list

}

 

# Auxiliary function:

# Deletes one list (or element) from another list

# -----------------------------------------------

proc ldelete {list list_to_del} {

  foreach str $list_to_del {

    set ix [lsearch -exact $list $str]

    if {$ix >= 0} {set list [lreplace $list $ix $ix]}

  }

  return $list

}

 

# Reports about registered input ports in design.

# Registered input port should be connected to register only.

# -----------------------------------------------

proc report_registered_inputs {} {

  foreach in [c2l [all_inputs]] {

    set conn_pins [ldelete [c2l [all_connected $in]] $in]

    if {[llength $conn_pins] == 1 && [lsearch $conn_pins "*_reg*"] > -1} {

      echo "Input Port $in is registered"

    }

  }

}

 

# Reports about registered output ports in design.

# Registered output port should be connected to register only.

# -----------------------------------------------

proc report_registered_outputs {} {

  foreach out [c2l [all_outputs]] {

    set conn_pins [ldelete [c2l [all_connected $out]] $out]

    if {[llength $conn_pins] == 2 && [lsearch $conn_pins "*_reg*"] > -1} {

      echo "Output Port $out is registered"

    }

  }

}

 

# Reports about disconnected input ports in design

# ------------------------------------------------

proc report_disconnected_inputs {} {

  set data_inputs [remove_from_collection [all_inputs] [get_ports [all_clocks]]]

  foreach input [c2l $data_inputs] {

    if {[llength [c2l [all_connected $input]]] <1} {

      echo "$input input port is disconnected"

      lappend ret_list $input

    }

  }

  if {[info exists ret_list]} {return $ret_list}

}

 

# Reports about disconnected output ports in design

# ------------------------------------------------

proc report_disconnected_outputs {} {

  foreach output [c2l [all_outputs]] {

    if {[llength [c2l [all_connected $output]]] <1} {

      echo "$output output port is disconnected"

      lappend ret_list $output

    }

  }

  if {[info exists ret_list]} {return $ret_list}

}

 

 

# Generates INPUT - TO - REGS Connectivity report

#====================================================================

proc in_to_regs_report {} {

  puts "\n\n                     INPUT - TO - REGS REPORT"

  puts "|------------------------------------------------------------------|"

  puts [format "%-25s %-40s %-1s" "|INPUT NAME" "|RELATED REGISTERS" "|"]

  puts [format "%-25s %-40s %-1s" "|==========" "|=================" "|"]

  puts "|-------------------------|----------------------------------------|"

 

  foreach_in_collection input [all_inputs] {

    set connected [all_fanout -from [get_object_name $input] -endpoints_only]

    set conn_pins [remove_from_collection $connected [all_outputs]]

    if {[sizeof_collection $conn_pins] > 0} {

      set conn_regs [c2l [cell_of $conn_pins]]

      set in [get_object_name $input]

 

      puts [format "%-25s %-40s %-1s" "| $in" "| [lindex $conn_regs 0]" "|"]

      for {set i 1} {$i < [llength $conn_regs]} {incr i} {

        puts [format "%-25s %-40s %-1s" "|" "| [lindex $conn_regs $i]" "|"]

      }

      puts "|-------------------------|----------------------------------------|"

    }

  }

}

 

# Generates OUTPUT - TO - REGS Connectivity report

#====================================================================

proc out_to_regs_report {} {

  puts "\n\n                     OUTPUT - TO - REGS REPORT"

  puts "|------------------------------------------------------------------|"

  puts [format "%-25s %-40s %-1s" "|OUTPUT NAME" "|RELATED REGISTERS" "|"]

  puts [format "%-25s %-40s %-1s" "|===========" "|=================" "|"]

  puts "|-------------------------|----------------------------------------|"

 

  foreach_in_collection output [all_outputs] {

    set connected [all_fanin -to [get_object_name $output] -startpoints_only]

    set conn_pins [remove_from_collection $connected [all_inputs]]

    if {[sizeof_collection $conn_pins] > 0} {

      set conn_regs [c2l [cell_of $conn_pins]]

      set out [get_object_name $output]

  

      puts [format "%-25s %-40s %-1s" "| $out" "| [lindex $conn_regs 0]" "|"]

      for {set i 1} {$i < [llength $conn_regs]} {incr i} {

        puts [format "%-25s %-40s %-1s" "|" "| [lindex $conn_regs $i]" "|"]

      }

      puts "|-------------------------|----------------------------------------|"

    }

  }

}

 

 

# Generated Asynchronous path reports (Input ports - to Output ports)

#====================================================================

proc in_to_out_report {} {

  puts "\n\n                     ASYNCRONOUS PATHS REPORT"

  puts "|------------------------------------------------------------------|"

  puts [format "%-25s %-40s %-1s" "| FROM INPUT" "| TO OUTPUT" "|"]

  puts [format "%-25s %-40s %-1s" "| ==========" "| =========" "|"]

  puts "|-------------------------|----------------------------------------|"

 

  foreach_in_collection input [all_inputs] {

    set conn_ports [get_ports [c2l [all_fanout -from [get_object_name $input] -endpoints_only]] \

      -filter "@port_direction == out"]

    if {[sizeof_collection $conn_ports] > 0} {

      set in [get_object_name $input]

      set out_ports [c2l $conn_ports]

 

      puts [format "%-25s %-40s %-1s" "| $in" "| [lindex $out_ports 0]" "|"]

      for {set i 1} {$i < [llength $out_ports]} {incr i} {

        puts [format "%-25s %-40s %-1s" "|" "| [lindex $out_ports $i]" "|"]

      }

      puts "|-------------------------|----------------------------------------|"

 

    }

  }

}