Software architecture forms a bridge between requirements and code. In this paper, by defining port operations, we use port activities to describe component-based software architectures. We can get the following benefits: 1) The representation of an architecture with the proposed formulism is simpler comparing with those by other ADLs. 2) An architecture is a semigroup to the component operations: composing and nesting. This result may be used to check the consistence and adaptability of two architectures. 3) The port expressions can be easily mapped to Petri net, so that the port-based process can be checked through the analysis of the Petri nets.