Analysis techniques for Petri nets