Esta es una pregunta muy abierta, y será difícil de responder correctamente en el formato SE. Sin embargo, acabo de hacer un ejercicio como este recientemente, así que voy a dejar algunos pensamientos.
Definitivamente tome un enfoque de arriba hacia abajo y de afuera hacia adentro. Asegúrese de saber qué se supone que debe hacer el núcleo y cómo se supone que se comportan las interfaces externas con bastante detalle. Piensa un poco en cómo te gustaría implementarla. Luego, observe la implementación del módulo de nivel superior y vea cómo se divide (con suerte :-) en submódulos funcionales que tienen sentido.
Continúe, tome notas, dibuje diagramas de bloques, y sí, indique los diagramas donde corresponda, sobre la marcha. Al mirar las interfaces entre los submódulos, es probable que haya poca documentación, por lo que tendrá que aplicar ingeniería inversa a muchos de los detalles de las implementaciones dentro de los submódulos. Con suerte, habrá patrones consistentes que se utilizarán en varios lugares.
Un simulador puede ser invaluable para separar detalles, lo cual es otra razón por la que debe tener un buen manejo de las interfaces externas. Esto le permite escribir un banco de pruebas significativo para ejercitar el módulo (asumiendo que uno no existe).