Formal Methods for Software Architectures