(sections: List[Section], f, omit_levels=False)
| 120 | |
| 121 | |
| 122 | def generate_dot_file(sections: List[Section], f, omit_levels=False): |
| 123 | def is_data_memory_reader(property_name: str, section: Section) -> bool: |
| 124 | if property_name.endswith(".dmLevel"): |
| 125 | if property_name.lower().find("reader") != -1: |
| 126 | return True |
| 127 | elif property_name.lower().find("writer") == -1: |
| 128 | print("Warning: property {} of component {}:{} appears to reference a data memory level but could not be interpreted as reading or writing.".format(property_name, section.name, section.type)) |
| 129 | return False |
| 130 | def is_data_memory_writer(property_name: str, section: Section) -> bool: |
| 131 | if property_name.endswith(".dmLevel"): |
| 132 | if property_name.lower().find("writer") != -1: |
| 133 | return True |
| 134 | elif property_name.lower().find("reader") == -1: |
| 135 | print("Warning: property {} of component {}:{} appears to reference a data memory level but could not be interpreted as reading or writing.".format(property_name, section.name, section.type)) |
| 136 | return False |
| 137 | def get_levels(property_value: str) -> List[str]: |
| 138 | if isinstance(property_value, str): |
| 139 | return [property_value] |
| 140 | elif isinstance(property_value, list): |
| 141 | return property_value |
| 142 | |
| 143 | components = [(section.name, section.type) for section in sections.values() if section.type != "cComponentManager"] |
| 144 | levels = set() |
| 145 | reads = [] |
| 146 | writes = [] |
| 147 | |
| 148 | for section in sections.values(): |
| 149 | for property_name, property_value in section.properties.items(): |
| 150 | if is_data_memory_reader(property_name, section): |
| 151 | l = get_levels(property_value) |
| 152 | levels.update(l) |
| 153 | for level in l: |
| 154 | reads.append((section.name, level)) |
| 155 | elif is_data_memory_writer(property_name, section): |
| 156 | l = get_levels(property_value) |
| 157 | levels.update(l) |
| 158 | for level in l: |
| 159 | writes.append((section.name, level)) |
| 160 | |
| 161 | #for section in sections.values(): |
| 162 | # for property_name, property_value in section.properties.items(): |
| 163 | # if not is_data_memory_reader(property_name, section) and not is_data_memory_writer(property_name, section): |
| 164 | # if not levels.isdisjoint(get_levels(property_value)): |
| 165 | # print("Warning: property {} = {} of component {}:{} appears to reference a data memory level but was not recognized as such.".format(property_name, property_value, section.name, section.type)) |
| 166 | |
| 167 | f.write("digraph G {\n") |
| 168 | for (component_name, component_type) in components: |
| 169 | f.write(' "nodeComponent' + component_name + '" [\n') |
| 170 | f.write(' label = "' + component_name + "\\n" + component_type + '"\n') |
| 171 | f.write(' shape = "box"\n') |
| 172 | f.write(' fillcolor = "gray85"\n') |
| 173 | f.write(' style = "filled"\n') |
| 174 | f.write(" ];\n") |
| 175 | if not omit_levels: |
| 176 | for level in levels: |
| 177 | f.write(' "nodeLevel' + level + '" [\n') |
| 178 | f.write(' label = "' + level + '"\n') |
| 179 | f.write(' shape = "ellipse"\n') |
no test coverage detected