def test_variables_access_info(): '''Test the implementation of VariablesAccessInfo, a class that manages a list of variables, each with a list of accesses. ''' var_accesses = VariablesAccessInfo() node1 = Node() var_accesses.add_access("read", AccessType.READ, node1) node2 = Node() var_accesses.add_access("written", AccessType.WRITE, node2) assert str(var_accesses) == "read: READ, written: WRITE" var_accesses.next_location() node = Node() var_accesses.add_access("written", AccessType.WRITE, node) var_accesses.next_location() var_accesses.add_access("read_written", AccessType.WRITE, node) var_accesses.add_access("read_written", AccessType.READ, node) assert str(var_accesses) == "read: READ, read_written: READ+WRITE, "\ "written: WRITE" assert set(var_accesses.all_vars) == set( ["read", "written", "read_written"]) all_accesses = var_accesses["read"].all_accesses assert all_accesses[0].node == node1 written_accesses = var_accesses["written"].all_accesses assert written_accesses[0].location == 0 assert written_accesses[1].location == 1 # Check that the location pointer is pointing to the next statement: assert var_accesses.location == 2 # Create a new instance var_accesses2 = VariablesAccessInfo() var_accesses2.add_access("new_var", AccessType.READ, node) var_accesses2.add_access("written", AccessType.READ, node) # Now merge the new instance with the previous instance: var_accesses.merge(var_accesses2) assert str(var_accesses) == "new_var: READ, read: READ, " \ "read_written: READ+WRITE, written: READ+WRITE" with pytest.raises(KeyError): _ = var_accesses["does_not_exist"] with pytest.raises(KeyError): var_accesses.is_read("does_not_exist") with pytest.raises(KeyError): var_accesses.is_written("does_not_exist") assert "READWRITE" not in str(var_accesses) var_accesses.add_access("readwrite", AccessType.READWRITE, node) assert "READWRITE" in str(var_accesses)
def test_assignment(parser): ''' Check that assignments set the right read/write accesses. ''' reader = FortranStringReader('''program test_prog a = b c(i,j) = d(i,j+1)+e+f(x,y) c(i) = c(i) + 1 d(i,j) = sqrt(e(i,j)) end program test_prog''') ast = parser(reader) psy = PSyFactory(API).create(ast) schedule = psy.invokes.get("test_prog").schedule # Simple scalar assignment: a = b scalar_assignment = schedule.children[0] assert isinstance(scalar_assignment, Assignment) var_accesses = VariablesAccessInfo() scalar_assignment.reference_accesses(var_accesses) # Test some test functions explicitly: assert var_accesses.is_written("a") assert not var_accesses.is_read("a") assert not var_accesses.is_written("b") assert var_accesses.is_read("b") # Array element assignment: c(i,j) = d(i,j+1)+e+f(x,y) array_assignment = schedule.children[1] assert isinstance(array_assignment, Assignment) var_accesses = VariablesAccessInfo() array_assignment.reference_accesses(var_accesses) assert str(var_accesses) == "c: WRITE, d: READ, e: READ, f: READ, "\ "i: READ, j: READ, x: READ, y: READ" # Increment operation: c(i) = c(i)+1 increment_access = schedule.children[2] assert isinstance(increment_access, Assignment) var_accesses = VariablesAccessInfo() increment_access.reference_accesses(var_accesses) assert str(var_accesses) == "c: READ+WRITE, i: READ" # Using an intrinsic: sqrt_access = schedule.children[3] assert isinstance(sqrt_access, Assignment) var_accesses = VariablesAccessInfo() sqrt_access.reference_accesses(var_accesses) assert str(var_accesses) == "d: WRITE, e: READ, i: READ, j: READ"