Reasoning about systolic algorithms