Пример #1
0
 def builder(self):
   if '_builder' not in self.__dict__:
     if not self.is_main:
       self._builder = []
     else:
       import parsed_text
       from variables import build_use, call_provides
       for filename,buffer in parsed_text.parsed_text:
         if self.line.filename[0].startswith(filename):
           break
       text = []
       same_as = self.same_as
       inside = False
       for vars,line in buffer:
         if type(line) == Begin_provider:
           if line.filename[1] == same_as:
             inside = True
           vars = []
         if inside:
           text.append( (vars,line) )
           text += map( lambda x: ([],Simple_line(line.i,x,line.filename)), call_provides(vars) )
           if command_line.do_profile and type(line) == Begin_provider:
             text.append( ( [], Declaration(line.i,"  double precision :: irp_rdtsc, irp_rdtsc1, irp_rdtsc2",line.filename) ) )
             text.append( ( [], Simple_line(line.i,"  irp_rdtsc1 = irp_rdtsc()",line.filename) ) )
         if type(line) == End_provider:
           if inside:
             break
       name = self.name
       text = parsed_text.move_to_top(text,Declaration)
       text = parsed_text.move_to_top(text,Implicit)
       text = parsed_text.move_to_top(text,Use)
       text = map(lambda x: x[1], text)
       for line in filter(lambda x: type(x) not in [ Begin_doc, End_doc, Doc], text):
         if type(line) == Begin_provider:
           result = []
           if command_line.directives and command_line.inline in ["all","builders"]:
             result += [ "!DEC$ ATTRIBUTES INLINE :: bld_%s"%(same_as) ]
           result += [ "subroutine bld_%s"%(name) ]
           result += build_use([name]+self.needs)
         elif type(line) == Cont_provider:
           pass
         elif type(line) == End_provider:
           if command_line.do_profile:
             result += [ "  irp_rdtsc2 = irp_rdtsc()" ,
                         "  call irp_set_timer(%d,(irp_rdtsc2-irp_rdtsc1))"%self.label ]
           result.append( "end subroutine bld_%s"%(name) )
           break
         else:
           result.append(line.text)
       self._builder = result
   return self._builder
Пример #2
0
    def builder(self):
        if '_builder' not in self.__dict__:
            if not self.is_main:
                self._builder = []
            else:
                import parsed_text
                from variables import build_use, call_provides
                for filename, buffer in parsed_text.parsed_text:
                    if self.line.filename[0].startswith(filename):
                        break
                text = []
                same_as = self.same_as
                inside = False
                for vars, line in buffer:
                    if type(line) == Begin_provider:
                        if line.filename[1] == same_as:
                            inside = True
                        vars = []
                    if inside:
                        text.append((vars, line))
                        text += map(
                            lambda x:
                            ([], Simple_line(line.i, x, line.filename)),
                            call_provides(vars))
                        if command_line.do_profile and type(
                                line) == Begin_provider:
                            text.append((
                                [],
                                Declaration(
                                    line.i,
                                    "  double precision :: irp_rdtsc, irp_rdtsc1, irp_rdtsc2",
                                    line.filename)))
                            text.append(
                                ([],
                                 Simple_line(line.i,
                                             "  irp_rdtsc1 = irp_rdtsc()",
                                             line.filename)))
                    if type(line) == End_provider:
                        if inside:
                            break
                name = self.name
                text = parsed_text.move_to_top(text, Declaration)
                text = parsed_text.move_to_top(text, Implicit)
                text = parsed_text.move_to_top(text, Use)
                text = map(lambda x: x[1], text)
                #        inside_omp = False
                for line in filter(
                        lambda x: type(x) not in [Begin_doc, End_doc, Doc],
                        text):
                    if type(line) == Begin_provider:
                        result = []
                        if command_line.directives and command_line.inline in [
                                "all", "builders"
                        ]:
                            result += [
                                "!DEC$ ATTRIBUTES INLINE :: bld_%s" % (same_as)
                            ]
                        result += ["subroutine bld_%s" % (name)]
                        result += build_use([name] + self.needs)
                    elif type(line) == Cont_provider:
                        pass
                    elif type(line) == End_provider:
                        if command_line.do_profile:
                            result += [
                                "  irp_rdtsc2 = irp_rdtsc()",
                                "  call irp_set_timer(%d,(irp_rdtsc2-irp_rdtsc1))"
                                % self.label
                            ]
                        result.append("end subroutine bld_%s" % (name))
                        break
                    elif type(line) == Openmp:
                        # Detect OpenMP blocks
                        buffer = line.text.lower().split()
                        if buffer[1] == "parallel":
                            #              inside_omp = True
                            self._has_openmp = True
#            if buffer[1] == "end" and buffer[2] == "parallel":
#              inside_omp = False
                        result.append(line.text)
                    else:
                        #           if inside_omp:
                        #             if type(line) in [ Provide_all, Provide, Touch, SoftTouch ]:
                        #               error.fail(line,str(type(line))+"is not allowed in an OpenMP block.")
                        result.append(line.text)
                self._builder = result
        return self._builder
Пример #3
0
  def residual_text(self):
    if '_residual_text' not in self.__dict__:
      from variables import build_use, call_provides
      from parsed_text import move_to_top
      def remove_providers(text):
        result = []
        inside = False
        for vars,line in text:
          if type(line) == Begin_provider:
            inside = True
          if not inside:
            result.append( (vars,line) )
          if type(line) == End_provider:
            inside = False
        return result

      def modify_functions(text):
        result = []
        variable_list = []
        for vars,line in text:
          if type(line) in [ Subroutine, Function ]:
            variable_list = list(vars)
          elif type(line) == End:
            result += map(lambda x: ([],Use(line.i,x,line.filename)), build_use(variable_list))
          else:
            variable_list += vars
          result.append( (vars,line) )
        return result

      def extract_use_dec_text(text):
        inside = False
        result = []
        dec = []
        use = []
        for vars,line in text:
          if type(line) in [ Subroutine, Function, Program]:
            inside = True
          if inside:
            result.append( (vars,line) )
          else:
            if type(line) == Use:
              use.append( (vars,line) )
            elif type(line) == Declaration:
              dec.append( (vars,line) )
          if type(line) == End:
            inside = False
        return use, dec, result

      def provide_variables(text):
        result = []
        for vars,line in text:
          result.append( ([],line) )
          result += map(lambda x: ([],Simple_line(line.i,x,line.filename)), call_provides(vars)) 
        return result

      result = remove_providers(self.text)
      result = modify_functions(result)
      use,dec,result = extract_use_dec_text(result)
      self._use = make_single(map(lambda x: " "+x[1].text, use))
      self._dec = map(lambda x: " "+x[1].text, dec)
#      self._dec = make_single(map(lambda x: " "+x[1].text, dec))
      result = provide_variables(result)
      result = move_to_top(result,Declaration)
      result = move_to_top(result,Implicit)
      result = move_to_top(result,Use)
      result    = map(lambda x: x[1], result)
      result    = map(lambda x: x.text, result)
      self._residual_text = result
    return self._residual_text
Пример #4
0
    def residual_text(self):
        if '_residual_text' not in self.__dict__:
            from variables import build_use, call_provides
            from parsed_text import move_to_top

            def remove_providers(text):
                result = []
                inside = False
                for vars, line in text:
                    if type(line) == Begin_provider:
                        inside = True
                    if not inside:
                        result.append((vars, line))
                    if type(line) == End_provider:
                        inside = False
                return result

            def modify_functions(text):
                result = []
                variable_list = []
                for vars, line in text:
                    if type(line) in [Subroutine, Function]:
                        variable_list = list(vars)
                    elif type(line) == End:
                        result += map(
                            lambda x: ([], Use(line.i, x, line.filename)),
                            build_use(variable_list))
                    else:
                        variable_list += vars
                    result.append((vars, line))
                return result

            def extract_use_dec_text(text):
                inside = False
                result = []
                dec = []
                use = []
                for vars, line in text:
                    if type(line) in [Subroutine, Function, Program]:
                        inside = True
                    if inside:
                        result.append((vars, line))
                    else:
                        if type(line) == Use:
                            use.append((vars, line))
                        elif type(line) == Declaration:
                            dec.append((vars, line))
                    if type(line) == End:
                        inside = False
                return use, dec, result

            def provide_variables(text):
                result = []
                for vars, line in text:
                    result.append(([], line))
                    result += map(
                        lambda x: ([], Simple_line(line.i, x, line.filename)),
                        call_provides(vars))
                return result

            result = remove_providers(self.text)
            result = modify_functions(result)
            use, dec, result = extract_use_dec_text(result)
            self._use = make_single(map(lambda x: " " + x[1].text, use))
            self._dec = map(lambda x: " " + x[1].text, dec)
            #      self._dec = make_single(map(lambda x: " "+x[1].text, dec))
            result = provide_variables(result)
            result = move_to_top(result, Declaration)
            result = move_to_top(result, Implicit)
            result = move_to_top(result, Use)
            result = map(lambda x: x[1], result)
            result = map(lambda x: x.text, result)
            self._residual_text = result
        return self._residual_text