00001 #include <assert.h>
00002 #include "util.h"
00003 #include "vpr_types.h"
00004 #include "globals.h"
00005 #include "OptionTokens.h"
00006 #include "ReadOptions.h"
00007 #include "xml_arch.h"
00008 #include "SetupVPR.h"
00009
00010
00011 static void CheckSwitches(IN t_arch Arch,
00012 IN boolean TimingEnabled);
00013
00014 static void CheckSegments(IN t_arch Arch);
00015
00016
00017
00018 void
00019 CheckArch(IN t_arch Arch,
00020 IN boolean TimingEnabled)
00021 {
00022 CheckSwitches(Arch, TimingEnabled);
00023 CheckSegments(Arch);
00024 }
00025
00026 static void
00027 CheckSwitches(IN t_arch Arch,
00028 IN boolean TimingEnabled)
00029 {
00030 struct s_switch_inf *CurSwitch;
00031 int i;
00032
00033
00034 CurSwitch = Arch.Switches;
00035 for(i = 0; i < Arch.num_switches; i++)
00036 {
00037
00038 if(CurSwitch->buffered && Arch.Segments[0].directionality == BI_DIRECTIONAL)
00039 {
00040
00041
00042
00043
00044 if(CurSwitch->R > 2 * Arch.R_minW_nmos)
00045 {
00046 printf(ERRTAG
00047 "Switch %s R value (%g) is greater than "
00048 "2 * R_minW_nmos (%g).\n", CurSwitch->name,
00049 CurSwitch->R, (2 * Arch.R_minW_nmos));
00050 exit(1);
00051 }
00052 }
00053 else
00054 {
00055 if(CurSwitch->R > Arch.R_minW_nmos)
00056 {
00057 printf(ERRTAG
00058 "Switch %s R value (%g) is greater than "
00059 "R_minW_nmos (%g).\n", CurSwitch->name,
00060 CurSwitch->R, Arch.R_minW_nmos);
00061 exit(1);
00062 }
00063 }
00064 }
00065 }
00066
00067 static void CheckSegments(IN t_arch Arch) {
00068 t_segment_inf *CurSeg;
00069 int i;
00070
00071 CurSeg = Arch.Segments;
00072 for(i = 0; i < Arch.num_segments; i++)
00073 {
00074 if(CurSeg[i].directionality == UNI_DIRECTIONAL && CurSeg[i].longline == TRUE) {
00075 printf("Long lines not supported for unidirectional architectures\n");
00076 exit(1);
00077 }
00078 }
00079 }