在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 915|回复: 3

[求助] 求助

[复制链接]
发表于 2024-2-21 18:54:08 | 显示全部楼层 |阅读模式
30资产
需要一个使用c语言或者shell脚本,读入一个cdl文件,然后将里面的所有block名字输出到一个文件中,一行两个block名字,两个名字间用空格分隔开。

发表于 2024-2-21 20:32:10 | 显示全部楼层
GPT生成,未编译过。
/-------------------------------------------c--------------------------------------------------------------/
使用C语言来实现读取CDL文件并将其中的所有block名字输出到一个文件中,一行两个block名字,两个名字间用空格分隔开。

以下是一个基本的示例代码:

```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_LINE_LENGTH 256

int main() {
    char input_file[] = "input.cdl";  // 输入CDL文件路径
    char output_file[] = "output.txt";  // 输出文件路径
   
    FILE *input, *output;
    char line[MAX_LINE_LENGTH];
   
    // 打开输入文件和输出文件
    input = fopen(input_file, "r");
    output = fopen(output_file, "w");
   
    if (input == NULL || output == NULL) {
        printf("无法打开输入或输出文件\n");
        return 1;
    }
   
    while (fgets(line, MAX_LINE_LENGTH, input)) {
        // 查找包含"block"关键字的行,并提取block名字
        if (strstr(line, "block")) {
            char *token;
            token = strtok(line, " ");
            
            while (token != NULL) {
                if (strstr(token, ";")) {  // 提取带有";"的部分
                    strtok(token, ";");
                    fprintf(output, "%s ", token);
                }

                token = strtok(NULL, " ");
            }
            
            // 如果已经有两个block名字写入该行,则换行继续下一行
            long pos = ftell(output);
            fseek(output ,pos-1 ,SEEK_SET);
            
                        int count=0;
                        char c=getc(output);
                       
                        while(c!='\n'&&count<2)
                        {
                                if(c==' ')
                                        count++;
                                c=getc(output);       
                        }
                       
                        if(count==2)
                                fprintf(output,"\n");
        }
        
        memset(line,'\0',MAX_LINE_LENGTH);               
   }       
   
   fclose(input);
   fclose(output);

   return 0;       
}
```

将上述代码保存为一个C源码文件(例如`extract_blocks.c`),然后使用合适的编译器(如gcc)进行编译并运行:

```shell
$ gcc extract_blocks.c -o extract_blocks
$ ./extract_blocks
```

注意替换`input.cdl`为实际的CDL文件路径,并根据需要指定输出文件路径。执行完毕后,输出文件将包含CDL文件中的所有block名字,每行有两个名字,两个名字间用空格分隔开。
/-------------------------------------------python-------------------------------------------------------/
使用Python来实现读取CDL文件并将其中的所有block名字输出到一个文件中,一行两个block名字,两个名字间用空格分隔开。

你可以使用以下的Python脚本代码:

```python
input_file = "input.cdl"  # 输入CDL文件路径
output_file = "output.txt"  # 输出文件路径

# 打开输入文件和输出文件
with open(input_file, 'r') as file, open(output_file, 'w') as output:
    for line in file:
        # 查找包含"block"关键字的行,并提取block名字
        if "block" in line:
            block_names = line.split(" ")[-1].strip().split(";")[0]
            
            # 将两个block名字写入输出文件,用空格分隔开
            output.write(block_names + " ")
            
            # 如果已经有两个block名字写入该行,则换行继续下一行
            if len(output.readlines()[-1].split(" ")) == 2:
                output.write("\n")
```

将上述代码保存为一个Python脚本(例如`extract_blocks.py`),然后在终端中运行该脚本即可:

```shell
$ python extract_blocks.py
```

注意替换`input.cdl`为实际的CDL文件路径,并根据需要指定输出文件路径。执行完毕后,输出文件将包含CDL文件中的所有block名字,每行有两个名字,两个名字间用空格分隔开。


/-------------------------------------------------SHELL脚本----------------------------------------/
使用Shell脚本来实现读取CDL文件并将其中的所有block名字输出到一个文件中,一行两个block名字,两个名字间用空格分隔开。

你可以使用以下的Shell脚本代码:

```shell
#!/bin/bash

input_file="input.cdl"  # 输入CDL文件路径
output_file="output.txt"  # 输出文件路径

# 清空输出文件内容
> "$output_file"

# 逐行读取CDL文件
while IFS= read -r line; do
  # 查找包含"block"关键字的行,并提取block名字
  if [[ $line == *"block"* ]]; then
    block_names=$(echo "$line" | grep -oP '(?<=block\s)[^;\s]+')
   
    # 将两个block名字写入输出文件,用空格分隔开
    echo "$block_names" >> "$output_file"
  fi
  
done < "$input_file"
```

将上述代码保存为一个Shell脚本文件(例如`extract_blocks.sh`),并确保给予执行权限。然后,在终端中运行该脚本即可:

```shell
$ ./extract_blocks.sh
```

注意替换`input.cdl`为实际的CDL文件路径,并根据需要指定输出文件路径。执行完毕后,输出文件将包含CDL文件中的所有block名字,每行有两个名字,两个名字间用空格分隔开。
发表于 2024-2-22 09:19:08 | 显示全部楼层
你的所有block的定义是什么?如果是cdl里面所有的subckt,那就连所有的logic gate都会列出来。如果只是top blocks,从cdl文本里找好像有点复杂,直接用virtuoso的tree提取还容易一点。
 楼主| 发表于 2024-2-22 17:40:34 | 显示全部楼层


realgb 发表于 2024-2-22 09:19
你的所有block的定义是什么?如果是cdl里面所有的subckt,那就连所有的logic gate都会列出来。如果只是top  ...


就是top block的名字,底层的不需要。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-28 07:47 , Processed in 0.014699 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表