| #include <assert.h> |
| #include "util.h" |
| #include "vpr_types.h" |
| #include "globals.h" |
| #include "OptionTokens.h" |
| #include "ReadOptions.h" |
| #include "read_xml_arch_file.h" |
| #include "SetupVPR.h" |
| |
| /******** Function Prototypes ********/ |
| static void CheckSwitches(INP t_arch Arch, |
| INP boolean TimingEnabled); |
| |
| static void CheckSegments(INP t_arch Arch); |
| |
| /******** Function Implementations ********/ |
| |
| void |
| CheckArch(INP t_arch Arch, |
| INP boolean TimingEnabled) |
| { |
| CheckSwitches(Arch, TimingEnabled); |
| CheckSegments(Arch); |
| } |
| |
| static void |
| CheckSwitches(INP t_arch Arch, |
| INP boolean TimingEnabled) |
| { |
| struct s_switch_inf *CurSwitch; |
| int i; |
| |
| /* Check transistors in switches won't be less than minimum size */ |
| CurSwitch = Arch.Switches; |
| for(i = 0; i < Arch.num_switches; i++) |
| { |
| /* This assumes all segments have the same directionality */ |
| if(CurSwitch->buffered && Arch.Segments[0].directionality == BI_DIRECTIONAL) |
| { |
| /* Largest resistance tri-state buffer would have a minimum |
| * width transistor in the buffer pull-down and a min-width |
| * pass transistoron the output. |
| * Hence largest R = 2 * largest_transistor_R. */ |
| if(CurSwitch->R > 2 * Arch.R_minW_nmos) |
| { |
| printf(ERRTAG |
| "Switch %s R value (%g) is greater than " |
| "2 * R_minW_nmos (%g).\n", CurSwitch->name, |
| CurSwitch->R, (2 * Arch.R_minW_nmos)); |
| exit(1); |
| } |
| } |
| else |
| { /* Pass transistor switch */ |
| if(CurSwitch->R > Arch.R_minW_nmos) |
| { |
| printf(ERRTAG |
| "Switch %s R value (%g) is greater than " |
| "R_minW_nmos (%g).\n", CurSwitch->name, |
| CurSwitch->R, Arch.R_minW_nmos); |
| exit(1); |
| } |
| } |
| } |
| } |
| |
| static void CheckSegments(INP t_arch Arch) { |
| t_segment_inf *CurSeg; |
| int i; |
| |
| CurSeg = Arch.Segments; |
| for(i = 0; i < Arch.num_segments; i++) |
| { |
| if(CurSeg[i].directionality == UNI_DIRECTIONAL && CurSeg[i].longline == TRUE) { |
| printf("Long lines not supported for unidirectional architectures\n"); |
| exit(1); |
| } |
| } |
| } |