code: def _wf_to_dict(wf, records):
      
      inputs, outputs, records = _get_wf_inout(wf, records)
      out = {"name": _id_to_name(_clean_id(wf.tool["id"])), "inputs": inputs,
             "outputs": outputs, "steps": [], "subworkflows": [],
             "requirements": []}
      for step in wf.steps:
          is_subworkflow = isinstance(step.embedded_tool, cwltool.workflow.Workflow)
          inputs, outputs, remapped, prescatter = _get_step_inout(step)
          inputs, scatter = _organize_step_scatter(step, inputs, remapped)
          if is_subworkflow:
              wf_def, records = _wf_to_dict(step.embedded_tool, records)
              out["subworkflows"].append({"id": "%s.%s" % (wf_def["name"], wf_def["name"]), "definition": wf_def,
                                          "inputs": inputs, "outputs": outputs, "scatter": scatter,
                                          "prescatter": prescatter})
          else:
              task_def, records = _tool_to_dict(step.embedded_tool, records, remapped)
              out["steps"].append({"task_id": task_def["name"], "task_definition": task_def,
                                   "inputs": inputs, "outputs": outputs, "scatter": scatter,
                                   "prescatter": prescatter})
      return out, records
docs: Parse a workflow into cwl2wdl style dictionaries for base and sub-workflows.