def test_check_variable(): '''Test the _check_variable utility method behaves as expected''' with pytest.raises(GenerationError) as info: Loop._check_variable(None) assert ("variable property in Loop class should be a DataSymbol but " "found 'NoneType'." in str(info.value)) with pytest.raises(GenerationError) as info: Loop._check_variable("hello") assert ("variable property in Loop class should be a DataSymbol but " "found 'str'." in str(info.value)) array_type = ArrayType(INTEGER_TYPE, shape=[10, 20]) array_symbol = DataSymbol("my_array", array_type) with pytest.raises(GenerationError) as info: Loop._check_variable(array_symbol) assert ("variable property in Loop class should be a ScalarType but " "found 'ArrayType'." in str(info.value)) scalar_symbol = DataSymbol("my_array", REAL_TYPE) with pytest.raises(GenerationError) as info: Loop._check_variable(scalar_symbol) assert ("variable property in Loop class should be a scalar integer but " "found 'REAL'." in str(info.value)) scalar_symbol = DataSymbol("my_array", INTEGER_TYPE) assert Loop._check_variable(scalar_symbol) is None
def create(variable, start, stop, step, children): '''Create a NemoLoop instance given valid instances of a variable, start, stop and step nodes, and a list of child nodes for the loop body. :param variable: the PSyIR node containing the variable \ of the loop iterator. :type variable: :py:class:`psyclone.psyir.symbols.DataSymbol` :param start: the PSyIR node determining the value for the \ start of the loop. :type start: :py:class:`psyclone.psyir.nodes.Node` :param end: the PSyIR node determining the value for the end \ of the loop. :type end: :py:class:`psyclone.psyir.nodes.Node` :param step: the PSyIR node determining the value for the loop \ step. :type step: :py:class:`psyclone.psyir.nodes.Node` :param children: a list of PSyIR nodes contained in the \ loop. :type children: list of :py:class:`psyclone.psyir.nodes.Node` :returns: a NemoLoop instance. :rtype: :py:class:`psyclone.nemo.NemoLoop` :raises GenerationError: if the arguments to the create method \ are not of the expected type. ''' Loop._check_variable(variable) if not isinstance(children, list): raise GenerationError( "children argument in create method of NemoLoop class " "should be a list but found '{0}'." "".format(type(children).__name__)) # Create the loop loop = NemoLoop(variable=variable) schedule = Schedule(parent=loop, children=children) loop.children = [start, stop, step, schedule] for child in children: child.parent = schedule start.parent = loop stop.parent = loop step.parent = loop # Indicate the type of loop loop_type_mapping = Config.get().api_conf("nemo") \ .get_loop_type_mapping() loop.loop_type = loop_type_mapping.get(variable.name, "unknown") return loop